Merge branch 'master' into patch-1

This commit is contained in:
EganWolf 2020-06-21 23:46:51 +02:00 committed by GitHub
commit e6f8d5d3ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
54 changed files with 2089 additions and 856 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 17 KiB

View File

@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3c91adcd4e00006ffa4aed4db19d1530bf8c58935b1624d1640fc8e9465a2824
size 176993
oid sha256:ebde52e75e54d2f4add0cf498c85f059082a0745212a23c4de7328a7d78b00a5
size 238170

BIN
artwork/steam/devlog.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

3
artwork/steam/devlog.psd Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:746c6cf3f0284798a78c08f77d7e9d0c28b02323081fda42b5fa876a7ade29a0
size 205925

BIN
artwork/wires/prefab.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

3
artwork/wires/prefab.psd Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:498dea7314b8720c40dcd8bdd64b1b4a7a35259b2ffe7e896fc3db22878d6414
size 1954036

View File

@ -29,7 +29,7 @@ function gulptasksSounds($, gulp, buildFolder) {
.audioChannels(1)
.audioFrequency(22050)
.audioCodec("libmp3lame")
.audioFilters(["volume=0.3"]);
.audioFilters(["volume=0.15"]);
}),
{
name: "music",

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!-- Generator: Adobe Illustrator 19.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512;" xml:space="preserve">
<path style="fill:#FF4B55;" d="M400,0H112C50.144,0,0,50.144,0,112v288c0,61.856,50.144,112,112,112h288 c61.856,0,112-50.144,112-112V112C512,50.144,461.856,0,400,0z"/>
<g>
<path style="fill:#FFE15A;" d="M114.021,87.182l12.722,38.146l40.21,0.312c5.206,0.04,7.365,6.684,3.177,9.777l-32.348,23.887 l12.129,38.339c1.57,4.964-4.081,9.07-8.317,6.042l-32.714-23.383l-32.714,23.383c-4.235,3.027-9.887-1.079-8.317-6.042 l12.129-38.339L47.63,135.417c-4.188-3.093-2.029-9.736,3.177-9.777l40.21-0.312l12.722-38.146 C105.388,82.243,112.374,82.243,114.021,87.182z"/>
<path style="fill:#FFE15A;" d="M260.037,96.582l9.122,12.44l14.723-4.604c1.906-0.596,3.474,1.577,2.307,3.198l-9.012,12.52 l8.928,12.58c1.156,1.629-0.427,3.791-2.329,3.183l-14.692-4.702l-9.205,12.378c-1.192,1.603-3.738,0.766-3.746-1.231 l-0.068-15.426l-14.617-4.929c-1.893-0.638-1.883-3.318,0.013-3.944l14.65-4.831l0.171-15.425 C256.305,95.791,258.856,94.971,260.037,96.582z"/>
<path style="fill:#FFE15A;" d="M204.496,59.501l15.336,1.667l6.542-13.97c0.847-1.809,3.509-1.499,3.917,0.457l3.154,15.1 l15.308,1.905c1.982,0.247,2.509,2.874,0.776,3.866l-13.387,7.665l2.919,15.147c0.378,1.961-1.958,3.275-3.437,1.933 l-11.427-10.363l-13.504,7.457c-1.748,0.965-3.719-0.85-2.901-2.672l6.324-14.07l-11.265-10.539 C201.393,61.721,202.511,59.285,204.496,59.501z"/>
<path style="fill:#FFE15A;" d="M228.739,208.997l-9.122,12.44l-14.723-4.604c-1.906-0.596-3.474,1.577-2.307,3.198l9.012,12.52 l-8.928,12.58c-1.156,1.629,0.426,3.791,2.329,3.183l14.692-4.702l9.205,12.378c1.192,1.603,3.738,0.766,3.746-1.231l0.068-15.426 l14.617-4.929c1.892-0.638,1.883-3.318-0.013-3.943l-14.65-4.831l-0.171-15.425C232.472,208.206,229.92,207.386,228.739,208.997z"/>
<path style="fill:#FFE15A;" d="M284.281,174.151l-15.336,1.667l-6.542-13.97c-0.847-1.809-3.509-1.499-3.917,0.456l-3.154,15.1 l-15.308,1.905c-1.982,0.247-2.509,2.874-0.776,3.866l13.387,7.665l-2.919,15.147c-0.378,1.961,1.958,3.275,3.437,1.933 l11.427-10.363l13.504,7.457c1.748,0.965,3.719-0.85,2.901-2.672l-6.324-14.07l11.265-10.539 C287.384,176.371,286.266,173.935,284.281,174.151z"/>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:f61e851402fbc92d6909912fb203c63258fedbdea83e81f7ececb5091f4bee03
size 3732550

View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:8c334a9f100fce4647b4803d2a8270b30e26d53622b3717bdb81b3ea07f84aed
size 150286082

View File

@ -38,6 +38,10 @@ html {
right: 0;
background: #dee1ea;
@include DarkThemeOverride {
background: $darkModeGameBackground;
}
}
body {
@ -413,6 +417,10 @@ canvas {
display: inline-block;
vertical-align: middle;
}
@include DarkThemeOverride {
color: #fff;
}
}
.prefab_LoadingTextWithAnimDelayed {

View File

@ -27,7 +27,7 @@ $icons: notification_saved, notification_success, notification_upgrade;
}
}
$languages: en, de, cs, da, et, es-419, fr, it, pt-BR, sv, tr, el, ru, uk, zh-TW, nb, mt-MT, ar, nl, vi, th,
$languages: en, de, cs, da, et, es-419, fr, it, pt-BR, sv, tr, el, ru, uk, zh-TW, zh-CN, nb, mt-MT, ar, nl, vi, th,
hu, pl, ja, kor, no, pt-PT;
@each $language in $languages {

View File

@ -75,6 +75,15 @@
@include StyleBelowWidth(700px) {
display: none !important;
}
&.compact {
width: unset !important;
grid-template-columns: 1fr;
.buildingImage,
.description > .text {
display: none;
}
}
}
#ingame_HUD_PlacerVariants {
@ -86,6 +95,10 @@
flex-direction: column;
align-items: flex-end;
&.compact {
@include S(top, 150px);
}
.explanation {
text-transform: uppercase;
grid-row: 1 / 2;

View File

@ -21,15 +21,32 @@
}
}
$darkModeDialogBg: darken($darkModeGameBackground, 10);
@include DarkThemeOverride {
background: rgba(#33363d, 0.9);
background: rgba($darkModeDialogBg, 0.9);
@include InlineAnimation(0.12s ease-in-out) {
0% {
background-color: transparent;
opacity: 0.5;
}
100% {
background-color: rgba(#33363d, 0.9);
background-color: rgba($darkModeDialogBg, 0.9);
}
}
> .dialogInner.optionChooserDialog .optionParent {
.option {
background: #3d3f42;
&:hover {
background-color: #424348;
}
&.active {
background: $colorBlueBright;
color: #fff;
}
}
}
}

View File

@ -14,6 +14,10 @@
}
> .binding {
&:not(.visible) {
display: none !important;
}
display: inline-grid;
@include PlainText;
align-items: center;
@ -57,50 +61,6 @@
@include S(margin-left, 5px);
}
}
&:not(.placementActive) .binding.placementOnly,
&.mapOverviewActive .binding.placementOnly {
display: none;
}
&.placementActive:not(.mapOverviewActive) .noPlacementOnly {
display: none;
}
&:not(.mapOverviewActive) .binding.overviewOnly {
display: none;
}
&.mapOverviewActive .noOverviewOnly {
display: none;
}
&:not(.hasDirectionLock) .binding.directionLock {
display: none;
}
&.hasDirectionLock .noDirectionLock {
display: none;
}
.binding.placementOnly,
&:not(.placementActive) .binding.noPlacementOnly {
transform-origin: 0% 50%;
@include InlineAnimation(0.3s ease-in-out) {
0% {
color: $colorRedBright;
transform: scale(1.2);
}
}
}
.keybinding.builtinKey {
transition: all 0.1s ease-in-out;
transition-property: background-color, color, border-color;
background: $colorRedBright;
border-color: $colorRedBright;
color: #fff;
}
}
body.uiHidden #ingame_HUD_KeybindingOverlay .binding:not(.hudToggle) {

View File

@ -1,22 +0,0 @@
#ingame_HUD_MassSelector {
position: absolute;
@include S(top, 50px);
left: 50%;
transform: translateX(-50%);
background: $ingameHudBg;
@include S(padding, 6px, 10px);
@include SuperSmallText;
color: #fff;
// color: #f77;
.keybinding {
vertical-align: middle;
@include S(margin, 0, 1px);
position: relative;
top: unset;
left: unset;
right: unset;
bottom: unset;
@include S(margin-top, -2px);
}
}

View File

@ -29,7 +29,7 @@
#ingame_HUD_Waypoints {
position: absolute;
@include S(right, 10px);
@include S(top, 60px);
@include S(top, 45px);
display: flex;
flex-direction: column;
@include DarkThemeInvert();

View File

@ -37,7 +37,6 @@
@import "ingame_hud/shop";
@import "ingame_hud/game_menu";
@import "ingame_hud/dialogs";
@import "ingame_hud/mass_selector";
@import "ingame_hud/vignette_overlay";
@import "ingame_hud/statistics";
@import "ingame_hud/pinned_shapes";
@ -67,7 +66,6 @@ ingame_HUD_PinnedShapes,
ingame_HUD_GameMenu,
ingame_HUD_KeybindingOverlay,
ingame_HUD_Notifications,
ingame_HUD_MassSelector,
ingame_HUD_DebugInfo,
ingame_HUD_EntityDebugger,
ingame_HUD_InteractiveTutorial,
@ -101,7 +99,6 @@ body.uiHidden {
#ingame_HUD_buildings_toolbar,
#ingame_HUD_PlacementHints,
#ingame_HUD_GameMenu,
#ingame_HUD_MassSelector,
#ingame_HUD_PinnedShapes,
#ingame_HUD_Notifications,
#ingame_HUD_TutorialHints,
@ -115,6 +112,6 @@ body.modalDialogActive,
body.externalAdOpen,
body.ingameDialogOpen {
> *:not(.ingameDialog):not(.modalDialogParent):not(.loadingDialog):not(.gameLoadingOverlay):not(#ingame_HUD_ModalDialogs):not(.noBlur) {
filter: blur(5px) !important;
// filter: blur(5px) !important;
}
}

View File

@ -350,7 +350,7 @@ button,
}
@mixin DarkThemeOverride {
@at-root body[data-theme="dark"] &,
@at-root html[data-theme="dark"] &,
&[data-theme="dark"] {
@content;
}

View File

@ -28,4 +28,10 @@
right: 0;
bottom: 0;
}
@include DarkThemeOverride {
.gameLoadingOverlay {
background: $darkModeGameBackground;
}
}
}

View File

@ -51,4 +51,21 @@
}
}
}
@include DarkThemeOverride {
.content {
.hint {
background: #3b3d40;
}
.category .entry {
color: #c0c4c8;
border-bottom-color: #888;
button {
filter: invert(1);
}
}
}
}
}

View File

@ -401,4 +401,44 @@
}
}
}
@include DarkThemeOverride {
background: $darkModeGameBackground center center / cover !important;
.topButtons {
filter: invert(1);
.languageChoose {
filter: invert(1);
}
}
.mainContainer {
background: darken($darkModeGameBackground, 10);
.savegames .savegame {
background: darken($darkModeGameBackground, 15);
color: white;
}
}
.footer {
> a {
background: darken($darkModeGameBackground, 10);
color: #eee;
}
.author {
color: #bdbdbd;
> a {
color: white;
}
}
.thirdpartyLogo.githubLogo {
filter: invert(1);
}
}
}
}

View File

@ -88,4 +88,26 @@
}
}
}
@include DarkThemeOverride {
.content {
.setting {
background: darken($darkModeGameBackground, 10);
.value.enum {
// dirty but works
filter: invert(0.85);
color: #222;
}
.value.checkbox {
background-color: #74767b;
&.checked {
background-color: $colorBlueBright;
}
}
}
}
}
}

View File

@ -61,4 +61,21 @@
}
}
}
@include DarkThemeOverride {
.headerBar {
h1 {
color: #e2e0db;
}
.backButton {
filter: invert(1);
}
}
> .container > .content {
background: darken($darkModeGameBackground, 3);
color: #eee;
}
}
}

View File

@ -38,6 +38,8 @@ $ingameHudBg: rgba(#333438, 0.9);
$text3dColor: #f4ffff;
$darkModeGameBackground: #5c606c;
// Dialog properties
$modalDialogBg: rgba(160, 165, 180, 0.8);
$dialogBgColor: lighten($mainBgColor, 10);

View File

@ -1,8 +1,26 @@
export const CHANGELOG = [
{
version: "1.1.16",
date: "unreleased",
entries: ["Fix belt planner not placing the last belt"],
date: "21.06.2020",
entries: [
"You can now pickup buildings below your cursor with 'Q'!",
"The game soundtrack has been extended! There are now 4 songs with over 13 minutes of playtime from <a href='https://soundcloud.com/pettersumelius' target='blank'>Peppsen</a>!",
"Refactor keybindings overlay to show more appropriate keybindings",
"Show keybindings for area-select in the upper left instead",
"Automatically deselect area when selecting a new building",
"Raise markers limit from 14 characters to 71 (by Joker-vD)",
"Optimize performance by caching extractor items (by Phlosioneer)",
"Added setting to enable compact building infos, which only show ratios and hide the image / description",
"Apply dark theme to menu as well (by dengr1065)",
"Fix belt planner not placing the last belt",
"Fix buildings getting deleted when right clicking while placing a blueprint",
"Fix for exporting screenshots for huge bases (It was showing an empty file) (by xSparfuchs)",
"Fix buttons not responding when using right click directly after left click (by davidburhans)",
"Fix hub marker being hidden by building info panel",
"Disable dialog background blur since it can cause performance issues",
"Added simplified chinese translations",
"Update translations (Thanks to all translators!)",
],
},
{
version: "1.1.15",

View File

@ -325,6 +325,7 @@ export class ClickDetector {
// Ignore right clicks
this.rightClick.dispatch(position, event);
this.cancelled = true;
this.clickDownPosition = null;
return;
}
}

View File

@ -1,70 +0,0 @@
import { STOP_PROPAGATION } from "../core/signal";
import { GameRoot } from "./root";
import { ClickDetector } from "../core/click_detector";
import { createLogger } from "../core/logging";
const logger = createLogger("canvas_click_interceptor");
export class CanvasClickInterceptor {
/**
* @param {GameRoot} root
*/
constructor(root) {
this.root = root;
this.root.signals.postLoadHook.add(this.initialize, this);
this.root.signals.aboutToDestruct.add(this.cleanup, this);
/** @type {Array<object>} */
this.interceptors = [];
}
initialize() {
this.clickDetector = new ClickDetector(this.root.canvas, {
applyCssClass: null,
captureTouchmove: false,
targetOnly: true,
preventDefault: true,
maxDistance: 13,
clickSound: null,
});
this.clickDetector.click.add(this.onCanvasClick, this);
this.clickDetector.rightClick.add(this.onCanvasRightClick, this);
if (this.root.hud.parts.buildingPlacer) {
this.interceptors.push(this.root.hud.parts.buildingPlacer);
}
logger.log("Registered", this.interceptors.length, "interceptors");
}
cleanup() {
if (this.clickDetector) {
this.clickDetector.cleanup();
}
this.interceptors = [];
}
onCanvasClick(position, event, cancelAction = false) {
if (!this.root.gameInitialized) {
logger.warn("Skipping click outside of game initiaization!");
return;
}
if (this.root.hud.hasBlockingOverlayOpen()) {
return;
}
for (let i = 0; i < this.interceptors.length; ++i) {
const interceptor = this.interceptors[i];
if (interceptor.onCanvasClick(position, cancelAction) === STOP_PROPAGATION) {
// log(this, "Interceptor", interceptor.constructor.name, "catched click");
break;
}
}
}
onCanvasRightClick(position, event) {
this.onCanvasClick(position, event, true);
}
}

View File

@ -12,6 +12,7 @@ export class MinerComponent extends Component {
}
static getSchema() {
// cachedMinedItem is not serialized.
return {
lastMiningTime: types.ufloat,
chainable: types.bool,
@ -25,8 +26,6 @@ export class MinerComponent extends Component {
});
}
/**
*/
constructor({ chainable = false }) {
super();
this.lastMiningTime = 0;
@ -38,6 +37,11 @@ export class MinerComponent extends Component {
* @type {Array<BaseItem>}
*/
this.itemChainBuffer = [];
/**
* @type {BaseItem}
*/
this.cachedMinedItem = null;
}
/**

View File

@ -17,7 +17,6 @@ import { SavegameSerializer } from "../savegame/savegame_serializer";
import { AutomaticSave } from "./automatic_save";
import { MetaHubBuilding } from "./buildings/hub";
import { Camera } from "./camera";
import { CanvasClickInterceptor } from "./canvas_click_interceptor";
import { EntityManager } from "./entity_manager";
import { GameSystemManager } from "./game_system_manager";
import { HubGoals } from "./hub_goals";
@ -98,7 +97,6 @@ export class GameCore {
root.logic = new GameLogic(root);
root.hud = new GameHUD(root);
root.time = new GameTime(root);
root.canvasClickInterceptor = new CanvasClickInterceptor(root);
root.automaticSave = new AutomaticSave(root);
root.soundProxy = new SoundProxy(root);

View File

@ -34,6 +34,7 @@ import { HUDPartTutorialHints } from "./parts/tutorial_hints";
import { HUDWaypoints } from "./parts/waypoints";
import { HUDInteractiveTutorial } from "./parts/interactive_tutorial";
import { HUDScreenshotExporter } from "./parts/screenshot_exporter";
import { Entity } from "../entity";
export class GameHUD {
/**

View File

@ -1,15 +1,15 @@
import { DrawParameters } from "../../../core/draw_parameters";
import { STOP_PROPAGATION } from "../../../core/signal";
import { TrackedState } from "../../../core/tracked_state";
import { makeDiv } from "../../../core/utils";
import { Vector } from "../../../core/vector";
import { T } from "../../../translations";
import { enumMouseButton } from "../../camera";
import { KEYMAPPINGS } from "../../key_action_mapper";
import { BaseHUDPart } from "../base_hud_part";
import { Blueprint } from "./blueprint";
import { makeDiv } from "../../../core/utils";
import { DynamicDomAttach } from "../dynamic_dom_attach";
import { blueprintShape } from "../../upgrades";
import { T } from "../../../translations";
import { BaseHUDPart } from "../base_hud_part";
import { DynamicDomAttach } from "../dynamic_dom_attach";
import { Blueprint } from "./blueprint";
export class HUDBlueprintPlacer extends BaseHUDPart {
createElements(parent) {
@ -34,9 +34,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
const keyActionMapper = this.root.keyMapper;
keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.abortPlacement, this);
keyActionMapper
.getBinding(KEYMAPPINGS.placement.abortBuildingPlacement)
.add(this.abortPlacement, this);
keyActionMapper.getBinding(KEYMAPPINGS.placement.pipette).add(this.abortPlacement, this);
keyActionMapper.getBinding(KEYMAPPINGS.placement.rotateWhilePlacing).add(this.rotateBlueprint, this);
keyActionMapper.getBinding(KEYMAPPINGS.massSelect.pasteLastBlueprint).add(this.pasteBlueprint, this);
@ -62,10 +60,9 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
}
update() {
this.domAttach.update(this.currentBlueprint.get());
this.trackedCanAfford.set(
this.currentBlueprint.get() && this.currentBlueprint.get().canAfford(this.root)
);
const currentBlueprint = this.currentBlueprint.get();
this.domAttach.update(currentBlueprint && currentBlueprint.getCost() > 0);
this.trackedCanAfford.set(currentBlueprint && currentBlueprint.canAfford(this.root));
}
/**

View File

@ -38,6 +38,10 @@ export class HUDBuildingPlacer extends HUDBuildingPlacerLogic {
this.buildingInfoElements.tutorialImage = makeDiv(this.element, null, ["buildingImage"]);
this.variantsElement = makeDiv(parent, "ingame_HUD_PlacerVariants");
const compact = this.root.app.settings.getAllSettings().compactBuildingInfo;
this.element.classList.toggle("compact", compact);
this.variantsElement.classList.toggle("compact", compact);
}
initialize() {

View File

@ -1,5 +1,6 @@
import { Math_abs, Math_degrees, Math_round } from "../../../core/builtins";
import { globalConfig } from "../../../core/config";
import { gMetaBuildingRegistry } from "../../../core/global_registries";
import { Signal, STOP_PROPAGATION } from "../../../core/signal";
import { TrackedState } from "../../../core/tracked_state";
import { Vector } from "../../../core/vector";
@ -9,7 +10,6 @@ import { Entity } from "../../entity";
import { KEYMAPPINGS } from "../../key_action_mapper";
import { defaultBuildingVariant, MetaBuilding } from "../../meta_building";
import { BaseHUDPart } from "../base_hud_part";
import { lerp } from "../../../core/utils";
/**
* Contains all logic for the building placer - this doesn't include the rendering
@ -97,10 +97,8 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
keyActionMapper
.getBinding(KEYMAPPINGS.placement.switchDirectionLockSide)
.add(this.switchDirectionLockSide, this);
keyActionMapper
.getBinding(KEYMAPPINGS.placement.abortBuildingPlacement)
.add(this.abortPlacement, this);
keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.abortPlacement, this);
keyActionMapper.getBinding(KEYMAPPINGS.placement.pipette).add(this.startPipette, this);
this.root.gameState.inputReciever.keyup.add(this.checkForDirectionLockSwitch, this);
// BINDINGS TO GAME EVENTS
@ -220,6 +218,125 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
}
}
/**
* Starts the pipette function
*/
startPipette() {
// Disable in overview
if (this.root.camera.getIsMapOverlayActive()) {
return;
}
const mousePosition = this.root.app.mousePosition;
if (!mousePosition) {
// Not on screen
return;
}
const worldPos = this.root.camera.screenToWorld(mousePosition);
const tile = worldPos.toTileSpace();
const contents = this.root.map.getTileContent(tile);
if (!contents) {
this.currentMetaBuilding.set(null);
return;
}
// Try to extract the building
const extracted = this.hack_reconstructMetaBuildingAndVariantFromBuilding(contents);
if (!extracted) {
this.currentMetaBuilding.set(null);
return;
}
this.currentMetaBuilding.set(extracted.metaBuilding);
this.currentVariant.set(extracted.variant);
this.currentBaseRotation = contents.components.StaticMapEntity.rotation;
// Make sure we selected something, and also make sure it's not a special entity
// if (contents && !contents.components.Unremovable) {
// }
}
/**
* HACK!
*
* This attempts to reconstruct the meta building and its variant from a given entity
* @param {Entity} entity
* @returns {{ metaBuilding: MetaBuilding, variant: string }}
*/
hack_reconstructMetaBuildingAndVariantFromBuilding(entity) {
if (entity.components.Hub) {
// Hub is not copyable
return null;
}
const matches = [];
const metaBuildings = gMetaBuildingRegistry.entries;
for (let i = 0; i < metaBuildings.length; ++i) {
const metaBuilding = metaBuildings[i];
const availableVariants = metaBuilding.getAvailableVariants(this.root);
checkVariant: for (let k = 0; k < availableVariants.length; ++k) {
const variant = availableVariants[k];
let unplaced = metaBuilding.createEntity({
root: this.root,
variant,
origin: new Vector(0, 0),
rotation: 0,
originalRotation: 0,
rotationVariant: 0,
});
// Compare if both entities share the same components
for (let component in entity.components) {
if ((entity.components[component] == null) !== (unplaced.components[component] == null)) {
continue checkVariant;
}
}
// Check for same item processor
if (
entity.components.ItemProcessor &&
entity.components.ItemProcessor.type != unplaced.components.ItemProcessor.type
) {
continue checkVariant;
}
// Check for underground belt
if (
entity.components.UndergroundBelt &&
entity.components.UndergroundBelt.tier != unplaced.components.UndergroundBelt.tier
) {
continue checkVariant;
}
// Check for same sprite key - except for underground belts
// since the sprite may vary here
if (
!entity.components.UndergroundBelt &&
entity.components.StaticMapEntity.spriteKey !=
unplaced.components.StaticMapEntity.spriteKey
) {
continue checkVariant;
}
matches.push({ metaBuilding, variant });
}
}
if (matches.length == 1) {
const staticEntity = entity.components.StaticMapEntity;
const key = staticEntity.spriteKey || staticEntity.blueprintSpriteKey;
assert(
key &&
key.includes(matches[0].metaBuilding.id) &&
(matches[0].variant === defaultBuildingVariant || key.includes(matches[0].variant))
);
return matches[0];
}
return null;
}
switchDirectionLockSide() {
this.currentDirectionLockSide = 1 - this.currentDirectionLockSide;
}
@ -237,28 +354,6 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
}
}
/**
* Canvas click handler
* @param {Vector} mousePos
* @param {boolean} cancelAction
*/
onCanvasClick(mousePos, cancelAction = false) {
if (cancelAction) {
if (this.currentMetaBuilding.get()) {
this.currentMetaBuilding.set(null);
} else {
this.deleteBelowCursor();
}
return STOP_PROPAGATION;
}
if (!this.currentMetaBuilding.get()) {
return;
}
return STOP_PROPAGATION;
}
/**
* Tries to place the current building at the given tile
* @param {Vector} tile
@ -479,13 +574,18 @@ export class HUDBuildingPlacerLogic extends BaseHUDPart {
}
// Deletion
if (button === enumMouseButton.right && !this.currentMetaBuilding.get()) {
if (button === enumMouseButton.right && !metaBuilding) {
this.currentlyDragging = true;
this.currentlyDeleting = true;
this.lastDragTile = this.root.camera.screenToWorld(pos).toTileSpace();
this.currentMetaBuilding.set(null);
this.deleteBelowCursor();
return STOP_PROPAGATION;
}
// Cancel placement
if (button === enumMouseButton.right && metaBuilding) {
this.currentMetaBuilding.set(null);
}
}
/**

View File

@ -1,123 +1,316 @@
import { makeDiv } from "../../../core/utils";
import { T } from "../../../translations";
import { getStringForKeyCode, KEYMAPPINGS } from "../../key_action_mapper";
import {
getStringForKeyCode,
KEYCODE_LMB,
KEYCODE_MMB,
KEYCODE_RMB,
KEYMAPPINGS,
} from "../../key_action_mapper";
import { BaseHUDPart } from "../base_hud_part";
import { TrackedState } from "../../../core/tracked_state";
import { MetaBuilding } from "../../meta_building";
import { DynamicDomAttach } from "../dynamic_dom_attach";
const DIVIDER_TOKEN = "/";
const ADDER_TOKEN = "+";
/**
* @typedef {{ keyCode: number }} KeyCode
*/
/**
* @typedef {{
* condition: () => boolean,
* keys: Array<KeyCode|number|string>,
* label: string,
* cachedElement?: HTMLElement,
* cachedVisibility?: boolean
* }} KeyBinding
*/
export class HUDKeybindingOverlay extends BaseHUDPart {
initialize() {
this.root.hud.signals.selectedPlacementBuildingChanged.add(
this.onSelectedBuildingForPlacementChanged,
this
);
initialize() {}
this.trackedMapOverviewActive = new TrackedState(this.applyCssClasses, this);
/**
* HELPER / Returns if there is a building selected for placement
* @returns {boolean}
*/
get buildingPlacementActive() {
const placer = this.root.hud.parts.buildingPlacer;
return !this.mapOverviewActive && placer && !!placer.currentMetaBuilding.get();
}
createElements(parent) {
const mapper = this.root.keyMapper;
const getKeycode = id => {
return getStringForKeyCode(mapper.getBinding(id).keyCode);
};
this.element = makeDiv(
parent,
"ingame_HUD_KeybindingOverlay",
[],
`
<div class="binding">
<code class="keybinding leftMouse noPlacementOnly"></code><i class="noPlacementOnly"></i>
<code class="keybinding">${getKeycode(KEYMAPPINGS.navigation.mapMoveUp)}</code>
<code class="keybinding">${getKeycode(KEYMAPPINGS.navigation.mapMoveLeft)}</code>
<code class="keybinding">${getKeycode(KEYMAPPINGS.navigation.mapMoveDown)}</code>
<code class="keybinding">${getKeycode(KEYMAPPINGS.navigation.mapMoveRight)}</code>
<label>${T.ingame.keybindingsOverlay.moveMap}</label>
</div>
<div class="binding noPlacementOnly noOverviewOnly">
<code class="keybinding rightMouse"></code>
<label>${T.ingame.keybindingsOverlay.delete}</label>
</div>
<div class="binding noPlacementOnly overviewOnly">
<code class="keybinding rightMouse"></code>
<label>${T.ingame.keybindingsOverlay.createMarker}</label>
</div>
<div class="binding noPlacementOnly">
<code class="keybinding builtinKey">${getKeycode(
KEYMAPPINGS.massSelect.massSelectStart
)}</code>+
<code class="keybinding leftMouse"></code>
<label>${T.ingame.keybindingsOverlay.selectBuildings}</label>
</div>
<div class="binding placementOnly">
<code class="keybinding leftMouse"></code>
<label>${T.ingame.keybindingsOverlay.placeBuilding}</label>
</div>
<div class="binding placementOnly">
<code class="keybinding rightMouse"></code><i></i>
<code class="keybinding">${getKeycode(KEYMAPPINGS.placement.abortBuildingPlacement)}</code>
<label>${T.ingame.keybindingsOverlay.stopPlacement}</label>
</div>
<div class="binding placementOnly">
<code class="keybinding">${getKeycode(KEYMAPPINGS.placement.rotateWhilePlacing)}</code>
<label>${T.ingame.keybindingsOverlay.rotateBuilding}</label>
</div>
` +
(this.root.app.settings.getAllSettings().alwaysMultiplace
? ""
: `
<div class="binding placementOnly noDirectionLock">
<code class="keybinding builtinKey shift">${getKeycode(
KEYMAPPINGS.placementModifiers.placeMultiple
)}</code>
<label>${T.ingame.keybindingsOverlay.placeMultiple}</label>
</div>`) +
`
<div class="binding placementOnly directionLock">
<code class="keybinding builtinKey shift">${getKeycode(
KEYMAPPINGS.placementModifiers.lockBeltDirection
)}</code>
<label>${T.ingame.keybindingsOverlay.lockBeltDirection}</label>
</div>
<div class="binding placementOnly directionLock">
<code class="keybinding">${getKeycode(KEYMAPPINGS.placement.switchDirectionLockSide)}</code>
<label>${T.ingame.keybindingsOverlay.plannerSwitchSide}</label>
</div>
`
/**
* HELPER / Returns if there is a building selected for placement and
* it supports the belt planner
* @returns {boolean}
*/
get buildingPlacementSupportsBeltPlanner() {
const placer = this.root.hud.parts.buildingPlacer;
return (
!this.mapOverviewActive &&
placer &&
placer.currentMetaBuilding.get() &&
placer.currentMetaBuilding.get().getHasDirectionLockAvailable()
);
}
/**
*
* @param {MetaBuilding} selectedMetaBuilding
* HELPER / Returns if there is a building selected for placement and
* it has multiplace enabled by default
* @returns {boolean}
*/
onSelectedBuildingForPlacementChanged(selectedMetaBuilding) {
this.element.classList.toggle("placementActive", !!selectedMetaBuilding);
this.element.classList.toggle(
"hasDirectionLock",
selectedMetaBuilding && selectedMetaBuilding.getHasDirectionLockAvailable()
get buildingPlacementStaysInPlacement() {
const placer = this.root.hud.parts.buildingPlacer;
return (
!this.mapOverviewActive &&
placer &&
placer.currentMetaBuilding.get() &&
placer.currentMetaBuilding.get().getStayInPlacementMode()
);
}
applyCssClasses() {
this.element.classList.toggle("mapOverviewActive", this.root.camera.getIsMapOverlayActive());
/**
* HELPER / Returns if there is a blueprint selected for placement
* @returns {boolean}
*/
get blueprintPlacementActive() {
const placer = this.root.hud.parts.blueprintPlacer;
return placer && !!placer.currentBlueprint.get();
}
/**
* HELPER / Returns if the belt planner is currently active
* @returns {boolean}
*/
get beltPlannerActive() {
const placer = this.root.hud.parts.buildingPlacer;
return !this.mapOverviewActive && placer && placer.isDirectionLockActive;
}
/**
* HELPER / Returns if there is a last blueprint available
* @returns {boolean}
*/
get lastBlueprintAvailable() {
const placer = this.root.hud.parts.blueprintPlacer;
return placer && !!placer.lastBlueprintUsed;
}
/**
* HELPER / Returns if there is anything selected on the map
* @returns {boolean}
*/
get anythingSelectedOnMap() {
const selector = this.root.hud.parts.massSelector;
return selector && selector.selectedUids.size > 0;
}
/**
* HELPER / Returns if there is a building or blueprint selected for placement
* @returns {boolean}
*/
get anyPlacementActive() {
return this.buildingPlacementActive || this.blueprintPlacementActive;
}
/**
* HELPER / Returns if the map overview is active
* @returns {boolean}
*/
get mapOverviewActive() {
return this.root.camera.getIsMapOverlayActive();
}
/**
* Initializes the element
* @param {HTMLElement} parent
*/
createElements(parent) {
const mapper = this.root.keyMapper;
const k = KEYMAPPINGS;
/** @type {Array<KeyBinding>} */
this.keybindings = [
{
// Move map - Including mouse
label: T.ingame.keybindingsOverlay.moveMap,
keys: [
KEYCODE_LMB,
DIVIDER_TOKEN,
k.navigation.mapMoveUp,
k.navigation.mapMoveLeft,
k.navigation.mapMoveDown,
k.navigation.mapMoveRight,
],
condition: () => !this.anyPlacementActive,
},
{
// Move map - No mouse
label: T.ingame.keybindingsOverlay.moveMap,
keys: [
k.navigation.mapMoveUp,
k.navigation.mapMoveLeft,
k.navigation.mapMoveDown,
k.navigation.mapMoveRight,
],
condition: () => this.anyPlacementActive,
},
{
// [OVERVIEW] Create marker with right click
label: T.ingame.keybindingsOverlay.createMarker,
keys: [KEYCODE_RMB],
condition: () => this.mapOverviewActive && !this.blueprintPlacementActive,
},
{
// Pipette
label: T.ingame.keybindingsOverlay.pipette,
keys: [k.placement.pipette],
condition: () => !this.mapOverviewActive,
},
{
// Cancel placement
label: T.ingame.keybindingsOverlay.stopPlacement,
keys: [KEYCODE_RMB],
condition: () => this.anyPlacementActive,
},
{
// Delete with right click
label: T.ingame.keybindingsOverlay.delete,
keys: [KEYCODE_RMB],
condition: () =>
!this.anyPlacementActive && !this.mapOverviewActive && !this.anythingSelectedOnMap,
},
{
// Area select
label: T.ingame.keybindingsOverlay.selectBuildings,
keys: [k.massSelect.massSelectStart, ADDER_TOKEN, KEYCODE_LMB],
condition: () => !this.anyPlacementActive && !this.anythingSelectedOnMap,
},
{
// Place building
label: T.ingame.keybindingsOverlay.placeBuilding,
keys: [KEYCODE_LMB],
condition: () => this.anyPlacementActive,
},
{
// Rotate
label: T.ingame.keybindingsOverlay.rotateBuilding,
keys: [k.placement.rotateWhilePlacing],
condition: () => this.anyPlacementActive && !this.beltPlannerActive,
},
{
// [BELT PLANNER] Flip Side
label: T.ingame.keybindingsOverlay.plannerSwitchSide,
keys: [k.placement.switchDirectionLockSide],
condition: () => this.beltPlannerActive,
},
{
// Place last blueprint
label: T.ingame.keybindingsOverlay.pasteLastBlueprint,
keys: [k.massSelect.pasteLastBlueprint],
condition: () => !this.blueprintPlacementActive && this.lastBlueprintAvailable,
},
{
// Belt planner
label: T.ingame.keybindingsOverlay.lockBeltDirection,
keys: [k.placementModifiers.lockBeltDirection],
condition: () => this.buildingPlacementSupportsBeltPlanner && !this.beltPlannerActive,
},
{
// [SELECTION] Destroy
label: T.ingame.keybindingsOverlay.delete,
keys: [k.massSelect.confirmMassDelete],
condition: () => this.anythingSelectedOnMap,
},
{
// [SELECTION] Cancel
label: T.ingame.keybindingsOverlay.clearSelection,
keys: [k.general.back],
condition: () => this.anythingSelectedOnMap,
},
{
// [SELECTION] Cut
label: T.ingame.keybindingsOverlay.cutSelection,
keys: [k.massSelect.massSelectCut],
condition: () => this.anythingSelectedOnMap,
},
{
// [SELECTION] Copy
label: T.ingame.keybindingsOverlay.copySelection,
keys: [k.massSelect.massSelectCopy],
condition: () => this.anythingSelectedOnMap,
},
];
if (!this.root.app.settings.getAllSettings().alwaysMultiplace) {
this.keybindings.push({
// Multiplace
label: T.ingame.keybindingsOverlay.placeMultiple,
keys: [k.placementModifiers.placeMultiple],
condition: () => this.anyPlacementActive && !this.buildingPlacementStaysInPlacement,
});
}
this.element = makeDiv(parent, "ingame_HUD_KeybindingOverlay", []);
for (let i = 0; i < this.keybindings.length; ++i) {
let html = "";
const handle = this.keybindings[i];
for (let k = 0; k < handle.keys.length; ++k) {
const key = handle.keys[k];
switch (key) {
case KEYCODE_LMB:
html += `<code class="keybinding leftMouse"></code>`;
break;
case KEYCODE_RMB:
html += `<code class="keybinding rightMouse"></code>`;
break;
case KEYCODE_MMB:
html += `<code class="keybinding middleMouse"></code>`;
break;
case DIVIDER_TOKEN:
html += `<i></i>`;
break;
case ADDER_TOKEN:
html += `+`;
break;
default:
html += `<code class="keybinding">${getStringForKeyCode(
mapper.getBinding(/** @type {KeyCode} */ (key)).keyCode
)}</code>`;
}
}
html += `<label>${handle.label}</label>`;
handle.cachedElement = makeDiv(this.element, null, ["binding"], html);
handle.cachedVisibility = false;
}
}
update() {
this.trackedMapOverviewActive.set(this.root.camera.getIsMapOverlayActive());
for (let i = 0; i < this.keybindings.length; ++i) {
const handle = this.keybindings[i];
const visibility = handle.condition();
if (visibility !== handle.cachedVisibility) {
handle.cachedVisibility = visibility;
handle.cachedElement.classList.toggle("visible", visibility);
}
}
}
}

View File

@ -17,29 +17,7 @@ import { enumHubGoalRewards } from "../../tutorial_goals";
const logger = createLogger("hud/mass_selector");
export class HUDMassSelector extends BaseHUDPart {
createElements(parent) {
const removalKeybinding = this.root.keyMapper
.getBinding(KEYMAPPINGS.massSelect.confirmMassDelete)
.getKeyCodeString();
const abortKeybinding = this.root.keyMapper.getBinding(KEYMAPPINGS.general.back).getKeyCodeString();
const cutKeybinding = this.root.keyMapper
.getBinding(KEYMAPPINGS.massSelect.massSelectCut)
.getKeyCodeString();
const copyKeybinding = this.root.keyMapper
.getBinding(KEYMAPPINGS.massSelect.massSelectCopy)
.getKeyCodeString();
this.element = makeDiv(
parent,
"ingame_HUD_MassSelector",
[],
T.ingame.massSelect.infoText
.replace("<keyDelete>", `<code class='keybinding'>${removalKeybinding}</code>`)
.replace("<keyCut>", `<code class='keybinding'>${cutKeybinding}</code>`)
.replace("<keyCopy>", `<code class='keybinding'>${copyKeybinding}</code>`)
.replace("<keyCancel>", `<code class='keybinding'>${abortKeybinding}</code>`)
);
}
createElements(parent) {}
initialize() {
this.deletionMarker = Loader.getSprite("sprites/misc/deletion_marker.png");
@ -49,6 +27,7 @@ export class HUDMassSelector extends BaseHUDPart {
this.selectedUids = new Set();
this.root.signals.entityQueuedForDestroy.add(this.onEntityDestroyed, this);
this.root.hud.signals.pasteBlueprintRequested.add(this.clearSelection, this);
this.root.camera.downPreHandler.add(this.onMouseDown, this);
this.root.camera.movePreHandler.add(this.onMouseMove, this);
@ -61,7 +40,7 @@ export class HUDMassSelector extends BaseHUDPart {
this.root.keyMapper.getBinding(KEYMAPPINGS.massSelect.massSelectCut).add(this.confirmCut, this);
this.root.keyMapper.getBinding(KEYMAPPINGS.massSelect.massSelectCopy).add(this.startCopy, this);
this.domAttach = new DynamicDomAttach(this.root, this.element);
this.root.hud.signals.selectedPlacementBuildingChanged.add(this.clearSelection, this);
}
/**
@ -83,6 +62,13 @@ export class HUDMassSelector extends BaseHUDPart {
}
}
/**
* Clears the entire selection
*/
clearSelection() {
this.selectedUids = new Set();
}
confirmDelete() {
if (this.selectedUids.size > 100) {
const { ok } = this.root.hud.parts.dialogs.showWarning(
@ -230,10 +216,6 @@ export class HUDMassSelector extends BaseHUDPart {
}
}
update() {
this.domAttach.update(this.selectedUids.size > 0);
}
/**
*
* @param {DrawParameters} parameters

View File

@ -5,7 +5,7 @@ import { T } from "../../../translations";
import { createLogger } from "../../../core/logging";
import { StaticMapEntityComponent } from "../../components/static_map_entity";
import { Vector } from "../../../core/vector";
import { Math_max, Math_min } from "../../../core/builtins";
import { Math_max, Math_min, Math_floor } from "../../../core/builtins";
import { makeOffscreenBuffer } from "../../../core/buffer_utils";
import { DrawParameters } from "../../../core/draw_parameters";
import { Rectangle } from "../../../core/rectangle";
@ -56,7 +56,14 @@ export class HUDScreenshotExporter extends BaseHUDPart {
const dimensions = maxChunk.sub(minChunk);
logger.log("Dimensions:", dimensions);
const chunkSizePixels = 128;
let chunkSizePixels = 128;
const maxDimensions = Math_max(dimensions.x, dimensions.y);
if (maxDimensions > 128) {
chunkSizePixels = Math_max(1, Math_floor(128 * (128 / maxDimensions)));
}
logger.log("ChunkSizePixels:", chunkSizePixels);
const chunkScale = chunkSizePixels / (globalConfig.mapChunkSize * globalConfig.tileSize);
logger.log("Scale:", chunkScale);

View File

@ -28,6 +28,8 @@ import { ShapeDefinition } from "../../shape_definition";
*/
const SHAPE_LABEL_PLACEHOLDER = " ";
const MAX_LABEL_LENGTH = 71;
export class HUDWaypoints extends BaseHUDPart {
/**
* Creates the overview of waypoints
@ -220,7 +222,8 @@ export class HUDWaypoints extends BaseHUDPart {
id: "markerName",
label: null,
placeholder: "",
validator: val => val.length > 0 && (val.length < 15 || ShapeDefinition.isValidShortKey(val)),
validator: val =>
val.length > 0 && (val.length < MAX_LABEL_LENGTH || ShapeDefinition.isValidShortKey(val)),
});
const dialog = new DialogWithForm({
app: this.root.app,
@ -270,8 +273,8 @@ export class HUDWaypoints extends BaseHUDPart {
return 1;
}
return this.getWaypointLabel(a)
.padEnd(20, "0")
.localeCompare(this.getWaypointLabel(b).padEnd(20, "0"));
.padEnd(MAX_LABEL_LENGTH, "0")
.localeCompare(this.getWaypointLabel(b).padEnd(MAX_LABEL_LENGTH, "0"));
});
// Show notification about creation

View File

@ -24,7 +24,7 @@ export const KEYMAPPINGS = {
menuOpenStats: { keyCode: key("G") },
toggleHud: { keyCode: 113 }, // F2
exportScreenshot: { keyCode: 114 }, // F3
exportScreenshot: { keyCode: 114 }, // F3PS
toggleFPSInfo: { keyCode: 115 }, // F4
},
@ -56,7 +56,7 @@ export const KEYMAPPINGS = {
},
placement: {
abortBuildingPlacement: { keyCode: key("Q") },
pipette: { keyCode: key("Q") },
rotateWhilePlacing: { keyCode: key("R") },
rotateInverseModifier: { keyCode: 16 }, // SHIFT
cycleBuildingVariants: { keyCode: key("T") },
@ -88,6 +88,10 @@ for (const categoryId in KEYMAPPINGS) {
}
}
export const KEYCODE_LMB = 1;
export const KEYCODE_MMB = 2;
export const KEYCODE_RMB = 3;
/**
* Returns a keycode -> string
* @param {number} code
@ -95,11 +99,11 @@ for (const categoryId in KEYMAPPINGS) {
*/
export function getStringForKeyCode(code) {
switch (code) {
case 1:
case KEYCODE_LMB:
return "LMB";
case 2:
case KEYCODE_MMB:
return "MMB";
case 3:
case KEYCODE_RMB:
return "RMB";
case 4:
return "MB4";

View File

@ -147,10 +147,32 @@ export class MetaBuilding {
* @param {string} param0.variant
*/
createAndPlaceEntity({ root, origin, rotation, originalRotation, rotationVariant, variant }) {
const entity = this.createEntity({
root,
origin,
rotation,
originalRotation,
rotationVariant,
variant,
});
root.map.placeStaticEntity(entity);
root.entityMgr.registerEntity(entity);
return entity;
}
/**
* Creates the entity without placing it
* @param {object} param0
* @param {GameRoot} param0.root
* @param {Vector} param0.origin Origin tile
* @param {number=} param0.rotation Rotation
* @param {number} param0.originalRotation Original Rotation
* @param {number} param0.rotationVariant Rotation variant
* @param {string} param0.variant
*/
createEntity({ root, origin, rotation, originalRotation, rotationVariant, variant }) {
const entity = new Entity(root);
const blueprintSprite = this.getBlueprintSprite(rotationVariant, variant);
entity.addComponent(
new StaticMapEntityComponent({
spriteKey:
@ -166,12 +188,8 @@ export class MetaBuilding {
blueprintSpriteKey: blueprintSprite ? blueprintSprite.spriteName : "",
})
);
this.setupEntityComponents(entity, root);
this.updateVariants(entity, rotationVariant, variant);
root.map.placeStaticEntity(entity);
root.entityMgr.registerEntity(entity);
return entity;
}

View File

@ -19,7 +19,6 @@ import { SoundProxy } from "./sound_proxy";
import { Savegame } from "../savegame/savegame";
import { GameLogic } from "./logic";
import { ShapeDefinitionManager } from "./shape_definition_manager";
import { CanvasClickInterceptor } from "./canvas_click_interceptor";
import { HubGoals } from "./hub_goals";
import { BufferMaintainer } from "../core/buffer_maintainer";
import { ProductionAnalytics } from "./production_analytics";
@ -110,9 +109,6 @@ export class GameRoot {
/** @type {BufferMaintainer} */
this.buffers = null;
/** @type {CanvasClickInterceptor} */
this.canvasClickInterceptor = null;
/** @type {AutomaticSave} */
this.automaticSave = null;

View File

@ -24,11 +24,17 @@ export class MinerSystem extends GameSystemWithFilter {
// Check if miner is above an actual tile
const minerComp = entity.components.Miner;
const staticComp = entity.components.StaticMapEntity;
const tileBelow = this.root.map.getLowerLayerContentXY(staticComp.origin.x, staticComp.origin.y);
if (!tileBelow) {
continue;
if (!minerComp.cachedMinedItem) {
const staticComp = entity.components.StaticMapEntity;
const tileBelow = this.root.map.getLowerLayerContentXY(
staticComp.origin.x,
staticComp.origin.y
);
if (!tileBelow) {
continue;
}
minerComp.cachedMinedItem = tileBelow;
}
// First, try to get rid of chained items
@ -40,20 +46,9 @@ export class MinerSystem extends GameSystemWithFilter {
}
if (this.root.time.isIngameTimerExpired(minerComp.lastMiningTime, 1 / miningSpeed)) {
const lowerLayerItem = this.root.map.getLowerLayerContentXY(
staticComp.origin.x,
staticComp.origin.y
);
// TODO: Should not be required actually
if (!lowerLayerItem) {
// Nothing below;
continue;
}
if (this.tryPerformMinerEject(entity, lowerLayerItem)) {
if (this.tryPerformMinerEject(entity, minerComp.cachedMinedItem)) {
// Analytics hook
this.root.signals.itemProduced.dispatch(lowerLayerItem);
this.root.signals.itemProduced.dispatch(minerComp.cachedMinedItem);
// Actually mine
minerComp.lastMiningTime = this.root.time.now();
@ -114,18 +109,17 @@ export class MinerSystem extends GameSystemWithFilter {
if (entity && entity.components.Miner) {
const staticComp = entity.components.StaticMapEntity;
const minerComp = entity.components.Miner;
if (!staticComp.shouldBeDrawn(parameters)) {
continue;
}
if (!minerComp.cachedMinedItem) {
continue;
}
const lowerLayerItem = this.root.map.getLowerLayerContentXY(
staticComp.origin.x,
staticComp.origin.y
);
if (lowerLayerItem) {
if (minerComp.cachedMinedItem) {
const padding = 3;
parameters.context.fillStyle = lowerLayerItem.getBackgroundColorAsResource();
parameters.context.fillStyle = minerComp.cachedMinedItem.getBackgroundColorAsResource();
parameters.context.fillRect(
staticComp.origin.x * globalConfig.tileSize + padding,
staticComp.origin.y * globalConfig.tileSize + padding,
@ -134,8 +128,8 @@ export class MinerSystem extends GameSystemWithFilter {
);
}
if (lowerLayerItem) {
lowerLayerItem.draw(
if (minerComp.cachedMinedItem) {
minerComp.cachedMinedItem.draw(
(0.5 + staticComp.origin.x) * globalConfig.tileSize,
(0.5 + staticComp.origin.y) * globalConfig.tileSize,
parameters

View File

@ -80,4 +80,10 @@ export const LANGUAGES = {
code: "no",
region: "",
},
"zh-CN": {
name: "简体中文",
data: require("./built-temp/base-zh-CN.json"),
code: "zh",
region: "CN",
},
};

View File

@ -160,7 +160,7 @@ export const allApplicationSettings = [
*/
(app, id) => {
applyGameTheme(id);
document.body.setAttribute("data-theme", id);
document.documentElement.setAttribute("data-theme", id);
},
enabled: !IS_DEMO,
}),
@ -200,6 +200,7 @@ export const allApplicationSettings = [
new BoolSetting("alwaysMultiplace", categoryGame, (app, value) => {}),
new BoolSetting("enableTunnelSmartplace", categoryGame, (app, value) => {}),
new BoolSetting("vignette", categoryGame, (app, value) => {}),
new BoolSetting("compactBuildingInfo", categoryGame, (app, value) => {}),
];
export function getApplicationSettingById(id) {
@ -223,6 +224,7 @@ class SettingsStorage {
this.offerHints = true;
this.enableTunnelSmartplace = true;
this.vignette = true;
this.compactBuildingInfo = false;
/**
* @type {Object.<string, number>}
@ -412,7 +414,7 @@ export class ApplicationSettings extends ReadWriteProxy {
}
getCurrentVersion() {
return 12;
return 13;
}
/** @param {{settings: SettingsStorage, version: number}} data */
@ -459,6 +461,11 @@ export class ApplicationSettings extends ReadWriteProxy {
data.version = 12;
}
if (data.version < 13) {
data.settings.compactBuildingInfo = false;
data.version = 13;
}
return ExplainedResult.good();
}
}

View File

@ -26,6 +26,7 @@ The base translation is `base-en.yaml`. It will always contain the latest phrase
- [Lithuanian](base-lt.yaml)
- [Arabic](base-ar.yaml)
- [Norwegian](base-no.yaml)
- [Kroatian](base-hr.yaml)
(If you want to translate into a new language, see below!)

View File

@ -239,7 +239,7 @@ dialogs:
blueprintsNotUnlocked:
title: Noch nicht freigeschaltet
desc: >-
Blueprints werden erst in Level 12 freigeschalten!
Blueprints werden erst in Level 12 freigeschaltet!
keybindingsIntroduction:
title: Nützliche Hotkeys
@ -282,15 +282,15 @@ ingame:
createMarker: Marker erstellen
delete: Löschen
pasteLastBlueprint: Letzte Blaupause einfügen
lockBeltDirection: Enable belt planner
plannerSwitchSide: Flip planner side
lockBeltDirection: Bandplaner aktivieren
plannerSwitchSide: 'Planer: Seite wechseln'
# Everything related to placing buildings (I.e. as soon as you selected a building
# from the toolbar)
buildingPlacement:
# Buildings can have different variants which are unlocked at later levels,
# and this is the hint shown when there are multiple variants available.
cycleBuildingVariants: Drücke <key> um zwischen den Varianten zu wählen.
cycleBuildingVariants: Drücke <key>, um zwischen den Varianten zu wählen.
# Shows the hotkey in the ui, e.g. "Hotkey: Q"
hotkeyLabel: >-
@ -538,7 +538,7 @@ storyRewards:
desc: Der <strong>Tunnel</strong> wurde freigeschaltet! Du kannst Items nun unter Gebäuden oder Förderbändern hindurchleiten!
reward_rotater_ccw:
title: gUZS Rotieren
title: Gegen UZS Rotieren
desc: Du hast eine zweite Variante des <strong>Rotierers</strong> freigeschaltet! Damit können Items gegen den Uhrzeigensinn gedreht werden. Wähle den Rotierer aus und <strong>drücke 'T', um auf verschiedene Varianten zuzugreifen</strong>!
reward_miner_chainable:
@ -678,20 +678,20 @@ settings:
super_fast: Sehr schnell
extremely_fast: Extrem schnell
enableTunnelSmartplace:
title: Smart Tunnels
title: Intelligente Tunnel
description: >-
When enabled, placing tunnels will automatically remove unnecessary belts.
This also enables to drag tunnels and excess tunnels will get removed.
Aktiviert das automatische Entfernen von überflüssigen Förderbändern bei der Platzierung von Tunneln.
Außerdem funktioniert das Ziehen von Tunneln und überschüssige werden ebenfalls entfernt.
vignette:
title: Vignette
description: >-
Enables the vignette which darkens the screen corners and makes text easier
to read.
Aktiviert den Vignetteneffekt, der den Rand des Bildschirms zunehmend verdunkelt
und das Lesen der Textfelder vereinfacht.
keybindings:
title: Tastenbelegung
hint: >-
Tipp: Benutze STRG, UMSCH and ALT! Sie aktivieren verschiedene Platzierungsoptionen!
Tipp: Benutze STRG, UMSCH and ALT! Sie aktivieren verschiedene Platzierungsoptionen.
resetKeybindings: Tastenbelegung zurücksetzen.
@ -741,7 +741,7 @@ keybindings:
confirmMassDelete: Massenlöschung bestätigen
cycleBuildings: Gebäude rotieren
massSelectStart: Halten und ziehen zum beginnen
massSelectStart: Halten und ziehen zum Beginnen
massSelectSelectMultiple: Mehrere Areale markieren
massSelectCopy: Areal kopieren
@ -752,8 +752,8 @@ keybindings:
massSelectCut: Areal ausschneiden
exportScreenshot: Ganze Fabrik als Foto exportieren
mapMoveFaster: Schneller bewegen
lockBeltDirection: Enable belt planner
switchDirectionLockSide: 'Planner: Switch side'
lockBeltDirection: Bandplaner aktivieren
switchDirectionLockSide: 'Planer: Seite wechseln'
about:
title: Über dieses Spiel

View File

@ -285,6 +285,10 @@ ingame:
pasteLastBlueprint: Paste last blueprint
lockBeltDirection: Enable belt planner
plannerSwitchSide: Flip planner side
cutSelection: Cut
copySelection: Copy
clearSelection: Clear Selection
pipette: Pipette
# Everything related to placing buildings (I.e. as soon as you selected a building
# from the toolbar)
@ -320,11 +324,6 @@ ingame:
newUpgrade: A new upgrade is available!
gameSaved: Your game has been saved.
# Mass select information, this is when you hold CTRL and then drag with your mouse
# to select multiple buildings
massSelect:
infoText: Press <keyCut> to cut, <keyCopy> to copy, <keyDelete> to remove and <keyCancel> to cancel.
# The "Upgrades" window
shop:
title: Upgrades
@ -688,6 +687,11 @@ settings:
description: >-
Enables the vignette which darkens the screen corners and makes text easier to read.
compactBuildingInfo:
title: Compact Building Infos
description: >-
Shortens info boxes for buildings by only showing their ratios. Otherwise a description and image is shown.
keybindings:
title: Keybindings
hint: >-
@ -735,7 +739,7 @@ keybindings:
painter: *painter
trash: *trash
abortBuildingPlacement: Abort Placement
pipette: Pipette
rotateWhilePlacing: Rotate
rotateInverseModifier: >-
Modifier: Rotate CCW instead

View File

@ -275,7 +275,7 @@ ingame:
# every situation
keybindingsOverlay:
moveMap: Déplacer
selectBuildings: Sélection de la zone
selectBuildings: Sélection d'une zone
stopPlacement: Arrêter le placement
rotateBuilding: Tourner le bâtiment
placeMultiple: Placement multiple
@ -286,8 +286,8 @@ ingame:
createMarker: Créer une balise
delete: Supprimer
pasteLastBlueprint: Copier le dernier patron
lockBeltDirection: Enable belt planner
plannerSwitchSide: Flip planner side
lockBeltDirection: Utiliser le plannificateur de convoyeurs
plannerSwitchSide: Échanger la direction du plannificateur
# Everything related to placing buildings (I.e. as soon as you selected a building
# from the toolbar)
@ -682,15 +682,14 @@ settings:
super_fast: Très rapide
extremely_fast: Extrêmement rapide
enableTunnelSmartplace:
title: Smart Tunnels
title: Tunnels intelligents
description: >-
When enabled, placing tunnels will automatically remove unnecessary belts.
This also enables to drag tunnels and excess tunnels will get removed.
Si cette option est sélectionnée, placer des tunnels effacera automatiquement les convoyeurs inutiles.
Cela permet aussi d'étirer les tunnels et les tunnels en surnombre seront effacés.
vignette:
title: Vignette
title: Effet de vignette
description: >-
Enables the vignette which darkens the screen corners and makes text easier
to read.
Permet l'affichage de l'effet de vignette qui assombrit les coins de l'écran afin de rendre le texte plus facile à lire.
keybindings:
title: Contrôles
@ -756,8 +755,8 @@ keybindings:
massSelectCut: Couper la sélection
exportScreenshot: Exporter toute la base en tant qu'image.
mapMoveFaster: Se déplacer plus vite
lockBeltDirection: Enable belt planner
switchDirectionLockSide: 'Planner: Switch side'
lockBeltDirection: Utiliser le plannificateur de convoyeurs
switchDirectionLockSide: 'Plannificateur: changer de côté'
about:
title: À propos de ce jeu

783
translations/base-hr.yaml Normal file
View File

@ -0,0 +1,783 @@
#
# GAME TRANSLATIONS
#
# Contributing:
#
# If you want to contribute, please make a pull request on this respository
# and I will have a look.
#
# Placeholders:
#
# Do *not* replace placeholders! Placeholders have a special syntax like
# `Hotkey: <key>`. They are encapsulated within angle brackets. The correct
# translation for this one in German for example would be: `Taste: <key>` (notice
# how the placeholder stayed '<key>' and was not replaced!)
#
# Adding a new language:
#
# If you want to add a new language, ask me in the discord and I will setup
# the basic structure so the game also detects it.
#
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 combination of increasingly complex shapes within an infinite map.
# This is the long description for the steam page - It is contained here so you can help to translate it, and I will regulary update the store page.
# NOTICE:
# - Do not translate the first line (This is the gif image at the start of the store)
# - Please keep the markup (Stuff like [b], [list] etc) in the same format
longText: >-
[img]{STEAM_APP_IMAGE}/extras/store_page_gif.gif[/img]
shapez.io is a game about building factories to automate the creation and combination of shapes. Deliver the requested, increasingly complex shapes to progress within the game and unlock upgrades to speed up your factory.
Since the demand raises you will have to scale up your factory to fit the needs - Don't forget about resources though, you will have to expand in the [b]infinite map[/b]!
Since shapes can get boring soon you need to mix colors and paint your shapes with it - Combine red, green and blue color resources to produce different colors and paint shapes with it to satisfy the demand.
This game features 18 levels (Which should keep you busy for hours already!) but I'm constantly adding new content - There is a lot planned!
[b]Standalone Advantages[/b]
[list]
[*] Waypoints
[*] Unlimited Savegames
[*] Dark Mode
[*] More settings
[*] Allow me to further develop shapez.io ❤️
[*] More features in the future!
[/list]
[b]Planned features & Community suggestions[/b]
This game is open source - Anybody can contribute! Besides of that, I listen [b]a lot[/b] to the community! I try to read all suggestions and take as much feedback into account as possible.
[list]
[*] Story mode where buildings cost shapes
[*] More levels & buildings (standalone exclusive)
[*] Different maps, and maybe map obstacles
[*] Configurable map creation (Edit number and size of patches, seed, and more)
[*] More types of shapes
[*] More performance improvements (Although the game already runs pretty good!)
[*] Color blind mode
[*] And much more!
[/list]
Be sure to check out my trello board for the full roadmap! https://trello.com/b/ISQncpJP/shapezio
global:
loading: Loading
error: Error
# How big numbers are rendered, e.g. "10,000"
thousandsDivider: ","
# The suffix for large numbers, e.g. 1.3k, 400.2M, etc.
suffix:
thousands: k
millions: M
billions: B
trillions: T
# Shown for infinitely big numbers
infinite: inf
time:
# Used for formatting past time dates
oneSecondAgo: one second ago
xSecondsAgo: <x> seconds ago
oneMinuteAgo: one minute ago
xMinutesAgo: <x> minutes ago
oneHourAgo: one hour ago
xHoursAgo: <x> hours ago
oneDayAgo: one day ago
xDaysAgo: <x> days ago
# Short formats for times, e.g. '5h 23m'
secondsShort: <seconds>s
minutesAndSecondsShort: <minutes>m <seconds>s
hoursAndMinutesShort: <hours>h <minutes>m
xMinutes: <x> minutes
keys:
tab: TAB
control: CTRL
alt: ALT
escape: ESC
shift: SHIFT
space: SPACE
demoBanners:
# This is the "advertisement" shown in the main menu and other various places
title: Demo Version
intro: >-
Get the standalone to unlock all features!
mainMenu:
play: Play
continue: Continue
newGame: New Game
changelog: Changelog
importSavegame: Import
openSourceHint: This game is open source!
discordLink: Official Discord Server
helpTranslate: Help translate!
madeBy: Made by <author-link>
# This is shown when using firefox and other browsers which are not supported.
browserWarning: >-
Sorry, but the game is known to run slow on your browser! Get the standalone version or download chrome for the full experience.
savegameLevel: Level <x>
savegameLevelUnknown: Unknown Level
contests:
contest_01_03062020:
title: "Contest #01"
desc: Win <strong>$25</strong> for the coolest base!
longDesc: >-
To give something back to you, I thought it would be cool to make weekly contests!
<br><br>
<strong>This weeks topic:</strong> Build the coolest base!
<br><br>
Here's the deal:<br>
<ul class="bucketList">
<li>Submit a screenshot of your base to <strong>contest@shapez.io</strong></li>
<li>Bonus points if you share it on social media!</li>
<li>I will choose 5 screenshots and propose it to the <strong>discord</strong> community to vote.</li>
<li>The winner gets <strong>$25</strong> (Paypal, Amazon Gift Card, whatever you prefer)</li>
<li>Deadline: 07.06.2020 12:00 AM CEST</li>
</ul>
<br>
I'm looking forward to seeing your awesome creations!
showInfo: View
contestOver: This contest has ended - Join the discord to get noticed about new contests!
dialogs:
buttons:
ok: OK
delete: Delete
cancel: Cancel
later: Later
restart: Restart
reset: Reset
getStandalone: Get Standalone
deleteGame: I know what I do
viewUpdate: View Update
showUpgrades: Show Upgrades
showKeybindings: Show Keybindings
importSavegameError:
title: Import Error
text: >-
Failed to import your savegame:
importSavegameSuccess:
title: Savegame Imported
text: >-
Your savegame has been successfully imported.
gameLoadFailure:
title: Game is broken
text: >-
Failed to load your savegame:
confirmSavegameDelete:
title: Confirm deletion
text: >-
Are you sure you want to delete the game?
savegameDeletionError:
title: Failed to delete
text: >-
Failed to delete the savegame:
restartRequired:
title: Restart required
text: >-
You need to restart the game to apply the settings.
editKeybinding:
title: Change Keybinding
desc: Press the key or mouse button you want to assign, or escape to cancel.
resetKeybindingsConfirmation:
title: Reset keybindings
desc: This will reset all keybindings to their default values. Please confirm.
keybindingsResetOk:
title: Keybindings reset
desc: The keybindings have been reset to their respective defaults!
featureRestriction:
title: Demo Version
desc: You tried to access a feature (<feature>) which is not available in the demo. Consider to get the standalone for the full experience!
oneSavegameLimit:
title: Limited savegames
desc: You can only have one savegame at a time in the demo version. Please remove the existing one or get the standalone!
updateSummary:
title: New update!
desc: >-
Here are the changes since you last played:
upgradesIntroduction:
title: Unlock Upgrades
desc: >-
All shapes you produce can be used to unlock upgrades - <strong>Don't destroy your old factories!</strong>
The upgrades tab can be found on the top right corner of the screen.
massDeleteConfirm:
title: Confirm delete
desc: >-
You are deleting a lot of buildings (<count> to be exact)! Are you sure you want to do this?
massCutConfirm:
title: Confirm cut
desc: >-
You are cutting a lot of buildings (<count> to be exact)! Are you sure you want to do this?
blueprintsNotUnlocked:
title: Not unlocked yet
desc: >-
Complete level 12 to unlock Blueprints!
keybindingsIntroduction:
title: Useful keybindings
desc: >-
This game has a lot of keybindings which make it easier to build big factories.
Here are a few, but be sure to <strong>check out the keybindings</strong>!<br><br>
<code class='keybinding'>CTRL</code> + Drag: Select an area.<br>
<code class='keybinding'>SHIFT</code>: Hold to place multiple of one building.<br>
<code class='keybinding'>ALT</code>: Invert orientation of placed belts.<br>
createMarker:
title: New Marker
desc: Give it a meaningful name, you can also include a <strong>short key</strong> of a shape (Which you can generate <a href="https://viewer.shapez.io" target="_blank">here</a>)
markerDemoLimit:
desc: You can only create two custom markers in the demo. Get the standalone for unlimited markers!
exportScreenshotWarning:
title: Export screenshot
desc: You requested to export your base as a screenshot. Please note that this can be quite slow for a big base and even crash your game!
ingame:
# This is shown in the top left corner and displays useful keybindings in
# every situation
keybindingsOverlay:
moveMap: Move
selectBuildings: Select area
stopPlacement: Stop placement
rotateBuilding: Rotate building
placeMultiple: Place multiple
reverseOrientation: Reverse orientation
disableAutoOrientation: Disable auto orientation
toggleHud: Toggle HUD
placeBuilding: Place building
createMarker: Create Marker
delete: Destroy
pasteLastBlueprint: Paste last blueprint
lockBeltDirection: Enable belt planner
plannerSwitchSide: Flip planner side
# Everything related to placing buildings (I.e. as soon as you selected a building
# from the toolbar)
buildingPlacement:
# Buildings can have different variants which are unlocked at later levels,
# and this is the hint shown when there are multiple variants available.
cycleBuildingVariants: Press <key> to cycle variants.
# Shows the hotkey in the ui, e.g. "Hotkey: Q"
hotkeyLabel: >-
Hotkey: <key>
infoTexts:
speed: Speed
range: Range
storage: Storage
oneItemPerSecond: 1 item / second
itemsPerSecond: <x> items / s
itemsPerSecondDouble: (x2)
tiles: <x> tiles
# The notification when completing a level
levelCompleteNotification:
# <level> is replaced by the actual level, so this gets 'Level 03' for example.
levelTitle: Level <level>
completed: Completed
unlockText: Unlocked <reward>!
buttonNextLevel: Next Level
# Notifications on the lower right
notifications:
newUpgrade: A new upgrade is available!
gameSaved: Your game has been saved.
# Mass select information, this is when you hold CTRL and then drag with your mouse
# to select multiple buildings
massSelect:
infoText: Press <keyCut> to cut, <keyCopy> to copy, <keyDelete> to remove and <keyCancel> to cancel.
# The "Upgrades" window
shop:
title: Upgrades
buttonUnlock: Upgrade
# Gets replaced to e.g. "Tier IX"
tier: Tier <x>
# The roman number for each tier
tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X]
maximumLevel: MAXIMUM LEVEL (Speed x<currentMult>)
# The "Statistics" window
statistics:
title: Statistics
dataSources:
stored:
title: Stored
description: Displaying amount of stored shapes in your central building.
produced:
title: Produced
description: Displaying all shapes your whole factory produces, including intermediate products.
delivered:
title: Delivered
description: Displaying shapes which are delivered to your central building.
noShapesProduced: No shapes have been produced so far.
# Displays the shapes per minute, e.g. '523 / m'
shapesPerMinute: <shapes> / m
# Settings menu, when you press "ESC"
settingsMenu:
playtime: Playtime
buildingsPlaced: Buildings
beltsPlaced: Belts
buttons:
continue: Continue
settings: Settings
menu: Return to menu
# Bottom left tutorial hints
tutorialHints:
title: Need help?
showHint: Show hint
hideHint: Close
# When placing a blueprint
blueprintPlacer:
cost: Cost
# Map markers
waypoints:
waypoints: Markers
hub: HUB
description: Left-click a marker to jump to it, right-click to delete it.<br><br>Press <keybinding> to create a marker from the current view, or <strong>right-click</strong> to create a marker at the selected location.
creationSuccessNotification: Marker has been created.
# Interactive tutorial
interactiveTutorial:
title: Tutorial
hints:
1_1_extractor: Place an <strong>extractor</strong> on top of a <strong>circle shape</strong> to extract it!
1_2_conveyor: >-
Connect the extractor with a <strong>conveyor belt</strong> to your hub!<br><br>Tip: <strong>Click and drag</strong> the belt with your mouse!
1_3_expand: >-
This is <strong>NOT</strong> an idle game! Build more extractors and belts to finish the goal quicker.<br><br>Tip: Hold <strong>SHIFT</strong> to place multiple extractors, and use <strong>R</strong> to rotate them.
# All shop upgrades
shopUpgrades:
belt:
name: Belts, Distributor & Tunnels
description: Speed x<currentMult> → x<newMult>
miner:
name: Extraction
description: Speed x<currentMult> → x<newMult>
processors:
name: Cutting, Rotating & Stacking
description: Speed x<currentMult> → x<newMult>
painting:
name: Mixing & Painting
description: Speed x<currentMult> → x<newMult>
# Buildings and their name / description
buildings:
hub:
deliver: Deliver
toUnlock: to unlock
levelShortcut: LVL
belt:
default:
name: &belt Conveyor Belt
description: Transports items, hold and drag to place multiple.
miner: # Internal name for the Extractor
default:
name: &miner Extractor
description: Place over a shape or color to extract it.
chainable:
name: Extractor (Chain)
description: Place over a shape or color to extract it. Can be chained.
underground_belt: # Internal name for the Tunnel
default:
name: &underground_belt Tunnel
description: Allows to tunnel resources under buildings and belts.
tier2:
name: Tunnel Tier II
description: Allows to tunnel resources under buildings and belts.
splitter: # Internal name for the Balancer
default:
name: &splitter Balancer
description: Multifunctional - Evenly distributes all inputs onto all outputs.
compact:
name: Merger (compact)
description: Merges two conveyor belts into one.
compact-inverse:
name: Merger (compact)
description: Merges two conveyor belts into one.
cutter:
default:
name: &cutter Cutter
description: Cuts shapes from top to bottom and outputs both halfs. <strong>If you use only one part, be sure to destroy the other part or it will stall!</strong>
quad:
name: Cutter (Quad)
description: Cuts shapes into four parts. <strong>If you use only one part, be sure to destroy the other parts or it will stall!</strong>
rotater:
default:
name: &rotater Rotate
description: Rotates shapes clockwise by 90 degrees.
ccw:
name: Rotate (CCW)
description: Rotates shapes counter clockwise by 90 degrees.
stacker:
default:
name: &stacker Stacker
description: Stacks both items. If they can not be merged, the right item is placed above the left item.
mixer:
default:
name: &mixer Color Mixer
description: Mixes two colors using additive blending.
painter:
default:
name: &painter Painter
description: &painter_desc Colors the whole shape on the left input with the color from the top input.
mirrored:
name: *painter
description: *painter_desc
double:
name: Painter (Double)
description: Colors the shapes on the left inputs with the color from the top input.
quad:
name: Painter (Quad)
description: Allows to color each quadrant of the shape with a different color.
trash:
default:
name: &trash Trash
description: Accepts inputs from all sides and destroys them. Forever.
storage:
name: Storage
description: Stores excess items, up to a given capacity. Can be used as an overflow gate.
storyRewards:
# Those are the rewards gained from completing the store
reward_cutter_and_trash:
title: Cutting Shapes
desc: You just unlocked the <strong>cutter</strong> - it cuts shapes half from <strong>top to bottom</strong> regardless of its orientation!<br><br>Be sure to get rid of the waste, or otherwise <strong>it will stall</strong> - For this purpose I gave you a trash, which destroys everything you put into it!
reward_rotater:
title: Rotating
desc: The <strong>rotater</strong> has been unlocked! It rotates shapes clockwise by 90 degrees.
reward_painter:
title: Painting
desc: >-
The <strong>painter</strong> has been unlocked - Extract some color veins (just as you do with shapes) and combine it with a shape in the painter to color them!<br><br>PS: If you are colorblind, I'm working on a solution already!
reward_mixer:
title: Color Mixing
desc: The <strong>mixer</strong> has been unlocked - Combine two colors using <strong>additive blending</strong> with this building!
reward_stacker:
title: Combiner
desc: You can now combine shapes with the <strong>combiner</strong>! Both inputs are combined, and if they can be put next to each other, they will be <strong>fused</strong>. If not, the right input is <strong>stacked on top</strong> of the left input!
reward_splitter:
title: Splitter/Merger
desc: The multifunctional <strong>balancer</strong> has been unlocked - It can be used to build bigger factories by <strong>splitting and merging items</strong> onto multiple belts!<br><br>
reward_tunnel:
title: Tunnel
desc: The <strong>tunnel</strong> has been unlocked - You can now tunnel items through belts and buildings with it!
reward_rotater_ccw:
title: CCW Rotating
desc: You have unlocked a variant of the <strong>rotater</strong> - It allows to rotate counter clockwise! To build it, select the rotater and <strong>press 'T' to cycle its variants</strong>!
reward_miner_chainable:
title: Chaining Extractor
desc: You have unlocked the <strong>chaining extractor</strong>! It can <strong>forward its resources</strong> to other extractors so you can more efficiently extract resources!
reward_underground_belt_tier_2:
title: Tunnel Tier II
desc: You have unlocked a new variant of the <strong>tunnel</strong> - It has a <strong>bigger range</strong>, and you can also mix-n-match those tunnels now!
reward_splitter_compact:
title: Compact Balancer
desc: >-
You have unlocked a compact variant of the <strong>balancer</strong> - It accepts two inputs and merges them into one!
reward_cutter_quad:
title: Quad Cutting
desc: You have unlocked a variant of the <strong>cutter</strong> - It allows you to cut shapes in <strong>four parts</strong> instead of just two!
reward_painter_double:
title: Double Painting
desc: You have unlocked a variant of the <strong>painter</strong> - It works as the regular painter but processes <strong>two shapes at once</strong> consuming just one color instead of two!
reward_painter_quad:
title: Quad Painting
desc: You have unlocked a variant of the <strong>painter</strong> - It allows to paint each part of the shape individually!
reward_storage:
title: Storage Buffer
desc: You have unlocked a variant of the <strong>trash</strong> - It allows to store items up to a given capacity!
reward_freeplay:
title: Freeplay
desc: You did it! You unlocked the <strong>free-play mode</strong>! This means that shapes are now randomly generated! (No worries, more content is planned for the standalone!)
reward_blueprints:
title: Blueprints
desc: You can now <strong>copy and paste</strong> parts of your factory! Select an area (Hold CTRL, then drag with your mouse), and press 'C' to copy it.<br><br>Pasting it is <strong>not free</strong>, you need to produce <strong>blueprint shapes</strong> to afford it! (Those you just delivered).
# Special reward, which is shown when there is no reward actually
no_reward:
title: Next level
desc: >-
This level gave you no reward, but the next one will! <br><br> PS: Better don't destroy your existing factory - You need <strong>all</strong> those shapes later again to <strong>unlock upgrades</strong>!
no_reward_freeplay:
title: Next level
desc: >-
Congratulations! By the way, more content is planned for the standalone!
settings:
title: Settings
categories:
game: Game
app: Application
versionBadges:
dev: Development
staging: Staging
prod: Production
buildDate: Built <at-date>
labels:
uiScale:
title: Interface scale
description: >-
Changes the size of the user interface. The interface will still scale based on your device resolution, but this setting controls the amount of scale.
scales:
super_small: Super small
small: Small
regular: Regular
large: Large
huge: Huge
scrollWheelSensitivity:
title: Zoom sensitivity
description: >-
Changes how sensitive the zoom is (Either mouse wheel or trackpad).
sensitivity:
super_slow: Super slow
slow: Slow
regular: Regular
fast: Fast
super_fast: Super fast
movementSpeed:
title: Movement speed
description: >-
Changes how fast the view moves when using the keyboard.
speeds:
super_slow: Super slow
slow: Slow
regular: Regular
fast: Fast
super_fast: Super Fast
extremely_fast: Extremely Fast
language:
title: Language
description: >-
Change the language. All translations are user contributed and might be incomplete!
fullscreen:
title: Fullscreen
description: >-
It is recommended to play the game in fullscreen to get the best experience. Only available in the standalone.
soundsMuted:
title: Mute Sounds
description: >-
If enabled, mutes all sound effects.
musicMuted:
title: Mute Music
description: >-
If enabled, mutes all music.
theme:
title: Game theme
description: >-
Choose the game theme (light / dark).
themes:
dark: Dark
light: Light
refreshRate:
title: Simulation Target
description: >-
If you have a 144hz monitor, change the refresh rate here so the game will properly simulate at higher refresh rates. This might actually decrease the FPS if your computer is too slow.
alwaysMultiplace:
title: Multiplace
description: >-
If enabled, all buildings will stay selected after placement until you cancel it. This is equivalent to holding SHIFT permanently.
offerHints:
title: Hints & Tutorials
description: >-
Whether to offer hints and tutorials while playing. Also hides certain UI elements onto a given level to make it easier to get into the game.
enableTunnelSmartplace:
title: Smart Tunnels
description: >-
When enabled, placing tunnels will automatically remove unnecessary belts. This also enables to drag tunnels and excess tunnels will get removed.
vignette:
title: Vignette
description: >-
Enables the vignette which darkens the screen corners and makes text easier to read.
keybindings:
title: Keybindings
hint: >-
Tip: Be sure to make use of CTRL, SHIFT and ALT! They enable different placement options.
resetKeybindings: Reset Keybindings
categoryLabels:
general: Application
ingame: Game
navigation: Navigating
placement: Placement
massSelect: Mass Select
buildings: Building Shortcuts
placementModifiers: Placement Modifiers
mappings:
confirm: Confirm
back: Back
mapMoveUp: Move Up
mapMoveRight: Move Right
mapMoveDown: Move Down
mapMoveLeft: Move Left
mapMoveFaster: Move Faster
centerMap: Center Map
mapZoomIn: Zoom in
mapZoomOut: Zoom out
createMarker: Create Marker
menuOpenShop: Upgrades
menuOpenStats: Statistics
toggleHud: Toggle HUD
toggleFPSInfo: Toggle FPS and Debug Info
exportScreenshot: Export whole Base as Image
belt: *belt
splitter: *splitter
underground_belt: *underground_belt
miner: *miner
cutter: *cutter
rotater: *rotater
stacker: *stacker
mixer: *mixer
painter: *painter
trash: *trash
abortBuildingPlacement: Abort Placement
rotateWhilePlacing: Rotate
rotateInverseModifier: >-
Modifier: Rotate CCW instead
cycleBuildingVariants: Cycle Variants
confirmMassDelete: Confirm Mass Delete
pasteLastBlueprint: Paste last blueprint
cycleBuildings: Cycle Buildings
lockBeltDirection: Enable belt planner
switchDirectionLockSide: >-
Planner: Switch side
massSelectStart: Hold and drag to start
massSelectSelectMultiple: Select multiple areas
massSelectCopy: Copy area
massSelectCut: Cut area
placementDisableAutoOrientation: Disable automatic orientation
placeMultiple: Stay in placement mode
placeInverse: Invert automatic belt orientation
about:
title: About this Game
body: >-
This game is open source and developed by <a href="https://github.com/tobspr" target="_blank">Tobias Springer</a> (this is me).<br><br>
If you want to contribute, check out <a href="<githublink>" target="_blank">shapez.io on github</a>.<br><br>
This game wouldn't have been possible without the great discord community around my games - You should really join the <a href="<discordlink>" target="_blank">discord server</a>!<br><br>
The soundtrack was made by <a href="https://soundcloud.com/pettersumelius" target="_blank">Peppsen</a> - He's awesome.<br><br>
Finally, huge thanks to my best friend <a href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Without our factorio sessions this game would never have existed.
changelog:
title: Changelog
demo:
features:
restoringGames: Restoring savegames
importingGames: Importing savegames
oneGameLimit: Limited to one savegame
customizeKeybindings: Customizing Keybindings
exportingBase: Exporting whole Base as Image
settingNotAvailable: Not available in the demo.

View File

@ -32,7 +32,7 @@ steamPage:
shapez.io is een spel dat draait om het bouwen van fabrieken om steeds complexere vormen te produceren en deze productie te automatiseren. Lever de gevraagde, steeds complexere vormen, om verder te komen in het spel en om upgrades voor je fabrieken te ontgrendelen.
De vraag naar vormen wordt steeds hoger, wat betekent dat je fabriek moet blijven uitbreiden om dit tegemoet te komen. Om de juiste grondstoffen te delven zul je steeds verder in het [b]oneindig grote speelveld[/b] moeten gaan werken!
De vraag naar vormen wordt steeds groter, wat betekent dat je fabriek moet blijven uitbreiden om dit tegemoet te komen. Om de juiste grondstoffen te delven zul je steeds verder in het [b]oneindig grote speelveld[/b] moeten gaan werken!
Omdat simpele vormen snel saai worden, moet je kleuren mengen om de vormen te verven - combineer rode, groene en blauwe grondstoffen om verschillende kleuren te produceren en gebruik deze om de vormen te verven, zodat je de vraag hiernaar tegemoet kan komen.
@ -76,10 +76,10 @@ global:
# The suffix for large numbers, e.g. 1.3k, 400.2M, etc.
suffix:
thousands: d
thousands: k
millions: M
billions: MJ
trillions: B
billions: B
trillions: T
# Shown for infinitely big numbers
infinite: inf
@ -154,7 +154,7 @@ mainMenu:
showInfo: Laat zien
contestOver: Deze competitie is voorbij - word lid van de discord (engelstalig) om berichten te krijgen van nieuwe competities!
continue: Verder
newGame: Niew Spel
newGame: Nieuw Spel
madeBy: Gemaakt door <author-link>
dialogs:
@ -249,11 +249,11 @@ dialogs:
Hier zijn er een aantal, maar zorg dat je <strong>kijkt naar de sneltoetsen</strong>!<br><br>
<code class='keybinding'>CTRL</code> + slepen: selecteer een gebied om te kopiëren / verwijderen.<br>
<code class='keybinding'>SHIFT</code>: Houd ingedrukt om meerdere van het zelfde gebouw te plaatsen.<br>
<code class='keybinding'>ALT</code>: Draai de richting van geplaatste lopende banden om.<br>
<code class='keybinding'>ALT</code>: Houd ingedrukt om de richting van lopende banden om te draaien wanneer je ze plaatst.<br>
createMarker:
title: Nieuwe markering
desc: Give it a meaningful name, you can also include a <strong>short key</strong> of a shape (Which you can generate <a href="https://viewer.shapez.io" target="_blank">here</a>)
desc: Geef het een betekenisvolle naam. Je kunt ook een <strong>icoontje</strong> van een vorm toevoegen (die je <a href="https://viewer.shapez.io" target="_blank">hier</a> kunt maken)
markerDemoLimit:
desc: Je kunt maar twee markeringen plaatsen in de demo. Koop de standalone voor een ongelimiteerde hoeveelheid markeringen!
@ -263,10 +263,9 @@ dialogs:
Je bent veel gebouwen aan het knippen (<count> om precies te zijn)! Weet je zeker dat je dit wil doen?
exportScreenshotWarning:
title: Export screenshot
title: Exporteer screenshot
desc: >-
You requested to export your base as a screenshot. Please note that this can
be quite slow for a big base and even crash your game!
Je hebt aangegeven dat je jouw basis wil exporteren als screenshot. Als je een grote basis hebt kan dit proces langzaam zijn en er zelfs voor zorgen dat je spel crasht!
ingame:
# This is shown in the top left corner and displays useful keybindings in
@ -275,7 +274,7 @@ ingame:
moveMap: Beweeg speelveld
selectBuildings: Selecteer gebied
stopPlacement: Stop met plaatsen
rotateBuilding: Draai een gebouw
rotateBuilding: Draai gebouw
placeMultiple: Plaats meerdere
reverseOrientation: Omgekeerde oriëntatie
disableAutoOrientation: Schakel auto-oriëntatie uit
@ -302,8 +301,8 @@ ingame:
speed: Snelheid
range: Bereik
storage: Opslag
oneItemPerSecond: 1 item / seconde
itemsPerSecond: <x> items / s
oneItemPerSecond: 1 voorwerp / s
itemsPerSecond: <x> voorwerpen / s
itemsPerSecondDouble: (x2)
tiles: <x> tegels
@ -324,7 +323,7 @@ ingame:
# Mass select information, this is when you hold CTRL and then drag with your mouse
# to select multiple buildings
massSelect:
infoText: Druk op <keyCut> om te knippen, <keyCopy> om te kopiëren, <keyDelete> om te verwijderen en <keyCancel> om de selectie te annuleren.
infoText: Druk op <keyCut> om te knippen, <keyCopy> om te kopiëren, <keyDelete> om te verwijderen en <keyCancel> om te annuleren.
# The "Upgrades" window
shop:
@ -337,7 +336,7 @@ ingame:
# The roman number for each tier
tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X]
maximumLevel: MAXIMUM LEVEL (Snelheid x<currentMult>)
maximumLevel: MAXIMAAL NIVEAU (Snelheid x<currentMult>)
# The "Statistics" window
statistics:
@ -390,12 +389,12 @@ ingame:
interactiveTutorial:
title: Tutorial
hints:
1_1_extractor: Plaats een <strong>ontginner</strong> op een <strong>cirkelvorm</strong> om deze te ontginnen!
1_1_extractor: Plaats een <strong>ontginner</strong> op een <strong>cirkelvorm</strong> om deze te onttrekken!
1_2_conveyor: >-
Verbind de extractor met een <strong>lopende band</strong> aan je hub!<br><br>Tip: <strong>Klik en sleep</strong> de lopende band met je muis!
Verbind de ontginner met een <strong>lopende band</strong> aan je hub!<br><br>Tip: <strong>Klik en sleep</strong> de lopende band met je muis!
1_3_expand: >-
Dit is <strong>GEEN</strong> nietsdoen-spel! bouw meer extractors en lopende banden om het doel sneller te behalen.<br><br>Tip: Houd <strong>SHIFT</strong> ingedrukt om meerdere extractors te plaatsen en gebruik <strong>R</strong> om ze te draaien.
Dit is <strong>GEEN</strong> nietsdoen-spel! bouw meer ontginners en lopende banden om het doel sneller te behalen.<br><br>Tip: Houd <strong>SHIFT</strong> ingedrukt om meerdere ontginners te plaatsen en gebruik <strong>R</strong> om ze te draaien.
# All shop upgrades
shopUpgrades:
@ -422,11 +421,11 @@ buildings:
miner: # Internal name for the Extractor
default:
name: &miner Ontginner
description: Plaats op een vorm of kleur om deze te ontginnen.
description: Plaats op een vorm of kleur om deze te onttrekken.
chainable:
name: Ontginner (Ketting)
description: Plaats op een vorm of kleur om deze te ontginnen. Kan achter elkaar worden geplaatst.
description: Plaats op een vorm of kleur om deze te onttrekken. Kan achter elkaar worden geplaatst.
underground_belt: # Internal name for the Tunnel
default:
@ -512,12 +511,12 @@ storyRewards:
reward_rotater:
title: Roteren
desc: De <strong>roteerder</strong> is ontgrendeld - ! Het draait vormen 90 graden met de klok mee.
desc: De <strong>roteerder</strong> is ontgrendeld - Het draait vormen 90 graden met de klok mee.
reward_painter:
title: Verven
desc: >-
De <strong>verver</strong> is ontgrendeld - Onttrek wat kleurstoffen (net als met vormen) en combineer deze met een vorm in de verver om ze een kleur te geven!<br><br>PS: Ik werk aan een oplossing voor kleurenblinden!
De <strong>verver</strong> is ontgrendeld - Onttrek wat kleurstoffen (net als met vormen) en combineer deze met een vorm in de verver om de vorm een kleur te geven!<br><br>PS: Ik werk aan een oplossing voor kleurenblinden!
reward_mixer:
title: Kleuren mengen
@ -537,11 +536,11 @@ storyRewards:
reward_rotater_ccw:
title: Roteren (andersom)
desc: Je hebt een variant van de <strong>rotater</strong> ontgrendeld - Het roteert voorwerpen tegen de klok in! Om het te bouwen selecteer je de roteerder en <strong>druk je op 'T' om tussen varianten te wisselen</strong>!
desc: Je hebt een variant van de <strong>roteerder</strong> ontgrendeld - Het roteert voorwerpen tegen de klok in! Om het te bouwen selecteer je de roteerder en <strong>druk je op 'T' om tussen varianten te wisselen</strong>!
reward_miner_chainable:
title: Ketting Extractor
desc: Je hebt de <strong>Ketting extractor</strong> ontgrendeld! Deze kan <strong>grondstoffen doorsturen</strong> naar andere extractors, waardoor je efficiënter grondstoffen kan onttrekken!
title: Ketting-ontginner
desc: Je hebt de <strong>Ketting-ontginner</strong> ontgrendeld! Deze kan <strong>grondstoffen doorsturen</strong> naar andere ontginners, waardoor je efficiënter grondstoffen kan onttrekken!
reward_underground_belt_tier_2:
title: Tunnel Niveau II
@ -585,7 +584,7 @@ storyRewards:
no_reward_freeplay:
title: Volgende level
desc: >-
Gefeliciteerd! By the way, het spel wordt in de toekomst nog verder uitgebereid in de standalone!
Gefeliciteerd! Even tussendoor, het spel wordt in de toekomst nog verder uitgebereid in de standalone!
settings:
title: Opties
@ -677,15 +676,14 @@ settings:
super_fast: Super snel
extremely_fast: Extreem snel
enableTunnelSmartplace:
title: Smart Tunnels
title: Slimme Tunnels
description: >-
When enabled, placing tunnels will automatically remove unnecessary belts.
This also enables to drag tunnels and excess tunnels will get removed.
Wanneer dit aan staat zullen tunnels automatisch onnodige lopende banden verwijderen.
Ook kun je dan tunnels slepen en onnodige tunnels worden ook verwijderd.
vignette:
title: Vignette
description: >-
Enables the vignette which darkens the screen corners and makes text easier
to read.
Schakelt de vignet in, wat de hoeken van het scherm donkerder maakt zodat de tekst makkelijker te lezen is.
keybindings:
title: Sneltoetsen
@ -749,30 +747,30 @@ keybindings:
placeInverse: Omkeren richting lopende band
pasteLastBlueprint: Plak laatst gekopiëerde blauwdruk
massSelectCut: Knip geselecteerd gebied
exportScreenshot: Export whole Base as Image
mapMoveFaster: Move Faster
lockBeltDirection: Enable belt planner
switchDirectionLockSide: 'Planner: Switch side'
exportScreenshot: Exporteer volledige basis als afbeelding
mapMoveFaster: Beweeg sneller
lockBeltDirection: Schakel lopende band-planner in
switchDirectionLockSide: 'Planner: Wissel van kant'
about:
title: Over dit spel
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>
Dit spel is open source en ontwikkeld door <a href="https://github.com/tobspr"
target="_blank">Tobias Springer</a> (dit ben ik).<br><br>
If you want to contribute, check out <a href="<githublink>"
target="_blank">shapez.io on github</a>.<br><br>
Als je ook bij wil dragen, ga dan naar <a href="<githublink>"
target="_blank">shapez.io op 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>
Dit spel was niet mogelijk geweest zonder de geweldige discord community
rondom mijn spellen - Je zou eens lid moeten worden van de <a href="<discordlink>"
target="_blank">discord server</a> (engelstalig)!<br><br>
The soundtrack was made by <a href="https://soundcloud.com/pettersumelius"
target="_blank">Peppsen</a> - He's awesome.<br><br>
De muziek is gemaakt door <a href="https://soundcloud.com/pettersumelius"
target="_blank">Peppsen</a> - Hij is geweldig.<br><br>
Finally, huge thanks to my best friend <a
href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Without our
factorio sessions this game would never have existed.
Tot slot wil ik mijn beste vriend <a
href="https://github.com/niklas-dahl" target="_blank">Niklas</a> bedanken - Zonder onze
factorio-sessies zou dit spel nooit bestaan hebben.
changelog:
title: Changelog
@ -783,6 +781,6 @@ demo:
importingGames: Savegames importeren
oneGameLimit: Gelimiteerd tot één savegame
customizeKeybindings: Custom sneltoetsen
exportingBase: Exporting whole Base as Image
exportingBase: Exporteer volledige basis als afbeelding
settingNotAvailable: Niet beschikbaar in de demo.

View File

@ -52,13 +52,13 @@ steamPage:
[b]Zaplanowana zawartość & Sugestie społeczności[/b]
Ta gra jest open-source - Kaźdy może pomóc w rozwoju! Poza tym słucham tego, co społeczność ma do powiedzenia w kwestii gry! Staram się czytać wszystkie sugestie i odbierać jak najwięcej informacji zwrotnych na temat gry.
Ta gra jest open-source - Każdy może pomóc w rozwoju! Poza tym słucham tego, co społeczność ma do powiedzenia w kwestii gry! Staram się czytać wszystkie sugestie i odbierać jak najwięcej informacji zwrotnych na temat gry.
[list]
[*] Kampania, gdzie do budowy potrzeba kształtów
[*] Więcej poziomów i budynków (tylko w pełnej wersji)
[*] Inne mapy, może z przeszkodami
[*] Możliwość modyfikowania parametrów generowanjej mapy (ilość i rozmiar surowców, ziarno świata, itd.)
[*] Możliwość modyfikowania parametrów generowanej mapy (ilość i rozmiar surowców, ziarno świata, itd.)
[*] Więcej rodzajów kształtów
[*] Optymalizacja (mimo wszystko gra już działa dość płynnie!)
[*] Tryb dla ślepoty barw
@ -211,7 +211,7 @@ dialogs:
resetKeybindingsConfirmation:
title: Zresetuj klawiszologię
desc: Ta akcja zresetuje wszystkie ustawienia klawiszologii do domyśnych wartości. Proszę potwierdzić.
desc: Ta akcja zresetuje wszystkie ustawienia klawiszologii do domyślnych wartości. Proszę potwierdzić.
keybindingsResetOk:
title: Reset Klawiszologii
@ -271,7 +271,7 @@ dialogs:
title: Tworzenie zrzutu fabryki
desc: >-
Zamierzasz wyeksportować swoją fabrykę jako zrzut ekranu. W przypadku dużej
fabryki ta akja może być bardzo wolna, a nawet może spowodować zawieszenie się lub awarię gry!
fabryki ta akcja może być bardzo wolna, a nawet może spowodować zawieszenie się lub awarię gry!
Czy na pewno chcesz kontynuować?
ingame:
@ -500,7 +500,7 @@ buildings:
description: Koloruje kształt za pomocą koloru dostarczonego od boku. Koloruje 2 kształty używając 1 barwnika.
quad:
name: Malarz (Poczwórny)
description: Koloruje każdą ćwiarkę kształtu na inny kolor, używając dostarczonych kolorów.
description: Koloruje każdą ćwiartkę kształtu na inny kolor, używając dostarczonych kolorów.
mirrored:
name: *painter
description: *painter_desc
@ -741,7 +741,7 @@ keybindings:
menuOpenStats: Statystyki
toggleHud: Przełącz widoczność interfejsu
toggleFPSInfo: Pokaż Licznik FPS i infomacje do debugowania
toggleFPSInfo: Pokaż Licznik FPS i informacje do debugowania
belt: *belt
splitter: *splitter
underground_belt: *underground_belt

View File

@ -76,10 +76,10 @@ global:
# The suffix for large numbers, e.g. 1.3k, 400.2M, etc.
suffix:
thousands: тыс.
millions: млн
billions: млрд
trillions: трлн
thousands: ' тыс.'
millions: ' млн'
billions: ' млрд'
trillions: ' трлн'
# Shown for infinitely big numbers
infinite:
@ -120,7 +120,7 @@ demoBanners:
mainMenu:
play: Играть
changelog: Список изменений
importSavegame: Импортировать сохраненную игру
importSavegame: Импорт
openSourceHint: Это игра с открытым исходным кодом!
discordLink: Оффициальный Дискорд Сервер
helpTranslate: Помоги с переводом!
@ -156,7 +156,7 @@ mainMenu:
contestOver: Этот конкурс закончился - присоединяйтесь в дискорде, чтобы получать уведомления о новых конкурсах!
continue: Продолжить
newGame: Новая Игра
madeBy: Создано <author-link>
madeBy: Создал <author-link>
dialogs:
buttons:
@ -340,7 +340,7 @@ ingame:
# The roman number for each tier
tierLabels: [I, II, III, IV, V, VI, VII, VIII, IX, X]
maximumLevel: МАКСИМАЛЬНЫЙ УРОВЕНЬ (Скорость x<currentMult>)
maximumLevel: Скорость x<currentMult> (макс.)
# The "Statistics" window
statistics:
@ -476,8 +476,8 @@ buildings:
mixer:
default:
name: &mixer Смеситель
description: Смешивает два цвета с помощью аддитивного смешивания.
name: &mixer Смешиватель
description: Аддитивно смешивает цвета двух красителей.
painter:
default:
@ -523,7 +523,7 @@ storyRewards:
reward_mixer:
title: Смешивание Цветов
desc: Разблокирован <strong>смеситель</strong>! Объедините два цвета в этом здании, используя <strong>аддитивное смешивание</strong>!
desc: Разблокирован <strong>смешиватель</strong>! Объедините два цвета в этом здании, используя <strong>аддитивное смешивание</strong>!
reward_stacker:
title: Объединитель

File diff suppressed because it is too large Load Diff