mirror of
https://github.com/tobspr/shapez.io.git
synced 2025-06-13 13:04:03 +00:00
Update to 1.5.1
This commit is contained in:
commit
d3542f826f
@ -5,7 +5,7 @@
|
||||
This is the source code for shapez.io, an open source base building game inspired by Factorio.
|
||||
Your goal is to produce shapes by cutting, rotating, merging and painting parts of shapes.
|
||||
|
||||
- [Steam Page](https://steam.shapez.io)
|
||||
- [Steam Page](https://get.shapez.io/ghr)
|
||||
- [Official Discord](https://discord.com/invite/HN7EVzV) <- _Highly recommended to join!_
|
||||
- [Trello Board & Roadmap](https://trello.com/b/ISQncpJP/shapezio)
|
||||
- [itch.io Page](https://tobspr.itch.io/shapezio)
|
||||
|
@ -316,7 +316,7 @@ async function writeFileSafe(filename, contents) {
|
||||
}
|
||||
|
||||
ipcMain.handle("fs-job", async (event, job) => {
|
||||
const filenameSafe = job.filename.replace(/[^a-z\.\-_0-9]/i, "_");
|
||||
const filenameSafe = job.filename.replace(/[^a-z\.\-_0-9]/gi, "_");
|
||||
const fname = path.join(storePath, filenameSafe);
|
||||
switch (job.type) {
|
||||
case "read": {
|
||||
@ -373,7 +373,7 @@ try {
|
||||
mods = loadMods();
|
||||
console.log("Loaded", mods.length, "mods");
|
||||
} catch (ex) {
|
||||
console.error("Failed ot load mods");
|
||||
console.error("Failed to load mods");
|
||||
dialog.showErrorBox("Failed to load mods:", ex);
|
||||
}
|
||||
|
||||
@ -383,6 +383,7 @@ ipcMain.handle("get-mods", async () => {
|
||||
|
||||
steam.init(isDev);
|
||||
|
||||
if (mods) {
|
||||
// Only allow achievements and puzzle DLC if no mods are loaded
|
||||
if (mods.length === 0) {
|
||||
steam.listen();
|
||||
}
|
||||
|
40
gulp/mod.js
40
gulp/mod.js
@ -1,3 +1,39 @@
|
||||
module.exports = function (source, map) {
|
||||
return source + `\nexport let $s=(n,v)=>eval(n+"=v")`;
|
||||
const oneExport = exp => {
|
||||
return `${exp}=v`; // No checks needed
|
||||
};
|
||||
|
||||
const twoExports = (exp1, exp2) => {
|
||||
return `n=="${exp1}"?${exp1}=v:${exp2}=v`;
|
||||
};
|
||||
|
||||
const multiExports = exps => {
|
||||
exps = exps.map(exp => `case "${exp}":${exp}=v;break;`);
|
||||
|
||||
return `switch(n){${exps.toString().replaceAll(";,", ";")} }`;
|
||||
};
|
||||
|
||||
const defineFnBody = source => {
|
||||
const regex = /export (?:let|class) (?<name>\w+)/g;
|
||||
let names = [...source.matchAll(regex)].map(n => n.groups.name);
|
||||
switch (names.length) {
|
||||
case 0:
|
||||
return false;
|
||||
case 1:
|
||||
return oneExport(names[0]);
|
||||
case 2:
|
||||
return twoExports(names[0], names[1]);
|
||||
default:
|
||||
return multiExports(names);
|
||||
}
|
||||
};
|
||||
/**
|
||||
*
|
||||
* @param {string} source
|
||||
* @param {*} map
|
||||
* @returns
|
||||
*/
|
||||
module.exports = function (source, map) {
|
||||
const body = defineFnBody(source);
|
||||
if (!body) return source;
|
||||
return source + `\nexport const __$S__=(n,v)=>{${body}}`;
|
||||
};
|
||||
|
@ -97,6 +97,7 @@ module.exports = ({ watch = false, standalone = false, chineseVersion = false, w
|
||||
loader: path.resolve(__dirname, "mod.js"),
|
||||
},
|
||||
],
|
||||
],
|
||||
},
|
||||
{
|
||||
test: /\.worker\.js$/,
|
||||
|
@ -131,6 +131,7 @@ module.exports = ({
|
||||
warnings: true,
|
||||
},
|
||||
mangle: {
|
||||
reserved: ["__$S__"],
|
||||
eval: true,
|
||||
keep_classnames: !minifyNames,
|
||||
keep_fnames: !minifyNames,
|
||||
@ -210,6 +211,9 @@ module.exports = ({
|
||||
test: /\.js$/,
|
||||
use: [
|
||||
// "thread-loader",
|
||||
{
|
||||
loader: path.resolve(__dirname, "mod.js"),
|
||||
},
|
||||
{
|
||||
loader: "babel-loader?cacheDirectory",
|
||||
options: {
|
||||
|
@ -7,8 +7,6 @@ Currently there are two options to develop mods for shapez.io:
|
||||
1. Writing single file mods, which doesn't require any additional tools and can be loaded directly in the game
|
||||
2. Using the [create-shapezio-mod](https://www.npmjs.com/package/create-shapezio-mod) package. This package is still in development but allows you to pack multiple files and images into a single mod file, so you don't have to base64 encode your images etc.
|
||||
|
||||
Since the `create-shapezio-mod` package is still in development, the current recommended way is to write single file mods, which I'll explain now.
|
||||
|
||||
## Mod Developer Discord
|
||||
|
||||
A great place to get help with mod development is the official [shapez.io modloader discord](https://discord.gg/xq5v8uyMue).
|
||||
@ -40,7 +38,7 @@ To get into shapez.io modding, I highly recommend checking out all of the exampl
|
||||
| [mod_settings.js](mod_settings.js) | Shows a dialog counting how often the mod has been launched | Reading and storing mod settings |
|
||||
| [storing_data_in_savegame.js](storing_data_in_savegame.js) | Shows how to store custom (structured) data in the savegame | Storing custom data in savegame |
|
||||
| [modify_existing_building.js](modify_existing_building.js) | Makes the rotator building always unlocked and adds a new statistic to the building panel | Modifying a builtin building, replacing builtin methods |
|
||||
| [modify_ui.js](modify_ui.js) | Shows how to add custom IU elements to builtin game states (the Main Menu in this case) | Extending builtin UI states, Adding CSS |
|
||||
| [modify_ui.js](modify_ui.js) | Shows how to add custom UI elements to builtin game states (the Main Menu in this case) | Extending builtin UI states, Adding CSS |
|
||||
| [pasting.js](pasting.js) | Shows a dialog when pasting text in the game | Listening to paste events |
|
||||
| [sandbox.js](sandbox.js) | Makes blueprints free and always unlocked | Overriding builtin methods |
|
||||
|
||||
|
@ -120,19 +120,21 @@ class Mod extends shapez.Mod {
|
||||
this.modInterface.registerSprite("sprites/fluids/water.png", RESOURCES["water.png"]);
|
||||
|
||||
// Make the item spawn on the map
|
||||
this.modInterface.runAfterMethod(shapez.MapChunk, "generatePatches", function ({
|
||||
rng,
|
||||
chunkCenter,
|
||||
distanceToOriginInChunks,
|
||||
}) {
|
||||
// Generate a simple patch
|
||||
// ALWAYS use rng and NEVER use Math.random() otherwise the map will look different
|
||||
// every time you resume the game
|
||||
if (rng.next() > 0.8) {
|
||||
const fluidType = rng.choice(Array.from(Object.keys(enumFluidType)));
|
||||
this.internalGeneratePatch(rng, 4, FLUID_ITEM_SINGLETONS[fluidType]);
|
||||
this.modInterface.runAfterMethod(
|
||||
shapez.MapChunk,
|
||||
"generatePatches",
|
||||
function ({ rng, chunkCenter, distanceToOriginInChunks }) {
|
||||
// Generate a simple patch
|
||||
// ALWAYS use rng and NEVER use Math.random() otherwise the map will look different
|
||||
// every time you resume the game
|
||||
if (rng.next() > 0.8) {
|
||||
const fluidType = rng.choice(Array.from(Object.keys(enumFluidType)));
|
||||
this.internalGeneratePatch(rng, 4, FLUID_ITEM_SINGLETONS[fluidType]);
|
||||
}
|
||||
}
|
||||
});
|
||||
);
|
||||
|
||||
this.modInterface.registerItem(FluidItem, itemData => FLUID_ITEM_SINGLETONS[itemData]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -15,7 +15,7 @@ export class BaseItem extends BasicSerializableObject {
|
||||
return "base_item";
|
||||
}
|
||||
|
||||
/** @returns {object} */
|
||||
/** @returns {import("../savegame/serialization").Schema} */
|
||||
static getSchema() {
|
||||
return {};
|
||||
}
|
||||
|
@ -2,8 +2,6 @@ import { types } from "../../savegame/serialization";
|
||||
import { BaseItem } from "../base_item";
|
||||
import { Component } from "../component";
|
||||
import { typeItemSingleton } from "../item_resolver";
|
||||
import { ColorItem } from "../items/color_item";
|
||||
import { ShapeItem } from "../items/shape_item";
|
||||
|
||||
export class StorageComponent extends Component {
|
||||
static getId() {
|
||||
|
@ -15,6 +15,11 @@ import trim from "trim";
|
||||
import { enumColors } from "../../colors";
|
||||
import { ShapeDefinition } from "../../shape_definition";
|
||||
|
||||
/** @type {{
|
||||
* [x: string]: (entity: Entity) => BaseItem
|
||||
* }} */
|
||||
export const MODS_ADDITIONAL_CONSTANT_SIGNAL_RESOLVER = {};
|
||||
|
||||
export class HUDConstantSignalEdit extends BaseHUDPart {
|
||||
initialize() {
|
||||
this.root.camera.downPreHandler.add(this.downPreHandler, this);
|
||||
@ -190,6 +195,10 @@ export class HUDConstantSignalEdit extends BaseHUDPart {
|
||||
code = trim(code);
|
||||
const codeLower = code.toLowerCase();
|
||||
|
||||
if (MODS_ADDITIONAL_CONSTANT_SIGNAL_RESOLVER[codeLower]) {
|
||||
return MODS_ADDITIONAL_CONSTANT_SIGNAL_RESOLVER[codeLower].apply(this, [entity]);
|
||||
}
|
||||
|
||||
if (enumColors[codeLower]) {
|
||||
return COLOR_ITEM_SINGLETONS[codeLower];
|
||||
}
|
||||
|
@ -4,6 +4,8 @@ import { BooleanItem, BOOL_TRUE_SINGLETON, BOOL_FALSE_SINGLETON } from "./items/
|
||||
import { ShapeItem } from "./items/shape_item";
|
||||
import { ColorItem, COLOR_ITEM_SINGLETONS } from "./items/color_item";
|
||||
|
||||
export const MODS_ADDITIONAL_ITEMS = {};
|
||||
|
||||
/**
|
||||
* Resolves items so we share instances
|
||||
* @param {import("../savegame/savegame_serializer").GameRoot} root
|
||||
@ -13,6 +15,10 @@ export function itemResolverSingleton(root, data) {
|
||||
const itemType = data.$;
|
||||
const itemData = data.data;
|
||||
|
||||
if (MODS_ADDITIONAL_ITEMS[itemType]) {
|
||||
return MODS_ADDITIONAL_ITEMS[itemType](itemData);
|
||||
}
|
||||
|
||||
switch (itemType) {
|
||||
case BooleanItem.getId(): {
|
||||
return itemData ? BOOL_TRUE_SINGLETON : BOOL_FALSE_SINGLETON;
|
||||
|
@ -7,6 +7,15 @@ import { isTrueItem } from "../items/boolean_item";
|
||||
import { ColorItem, COLOR_ITEM_SINGLETONS } from "../items/color_item";
|
||||
import { MapChunkView } from "../map_chunk_view";
|
||||
|
||||
/** @type {{
|
||||
* [x: string]: (item: BaseItem) => BaseItem
|
||||
* }} */
|
||||
export const MODS_ADDITIONAL_DISPLAY_ITEM_RESOLVER = {};
|
||||
|
||||
/** @type {{
|
||||
* [x: string]: (parameters: import("../../core/draw_parameters").DrawParameters, entity: import("../entity").Entity, item: BaseItem) => BaseItem
|
||||
* }} */
|
||||
export const MODS_ADDITIONAL_DISPLAY_ITEM_DRAW = {};
|
||||
export class DisplaySystem extends GameSystem {
|
||||
constructor(root) {
|
||||
super(root);
|
||||
@ -32,6 +41,10 @@ export class DisplaySystem extends GameSystem {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (MODS_ADDITIONAL_DISPLAY_ITEM_RESOLVER[value.getItemType()]) {
|
||||
return MODS_ADDITIONAL_DISPLAY_ITEM_RESOLVER[value.getItemType()].apply(this, [value]);
|
||||
}
|
||||
|
||||
switch (value.getItemType()) {
|
||||
case "boolean": {
|
||||
return isTrueItem(value) ? COLOR_ITEM_SINGLETONS[enumColors.white] : null;
|
||||
@ -74,6 +87,14 @@ export class DisplaySystem extends GameSystem {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (MODS_ADDITIONAL_DISPLAY_ITEM_DRAW[value.getItemType()]) {
|
||||
return MODS_ADDITIONAL_DISPLAY_ITEM_DRAW[value.getItemType()].apply(this, [
|
||||
parameters,
|
||||
entity,
|
||||
value,
|
||||
]);
|
||||
}
|
||||
|
||||
const origin = entity.components.StaticMapEntity.origin;
|
||||
if (value.getItemType() === "color") {
|
||||
this.displaySprites[/** @type {ColorItem} */ (value).color].drawCachedCentered(
|
||||
|
@ -17,7 +17,7 @@ import { Loader } from "../core/loader";
|
||||
import { LANGUAGES } from "../languages";
|
||||
import { matchDataRecursive, T } from "../translations";
|
||||
import { gBuildingVariants, registerBuildingVariant } from "../game/building_codes";
|
||||
import { gComponentRegistry, gMetaBuildingRegistry } from "../core/global_registries";
|
||||
import { gComponentRegistry, gItemRegistry, gMetaBuildingRegistry } from "../core/global_registries";
|
||||
import { MODS_ADDITIONAL_SHAPE_MAP_WEIGHTS } from "../game/map_chunk";
|
||||
import { MODS_ADDITIONAL_SYSTEMS } from "../game/game_system_manager";
|
||||
import { MOD_CHUNK_DRAW_HOOKS } from "../game/map_chunk_view";
|
||||
@ -28,6 +28,8 @@ import { ModMetaBuilding } from "./mod_meta_building";
|
||||
import { BaseHUDPart } from "../game/hud/base_hud_part";
|
||||
import { Vector } from "../core/vector";
|
||||
import { GameRoot } from "../game/root";
|
||||
import { BaseItem } from "../game/base_item";
|
||||
import { MODS_ADDITIONAL_ITEMS } from "../game/item_resolver";
|
||||
|
||||
/**
|
||||
* @typedef {{new(...args: any[]): any, prototype: any}} constructable
|
||||
@ -190,6 +192,15 @@ export class ModInterface {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {typeof BaseItem} item
|
||||
* @param {(itemData: any) => BaseItem} resolver
|
||||
*/
|
||||
registerItem(item, resolver) {
|
||||
gItemRegistry.register(item);
|
||||
MODS_ADDITIONAL_ITEMS[item.getId()] = resolver;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param {typeof Component} component
|
||||
@ -583,8 +594,8 @@ export class ModInterface {
|
||||
* @param {string=} payload.name
|
||||
* @param {string=} payload.description
|
||||
* @param {Vector=} payload.dimensions
|
||||
* @param {(root: GameRoot) => [string, string][]} payload.additionalStatistics
|
||||
* @param {(root: GameRoot) => boolean[]} payload.isUnlocked
|
||||
* @param {(root: GameRoot) => [string, string][]=} payload.additionalStatistics
|
||||
* @param {(root: GameRoot) => boolean[]=} payload.isUnlocked
|
||||
*/
|
||||
addVariantToExistingBuilding(metaClass, variant, payload) {
|
||||
if (!payload.rotationVariants) {
|
||||
@ -660,9 +671,14 @@ export class ModInterface {
|
||||
}));
|
||||
}
|
||||
|
||||
// Register our variant finally
|
||||
// Register our variant finally, with rotation variants
|
||||
payload.rotationVariants.forEach(rotationVariant =>
|
||||
shapez.registerBuildingVariant(internalId, metaClass, variant, rotationVariant)
|
||||
shapez.registerBuildingVariant(
|
||||
rotationVariant ? internalId + "-" + rotationVariant : internalId,
|
||||
metaClass,
|
||||
variant,
|
||||
rotationVariant
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -112,7 +112,7 @@ export class ModLoader {
|
||||
// @ts-ignore
|
||||
const module = modules(key);
|
||||
for (const member in module) {
|
||||
if (member === "default" || member === "$s") {
|
||||
if (member === "default" || member === "__$S__") {
|
||||
// Setter
|
||||
continue;
|
||||
}
|
||||
@ -125,7 +125,7 @@ export class ModLoader {
|
||||
return module[member];
|
||||
},
|
||||
set(v) {
|
||||
module["$s"](member, v);
|
||||
module.__$S__(member, v);
|
||||
},
|
||||
});
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ export class BasicSerializableObject {
|
||||
return schema;
|
||||
}
|
||||
|
||||
/** @returns {object} */
|
||||
/** @returns {object | string | number} */
|
||||
serialize() {
|
||||
return serializeSchema(
|
||||
this,
|
||||
|
@ -77,9 +77,9 @@ mainMenu:
|
||||
puzzleDlcWishlist: Přidejte si nyní na seznam přání!
|
||||
puzzleDlcViewNow: Zobrazit DLC
|
||||
mods:
|
||||
title: Active Mods
|
||||
warningPuzzleDLC: Playing the Puzzle DLC is not possible with mods. Please
|
||||
disable all mods to play the DLC.
|
||||
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.
|
||||
dialogs:
|
||||
buttons:
|
||||
ok: OK
|
||||
@ -257,12 +257,12 @@ dialogs:
|
||||
title: Smazat puzzle?
|
||||
desc: Jste si jisti, že chcete smazat '<title>'? Tato akce je nevratná!
|
||||
modsDifference:
|
||||
title: Mod Warning
|
||||
desc: The currently installed mods differ from the mods the savegame was created
|
||||
with. This might cause the savegame to break or not load at all. Are
|
||||
you sure you want to continue?
|
||||
missingMods: Missing Mods
|
||||
newMods: Newly installed Mods
|
||||
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?
|
||||
missingMods: Chybějící módy
|
||||
newMods: Nově nainstalované módy
|
||||
ingame:
|
||||
keybindingsOverlay:
|
||||
moveMap: Posun mapy
|
||||
@ -468,7 +468,7 @@ ingame:
|
||||
titleRatingDesc: Vaše hodnocení nám pomůže podat vám v budoucnu lepší návrhy
|
||||
continueBtn: Hrát dál
|
||||
menuBtn: Menu
|
||||
nextPuzzle: Next Puzzle
|
||||
nextPuzzle: Další puzzle
|
||||
puzzleMetadata:
|
||||
author: Autor
|
||||
shortKey: Krátký klíč
|
||||
@ -1007,12 +1007,12 @@ settings:
|
||||
title: Velikost zdrojů na mapě
|
||||
description: Určuje velikost ikon tvarů na náhledu mapy (při oddálení).
|
||||
shapeTooltipAlwaysOn:
|
||||
title: Shape Tooltip - Show Always
|
||||
description: Whether to always show the shape tooltip when hovering buildings,
|
||||
instead of having to hold 'ALT'.
|
||||
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“.
|
||||
rangeSliderPercentage: <amount> %
|
||||
tickrateHz: <amount> Hz
|
||||
newBadge: New!
|
||||
newBadge: Nové!
|
||||
keybindings:
|
||||
title: Klávesové zkratky
|
||||
hint: "Tip: Nezapomeňte používat CTRL, SHIFT a ALT! Díky nim můžete měnit způsob
|
||||
@ -1026,7 +1026,7 @@ keybindings:
|
||||
massSelect: Hromadný výběr
|
||||
buildings: Zkratky pro stavbu
|
||||
placementModifiers: Modifikátory umístění
|
||||
mods: Provided by Mods
|
||||
mods: Poskytnuto z módů
|
||||
mappings:
|
||||
confirm: Potvrdit
|
||||
back: Zpět
|
||||
@ -1095,7 +1095,7 @@ keybindings:
|
||||
goal_acceptor: Přijemce cílů
|
||||
block: Blok
|
||||
massSelectClear: Vymazat pásy
|
||||
showShapeTooltip: Show shape output tooltip
|
||||
showShapeTooltip: Zobrazit popisek výstupu tvaru
|
||||
about:
|
||||
title: O hře
|
||||
body: >-
|
||||
@ -1233,24 +1233,24 @@ puzzleMenu:
|
||||
easy: Lehká
|
||||
medium: Střední
|
||||
hard: Těžká
|
||||
unknown: Unrated
|
||||
unknown: Nehodnoceno
|
||||
dlcHint: Již jste toto DLC zakoupili? Ujistěte se, že je aktivováno kliknutím
|
||||
pravého tlačítka na shapez.io ve své knihovně, vybráním Vlastnosti >
|
||||
DLC.
|
||||
search:
|
||||
action: Search
|
||||
placeholder: Enter a puzzle or author name
|
||||
includeCompleted: Include Completed
|
||||
action: Hledat
|
||||
placeholder: Vložte název puzzlu nebo jméno autora
|
||||
includeCompleted: Včetně dokončených
|
||||
difficulties:
|
||||
any: Any Difficulty
|
||||
easy: Easy
|
||||
medium: Medium
|
||||
hard: Hard
|
||||
any: Jakákoli obtížnost
|
||||
easy: Lehká
|
||||
medium: Střední
|
||||
hard: Těžká
|
||||
durations:
|
||||
any: Any Duration
|
||||
short: Short (< 2 min)
|
||||
medium: Normal
|
||||
long: Long (> 10 min)
|
||||
any: Jakákoli doba trvání
|
||||
short: Krátká (< 2 min)
|
||||
medium: Normální
|
||||
long: Dlouhá (> 10 min)
|
||||
backendErrors:
|
||||
ratelimit: Provádíte své akce příliš často. Počkejte prosím.
|
||||
invalid-api-key: Komunikace s back-endem se nezdařila, prosím zkuste
|
||||
@ -1278,19 +1278,19 @@ backendErrors:
|
||||
přesto chcete odstranit, kontaktujte nás prosím na support@shapez.io!
|
||||
no-permission: K provedení této akce nemáte oprávnění.
|
||||
mods:
|
||||
title: Mods
|
||||
author: Author
|
||||
version: Version
|
||||
modWebsite: Website
|
||||
openFolder: Open Mods Folder
|
||||
folderOnlyStandalone: Opening the mod folder is only possible when running the standalone.
|
||||
browseMods: Browse Mods
|
||||
modsInfo: To install and manage mods, copy them to the mods folder within the
|
||||
game directory. You can also use the 'Open Mods Folder' button on the
|
||||
top right.
|
||||
noModSupport: You need the standalone version on Steam to install mods.
|
||||
title: Módy
|
||||
author: Autor
|
||||
version: Verze
|
||||
modWebsite: Webová stránka
|
||||
openFolder: Otevřít složku s módy
|
||||
folderOnlyStandalone: Otevření složky s módy je možné pouze v samostatné verzi hry.
|
||||
browseMods: Procházet módy
|
||||
modsInfo: Chcete-li nainstalovat a spravovat módy, zkopírujte je do složky mods
|
||||
v adresáři hry. Můžete také použít tlačítko 'Otevřít složku s módy'
|
||||
vpravo nahoře.
|
||||
noModSupport: K instalaci módů potřebujete samostatnou verzi hry na Steamu.
|
||||
togglingComingSoon:
|
||||
title: Coming Soon
|
||||
description: Enabling or disabling mods is currently only possible by copying
|
||||
the mod file from or to the mods/ folder. However, being able to
|
||||
toggle them here is planned for a future update!
|
||||
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!
|
||||
|
@ -454,8 +454,9 @@ ingame:
|
||||
clearItems: Supprimer les objets
|
||||
share: Partager
|
||||
report: Signaler
|
||||
clearBuildings: Effacer les batiments
|
||||
resetPuzzle: Reset Puzzle
|
||||
clearBuildings: Effacer les Constructions
|
||||
resetPuzzle: Réinitialiser le Puzzle
|
||||
|
||||
puzzleEditorControls:
|
||||
title: Créateur de Puzzles
|
||||
instructions:
|
||||
@ -475,6 +476,7 @@ ingame:
|
||||
- 6. Une fois publié <strong>tous les batiments 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:"
|
||||
@ -485,7 +487,7 @@ ingame:
|
||||
nextPuzzle: Puzzle suivant
|
||||
puzzleMetadata:
|
||||
author: Auteur
|
||||
shortKey: Clée courte
|
||||
shortKey: Raccourci clavier
|
||||
rating: Niveau de difficulté
|
||||
averageDuration: Durée moyenne
|
||||
completionRate: Taux de réussite
|
||||
@ -1073,7 +1075,7 @@ settings:
|
||||
visible en dézoomant.
|
||||
shapeTooltipAlwaysOn:
|
||||
title: Info-bulle de forme - Toujours afficher
|
||||
description: Si activé une info-bule s'affiche quand vous survolez un batiment
|
||||
description: Si activé, une info-bule s'affiche quand vous survolez un batiment
|
||||
sinon il faut maintenir 'ALT'.
|
||||
tickrateHz: <amount> Hz
|
||||
newBadge: New!
|
||||
@ -1152,10 +1154,10 @@ keybindings:
|
||||
placementDisableAutoOrientation: Désactiver l’orientation automatique
|
||||
placeMultiple: Rester en mode placement
|
||||
placeInverse: Inverser l’orientation des convoyeurs
|
||||
rotateToUp: "Rotate: Point Up"
|
||||
rotateToDown: "Rotate: Point Down"
|
||||
rotateToRight: "Rotate: Point Right"
|
||||
rotateToLeft: "Rotate: Point Left"
|
||||
rotateToUp: "Rotation : pointer vers le haut"
|
||||
rotateToDown: "Rotation : pointer vers le bas"
|
||||
rotateToRight: "Rotation : pointer vers le droite"
|
||||
rotateToLeft: "Rotation : pointer vers le gauche"
|
||||
constant_producer: Producteur Constant
|
||||
goal_acceptor: Récepteur
|
||||
block: Bloc
|
||||
@ -1311,16 +1313,16 @@ puzzleMenu:
|
||||
un clic droit sur shapez.io dans votre bibliothèque, en sélectionnant
|
||||
Propriétés > DLC.
|
||||
search:
|
||||
action: Chercher
|
||||
action: Recherche
|
||||
placeholder: Entrez un puzzle ou un nom d'auteur
|
||||
includeCompleted: Inclure les puzzles terminés
|
||||
includeCompleted: Inclure terminé
|
||||
difficulties:
|
||||
any: Toutes difficultés
|
||||
any: Toute difficulté
|
||||
easy: Facile
|
||||
medium: Moyen
|
||||
hard: Difficile
|
||||
medium: Medium
|
||||
hard: Dificile
|
||||
durations:
|
||||
any: Toutes durées
|
||||
any: Toute durée
|
||||
short: Court (< 2 min)
|
||||
medium: Normal
|
||||
long: Long (> 10 min)
|
||||
@ -1353,18 +1355,17 @@ backendErrors:
|
||||
no-permission: Vous n'êtes pas autorisé à effectuer cette action.
|
||||
mods:
|
||||
title: Mods
|
||||
author: Author
|
||||
author: Auteur
|
||||
version: Version
|
||||
modWebsite: Website
|
||||
openFolder: Open Mods Folder
|
||||
folderOnlyStandalone: Opening the mod folder is only possible when running the standalone.
|
||||
browseMods: Browse Mods
|
||||
modsInfo: To install and manage mods, copy them to the mods folder within the
|
||||
game directory. You can also use the 'Open Mods Folder' button on the
|
||||
top right.
|
||||
noModSupport: You need the standalone version on Steam to install mods.
|
||||
modWebsite: Page web
|
||||
openFolder: Ouvrir le dossier des mods
|
||||
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.
|
||||
togglingComingSoon:
|
||||
title: Coming Soon
|
||||
description: Enabling or disabling mods is currently only possible by copying
|
||||
the mod file from or to the mods/ folder. However, being able to
|
||||
toggle them here is planned for a future update!
|
||||
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 !
|
||||
|
@ -81,9 +81,9 @@ mainMenu:
|
||||
puzzleDlcWishlist: Voeg nu toe aan je verlanglijst!
|
||||
puzzleDlcViewNow: Bekijk DLC
|
||||
mods:
|
||||
title: Active Mods
|
||||
warningPuzzleDLC: Playing the Puzzle DLC is not possible with mods. Please
|
||||
disable all mods to play the DLC.
|
||||
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.
|
||||
dialogs:
|
||||
buttons:
|
||||
ok: OK
|
||||
@ -270,12 +270,12 @@ dialogs:
|
||||
desc: Weet je zeker dat je '<title>' wilt verwijderen? Dit kan niet ongedaan
|
||||
gemaakt worden!
|
||||
modsDifference:
|
||||
title: Mod Warning
|
||||
title: Mod Waarschuwing
|
||||
desc: The currently installed mods differ from the mods the savegame was created
|
||||
with. This might cause the savegame to break or not load at all. Are
|
||||
you sure you want to continue?
|
||||
missingMods: Missing Mods
|
||||
newMods: Newly installed Mods
|
||||
missingMods: Missende Mods
|
||||
newMods: Nieuw geïnstalleerde Mods
|
||||
ingame:
|
||||
keybindingsOverlay:
|
||||
moveMap: Beweeg rond de wereld
|
||||
@ -1188,10 +1188,8 @@ 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!
|
||||
- Invest time to build repeatable designs - it's worth it!
|
||||
- Je kunt <b>ALT</b> ingedrukt houden om de richting van de geplaatste
|
||||
lopende banden om te keren.
|
||||
- You can hold <b>ALT</b> to invert the direction of placed belts.
|
||||
- Vormontginningen die verder van de HUB verwijderd zijn, zijn complexer.
|
||||
- Machines hebben een beperkte snelheid, verdeel ze voor maximale
|
||||
efficiëntie.
|
||||
@ -1214,7 +1212,6 @@ tips:
|
||||
mannen.
|
||||
- Maak een aparte blueprint fabriek. Ze zijn belangrijk voor modules.
|
||||
- Bekijk de kleurenmixer eens wat beter, en je vragen worden beantwoord.
|
||||
- Have a closer look at the color mixer, and your questions will be answered.
|
||||
- Use <b>CTRL</b> + Click to select an area.
|
||||
- Met het speldpictogram naast elke vorm in de upgradelijst zet deze vast op
|
||||
het scherm.
|
||||
@ -1234,7 +1231,6 @@ 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.
|
||||
- You can click a pinned shape on the left side to unpin it.
|
||||
puzzleMenu:
|
||||
play: Spelen
|
||||
edit: Bewerken
|
||||
@ -1280,21 +1276,21 @@ puzzleMenu:
|
||||
easy: Makkelijk
|
||||
medium: Medium
|
||||
hard: Moeilijk
|
||||
unknown: Unrated
|
||||
unknown: Onbeoordeeld
|
||||
search:
|
||||
action: Search
|
||||
placeholder: Enter a puzzle or author name
|
||||
includeCompleted: Include Completed
|
||||
action: Zoeken
|
||||
placeholder: Voer een puzzel- of auteursnaam in
|
||||
includeCompleted: Inclusief Voltooide
|
||||
difficulties:
|
||||
any: Any Difficulty
|
||||
easy: Easy
|
||||
any: Elke Moeilijkheidsgraad
|
||||
easy: Makkelijk
|
||||
medium: Medium
|
||||
hard: Hard
|
||||
hard: Moeilijk
|
||||
durations:
|
||||
any: Any Duration
|
||||
short: Short (< 2 min)
|
||||
medium: Normal
|
||||
long: Long (> 10 min)
|
||||
any: Elke Tijd
|
||||
short: Kort (< 2 min)
|
||||
medium: Normaal
|
||||
long: Lang (> 10 min)
|
||||
backendErrors:
|
||||
ratelimit: Je voert je handelingen te vaak uit. Wacht alstublieft even.
|
||||
invalid-api-key: Kan niet communiceren met de servers, probeer alstublieft het
|
||||
@ -1323,18 +1319,17 @@ backendErrors:
|
||||
no-permission: Je bent niet gemachtigd om deze actie uit te voeren.
|
||||
mods:
|
||||
title: Mods
|
||||
author: Author
|
||||
version: Version
|
||||
author: Auteur
|
||||
version: Versie
|
||||
modWebsite: Website
|
||||
openFolder: Open Mods Folder
|
||||
folderOnlyStandalone: Opening the mod folder is only possible when running the standalone.
|
||||
browseMods: Browse Mods
|
||||
modsInfo: To install and manage mods, copy them to the mods folder within the
|
||||
game directory. You can also use the 'Open Mods Folder' button on the
|
||||
top right.
|
||||
noModSupport: You need the standalone version on Steam to install mods.
|
||||
openFolder: Open Mods Map
|
||||
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.
|
||||
noModSupport: Je hebt de zelfstandige versie op Steam nodig om mods te installeren.
|
||||
togglingComingSoon:
|
||||
title: Coming Soon
|
||||
description: Enabling or disabling mods is currently only possible by copying
|
||||
the mod file from or to the mods/ folder. However, being able to
|
||||
toggle them here is planned for a future update!
|
||||
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!
|
||||
|
@ -95,9 +95,9 @@ dialogs:
|
||||
viewUpdate: Посмотреть Обновление
|
||||
showUpgrades: Показать Улучшения
|
||||
showKeybindings: Показать Управление (Привязку клавиш)
|
||||
retry: Retry
|
||||
continue: Continue
|
||||
playOffline: Play Offline
|
||||
retry: Заново
|
||||
continue: Подолжить
|
||||
playOffline: Играть оффлайн
|
||||
importSavegameError:
|
||||
title: Ошибка импортирования
|
||||
text: Не удалось импортировать сохранение игры.
|
||||
@ -245,7 +245,7 @@ dialogs:
|
||||
puzzleShare:
|
||||
title: Короткий ключ скопирован
|
||||
desc: Короткий ключ головоломки (<key>) был скопирован в буфер обмена! Он может
|
||||
быть введен в меню головолом для доступа к головоломке.
|
||||
быть введен в меню головоломок для доступа к головоломке.
|
||||
puzzleReport:
|
||||
title: Жалоба на головоломку
|
||||
options:
|
||||
@ -292,7 +292,7 @@ ingame:
|
||||
clearSelection: Отменить
|
||||
pipette: Пипетка
|
||||
switchLayers: Переключить слои
|
||||
clearBelts: Clear belts
|
||||
clearBelts: Очистить конвейеры
|
||||
colors:
|
||||
red: Красный
|
||||
green: Зеленый
|
||||
@ -451,8 +451,8 @@ ingame:
|
||||
clearItems: Очистить предметы
|
||||
share: Поделиться
|
||||
report: Пожаловаться
|
||||
clearBuildings: Clear Buildings
|
||||
resetPuzzle: Reset Puzzle
|
||||
clearBuildings: Очистить постройки
|
||||
resetPuzzle: Сброс головоломки
|
||||
puzzleEditorControls:
|
||||
title: Редактор головоломок
|
||||
instructions:
|
||||
@ -479,7 +479,7 @@ ingame:
|
||||
titleRatingDesc: Ваша оценка поможет мне в будущем делать вам лучшие предложения
|
||||
continueBtn: Продолжить игру
|
||||
menuBtn: Меню
|
||||
nextPuzzle: Next Puzzle
|
||||
nextPuzzle: Следующая головоломка
|
||||
puzzleMetadata:
|
||||
author: Автор
|
||||
shortKey: Короткий ключ
|
||||
@ -709,8 +709,8 @@ buildings:
|
||||
description: Доставьте фигуру в приемник, чтобы установить их в качестве цели.
|
||||
block:
|
||||
default:
|
||||
name: Block
|
||||
description: Allows you to block a tile.
|
||||
name: Блок
|
||||
description: Блокирует это место от установки чего-либо
|
||||
storyRewards:
|
||||
reward_cutter_and_trash:
|
||||
title: Разрезание Фигур
|
||||
@ -1044,11 +1044,11 @@ settings:
|
||||
title: Размер ресурсов на карте
|
||||
description: Устанавливает размер фигур на карте (когда вид достаточно отдалён).
|
||||
shapeTooltipAlwaysOn:
|
||||
title: Shape Tooltip - Show Always
|
||||
description: Whether to always show the shape tooltip when hovering buildings,
|
||||
instead of having to hold 'ALT'.
|
||||
tickrateHz: <amount> Hz
|
||||
newBadge: New!
|
||||
|
||||
title: Показывать подсказку фигуры
|
||||
description: Показывать ли подсказку фигуры всегда или только при удержании 'ALT'.
|
||||
tickrateHz: <amount> Гц
|
||||
newBadge: Новое!
|
||||
keybindings:
|
||||
title: Настройки управления
|
||||
hint: "Подсказка: Обязательно используйте CTRL, SHIFT и ALT! Они дают разные
|
||||
@ -1131,7 +1131,7 @@ keybindings:
|
||||
goal_acceptor: Приёмник предметов
|
||||
block: Блок
|
||||
massSelectClear: Очистить конвейеры
|
||||
showShapeTooltip: Show shape output tooltip
|
||||
showShapeTooltip: Показывать подсказку фигуры на выходе
|
||||
about:
|
||||
title: Об игре
|
||||
body: >-
|
||||
@ -1272,19 +1272,19 @@ puzzleMenu:
|
||||
dlcHint: Уже купили DLC? Проверьте, что оно активировано, нажав правый клик на
|
||||
shapez.io в своей библиотеке, и далее Свойства > Доп. Контент
|
||||
search:
|
||||
action: Search
|
||||
placeholder: Enter a puzzle or author name
|
||||
includeCompleted: Include Completed
|
||||
action: Поиск
|
||||
placeholder: Введите название головоломки или имя автора
|
||||
includeCompleted: Показывать завершённые
|
||||
difficulties:
|
||||
any: Any Difficulty
|
||||
easy: Easy
|
||||
medium: Medium
|
||||
hard: Hard
|
||||
any: Любая сложность
|
||||
easy: Легко
|
||||
medium: Средне
|
||||
hard: Сложно
|
||||
durations:
|
||||
any: Any Duration
|
||||
short: Short (< 2 min)
|
||||
medium: Normal
|
||||
long: Long (> 10 min)
|
||||
any: Любая длительность
|
||||
short: Короткие (< 2 мин.)
|
||||
medium: Средние
|
||||
long: Долгие (> 10 мин.)
|
||||
backendErrors:
|
||||
ratelimit: Вы слишком часто выполняете свои действия. Подождите немного.
|
||||
invalid-api-key: Не удалось связаться с сервером, попробуйте
|
||||
|
@ -79,9 +79,9 @@ mainMenu:
|
||||
puzzleDlcWishlist: İstek listene ekle!
|
||||
puzzleDlcViewNow: Paketi (DLC) görüntüle
|
||||
mods:
|
||||
title: Active Mods
|
||||
warningPuzzleDLC: Playing the Puzzle DLC is not possible with mods. Please
|
||||
disable all mods to play the DLC.
|
||||
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.
|
||||
dialogs:
|
||||
buttons:
|
||||
ok: OK
|
||||
@ -263,12 +263,12 @@ dialogs:
|
||||
desc: "'<title>' yapbozunu silmek istediğinize emin misiniz? Bu işlem geri
|
||||
alınamaz!"
|
||||
modsDifference:
|
||||
title: Mod Warning
|
||||
desc: The currently installed mods differ from the mods the savegame was created
|
||||
with. This might cause the savegame to break or not load at all. Are
|
||||
you sure you want to continue?
|
||||
missingMods: Missing Mods
|
||||
newMods: Newly installed Mods
|
||||
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?
|
||||
missingMods: Eksik Modlar
|
||||
newMods: Yeni yüklenen Modlar
|
||||
ingame:
|
||||
keybindingsOverlay:
|
||||
moveMap: Hareket Et
|
||||
@ -1038,7 +1038,7 @@ settings:
|
||||
description: Şekil ipuçlarını 'ALT' tuşuna basarak göstermek yerine her zaman
|
||||
gösterir.
|
||||
tickrateHz: <amount> Hz
|
||||
newBadge: New!
|
||||
newBadge: Yeni!
|
||||
keybindings:
|
||||
title: Tuş Atamaları
|
||||
hint: "İpucu: CTRL, SHIFT ve ALT tuşlarından yararlanın! Farklı yerleştirme
|
||||
@ -1052,7 +1052,7 @@ keybindings:
|
||||
massSelect: Çoklu Seçİm
|
||||
buildings: Yapı Kısayolları
|
||||
placementModifiers: Yerleştİrme Özellİklerİ
|
||||
mods: Provided by Mods
|
||||
mods: Modlar tarafından sağlandı
|
||||
mappings:
|
||||
confirm: Kabul
|
||||
back: Geri
|
||||
@ -1307,19 +1307,19 @@ backendErrors:
|
||||
istiyorsanız support@shapez.io ile iletişime geçiniz!
|
||||
no-permission: Bu işlemi yapmak için izniniz yok.
|
||||
mods:
|
||||
title: Mods
|
||||
author: Author
|
||||
version: Version
|
||||
modWebsite: Website
|
||||
openFolder: Open Mods Folder
|
||||
folderOnlyStandalone: Opening the mod folder is only possible when running the standalone.
|
||||
browseMods: Browse Mods
|
||||
modsInfo: To install and manage mods, copy them to the mods folder within the
|
||||
game directory. You can also use the 'Open Mods Folder' button on the
|
||||
top right.
|
||||
noModSupport: You need the standalone version on Steam to install mods.
|
||||
title: Modlar
|
||||
author: Sahibi
|
||||
version: Sürüm
|
||||
modWebsite: İnternet sitesi
|
||||
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.
|
||||
noModSupport: Mod yükleyebilmek için tam sürümü çalıştırmalısınız.
|
||||
togglingComingSoon:
|
||||
title: Coming Soon
|
||||
description: Enabling or disabling mods is currently only possible by copying
|
||||
the mod file from or to the mods/ folder. However, being able to
|
||||
toggle them here is planned for a future update!
|
||||
title: Yakında Gelecek
|
||||
description: Modları etkinleştirmek veya devre dışı bırakmak şu anda yalnızca
|
||||
dosyaları Mod klasörüne kopyalayarak mümkündür. Ancak modları burada
|
||||
değiştirmek gelecekteki bir güncelleme için planlanmıştır!
|
||||
|
Loading…
Reference in New Issue
Block a user