pull/1233/head
tobspr 3 years ago
commit d24a4a848e

@ -57,6 +57,15 @@
}
}
}
> .buildingsButton {
display: grid;
align-items: center;
@include S(margin-top, 4px);
> button {
@include SuperSmallText;
}
}
}
}
}

@ -13,7 +13,7 @@
> .section {
display: grid;
@include S(grid-gap, 10px);
@include S(grid-gap, 5px);
grid-auto-flow: row;
> button {

@ -72,8 +72,8 @@ export const globalConfig = {
readerAnalyzeIntervalSeconds: 10,
goalAcceptorMinimumDurationSeconds: 5,
goalAcceptorsPerProducer: 4.5,
goalAcceptorItemsRequired: 10,
goalAcceptorsPerProducer: 5,
puzzleModeSpeed: 3,
puzzleMinBoundsSize: 2,
puzzleMaxBoundsSize: 20,

@ -101,8 +101,11 @@ export class Blueprint {
const entity = this.entities[i];
const staticComp = entity.components.StaticMapEntity;
staticComp.rotation = (staticComp.rotation + 90) % 360;
staticComp.originalRotation = (staticComp.originalRotation + 90) % 360;
if (staticComp.getMetaBuilding().getIsRotateable()) {
staticComp.rotation = (staticComp.rotation + 90) % 360;
staticComp.originalRotation = (staticComp.originalRotation + 90) % 360;
}
staticComp.origin = staticComp.origin.rotateFastMultipleOf90(90);
}
}

@ -31,19 +31,26 @@ export class GoalAcceptorComponent extends Component {
clear() {
// the last items we delivered
/** @type {{ item: BaseItem; time: number; }[]} */
this.deliveryHistory = [];
/** @type {{ item: BaseItem; time: number; }} */
this.lastDelivery = null;
this.currentDeliveredItems = 0;
// Used for animations
this.displayPercentage = 0;
}
getRequiredDeliveryHistorySize() {
// clears items but doesn't instantly reset the progress bar
clearItems() {
this.lastDelivery = null;
this.currentDeliveredItems = 0;
}
getRequiredSecondsPerItem() {
return (
(globalConfig.puzzleModeSpeed *
globalConfig.goalAcceptorMinimumDurationSeconds *
globalConfig.beltSpeedItemsPerSecond) /
globalConfig.goalAcceptorsPerProducer
globalConfig.goalAcceptorsPerProducer /
(globalConfig.puzzleModeSpeed * globalConfig.beltSpeedItemsPerSecond)
);
}
}

@ -166,8 +166,8 @@ export class GameMode extends BasicSerializableObject {
}
/** @returns {boolean} */
getSupportsCopyPaste() {
return true;
getHasFreeCopyPaste() {
return false;
}
/** @returns {boolean} */

@ -27,6 +27,8 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
}
initialize() {
this.isCopyPasteFree = this.root.gameMode.getHasFreeCopyPaste();
this.root.hud.signals.buildingsSelectedForCopy.add(this.createBlueprintFromBuildings, this);
/** @type {TypedTrackedState<Blueprint?>} */
@ -82,7 +84,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
update() {
const currentBlueprint = this.currentBlueprint.get();
this.domAttach.update(currentBlueprint && currentBlueprint.getCost() > 0);
this.domAttach.update(!this.isCopyPasteFree && currentBlueprint && currentBlueprint.getCost() > 0);
this.trackedCanAfford.set(currentBlueprint && currentBlueprint.canAfford(this.root));
}
@ -114,7 +116,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
return;
}
if (!blueprint.canAfford(this.root)) {
if (!this.isCopyPasteFree && !blueprint.canAfford(this.root)) {
this.root.soundProxy.playUiError();
return;
}
@ -122,8 +124,10 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
const worldPos = this.root.camera.screenToWorld(pos);
const tile = worldPos.toTileSpace();
if (blueprint.tryPlace(this.root, tile)) {
const cost = blueprint.getCost();
this.root.hubGoals.takeShapeByKey(this.root.gameMode.getBlueprintShapeKey(), cost);
if (!this.isCopyPasteFree) {
const cost = blueprint.getCost();
this.root.hubGoals.takeShapeByKey(this.root.gameMode.getBlueprintShapeKey(), cost);
}
this.root.soundProxy.playUi(SOUNDS.placeBuilding);
}
return STOP_PROPAGATION;
@ -131,7 +135,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
}
/**
* Mose move handler
* Mouse move handler
*/
onMouseMove() {
// Prevent movement while blueprint is selected

@ -1,5 +1,6 @@
import { globalConfig } from "../../../core/config";
import { DrawParameters } from "../../../core/draw_parameters";
import { gMetaBuildingRegistry } from "../../../core/global_registries";
import { createLogger } from "../../../core/logging";
import { STOP_PROPAGATION } from "../../../core/signal";
import { formatBigNumberFull } from "../../../core/utils";
@ -7,6 +8,8 @@ import { Vector } from "../../../core/vector";
import { ACHIEVEMENTS } from "../../../platform/achievement_provider";
import { T } from "../../../translations";
import { Blueprint } from "../../blueprint";
import { MetaBlockBuilding } from "../../buildings/block";
import { MetaConstantProducerBuilding } from "../../buildings/constant_producer";
import { enumMouseButton } from "../../camera";
import { Component } from "../../component";
import { Entity } from "../../entity";
@ -260,7 +263,14 @@ export class HUDMassSelector extends BaseHUDPart {
for (let x = realTileStart.x; x <= realTileEnd.x; ++x) {
for (let y = realTileStart.y; y <= realTileEnd.y; ++y) {
const contents = this.root.map.getLayerContentXY(x, y, this.root.currentLayer);
if (contents && this.root.logic.canDeleteBuilding(contents)) {
const staticComp = contents.components.StaticMapEntity;
if (!staticComp.getMetaBuilding().getIsRemovable(this.root)) {
continue;
}
this.selectedUids.add(contents.uid);
}
}
@ -320,6 +330,11 @@ export class HUDMassSelector extends BaseHUDPart {
renderedUids.add(uid);
const staticComp = contents.components.StaticMapEntity;
if (!staticComp.getMetaBuilding().getIsRemovable(this.root)) {
continue;
}
const bounds = staticComp.getTileSpaceBounds();
parameters.context.beginRoundedRect(
bounds.x * globalConfig.tileSize + boundsBorder,

@ -216,8 +216,8 @@ export class HUDPuzzleEditorReview extends BaseHUDPart {
if (!goalComp.item) {
return T.puzzleMenu.validation.goalAcceptorNoItem;
}
const required = goalComp.getRequiredDeliveryHistorySize();
if (goalComp.deliveryHistory.length < required) {
const required = globalConfig.goalAcceptorItemsRequired;
if (goalComp.currentDeliveredItems < required) {
return T.puzzleMenu.validation.goalAcceptorRateNotMet;
}
}

@ -9,6 +9,8 @@ import { makeDiv } from "../../../core/utils";
import { T } from "../../../translations";
import { StaticMapEntityComponent } from "../../components/static_map_entity";
import { BaseHUDPart } from "../base_hud_part";
import { gMetaBuildingRegistry } from "../../../core/global_registries";
import { MetaBlockBuilding } from "../../buildings/block";
const logger = createLogger("puzzle-editor");
@ -43,8 +45,13 @@ export class HUDPuzzleEditorSettings extends BaseHUDPart {
<div class="buttonBar">
<button class="styledButton trim">${T.ingame.puzzleEditorSettings.trimZone}</button>
<button class="styledButton clear">${T.ingame.puzzleEditorSettings.clearItems}</button>
<button class="styledButton clearItems">${T.ingame.puzzleEditorSettings.clearItems}</button>
</div>
<div class="buildingsButton">
<button class="styledButton clearBuildings">${T.ingame.puzzleEditorSettings.clearBuildings}</button>
</div>
</div>`
);
@ -53,14 +60,35 @@ export class HUDPuzzleEditorSettings extends BaseHUDPart {
bind(".zoneHeight .minus", () => this.modifyZone(0, -1));
bind(".zoneHeight .plus", () => this.modifyZone(0, 1));
bind("button.trim", this.trim);
bind("button.clear", this.clear);
bind("button.clearItems", this.clearItems);
bind("button.clearBuildings", this.clearBuildings);
}
}
clear() {
clearItems() {
this.root.logic.clearAllBeltsAndItems();
}
clearBuildings() {
for (const entity of this.root.entityMgr.getAllWithComponent(StaticMapEntityComponent)) {
const staticComp = entity.components.StaticMapEntity;
const signalComp = entity.components.ConstantSignal;
const goalComp = entity.components.GoalAcceptor;
if (
signalComp ||
goalComp ||
staticComp.getMetaBuilding().id === gMetaBuildingRegistry.findByClass(MetaBlockBuilding).id
) {
continue;
}
this.root.map.removeStaticEntity(entity);
this.root.entityMgr.destroyEntity(entity);
}
this.root.entityMgr.processDestroyList();
}
trim() {
// Now, find the center
const buildings = this.root.entityMgr.entities.slice();

@ -1,6 +1,9 @@
import { gMetaBuildingRegistry } from "../../../core/global_registries";
import { createLogger } from "../../../core/logging";
import { makeDiv } from "../../../core/utils";
import { T } from "../../../translations";
import { MetaBlockBuilding } from "../../buildings/block";
import { StaticMapEntityComponent } from "../../components/static_map_entity";
import { BaseHUDPart } from "../base_hud_part";
const logger = createLogger("puzzle-play");
@ -17,19 +20,41 @@ export class HUDPuzzlePlaySettings extends BaseHUDPart {
null,
["section"],
`
<button class="styledButton clear">${T.ingame.puzzleEditorSettings.clearItems}</button>
<button class="styledButton clearItems">${T.ingame.puzzleEditorSettings.clearItems}</button>
<button class="styledButton clearBuildings">${T.ingame.puzzleEditorSettings.clearBuildings}</button>
`
);
bind("button.clear", this.clear);
bind("button.clearItems", this.clearItems);
bind("button.clearBuildings", this.clearBuildings);
}
}
clear() {
clearItems() {
this.root.logic.clearAllBeltsAndItems();
}
clearBuildings() {
for (const entity of this.root.entityMgr.getAllWithComponent(StaticMapEntityComponent)) {
const staticComp = entity.components.StaticMapEntity;
const signalComp = entity.components.ConstantSignal;
const goalComp = entity.components.GoalAcceptor;
if (
signalComp ||
goalComp ||
staticComp.getMetaBuilding().id === gMetaBuildingRegistry.findByClass(MetaBlockBuilding).id
) {
continue;
}
this.root.map.removeStaticEntity(entity);
this.root.entityMgr.destroyEntity(entity);
}
this.root.entityMgr.processDestroyList();
}
initialize() {
this.visible = true;
}

@ -158,10 +158,9 @@ export class MetaBuilding {
/**
* Returns whether this building is rotateable
* @param {string} variant
* @returns {boolean}
*/
getIsRotateable(variant) {
getIsRotateable() {
return true;
}
@ -243,7 +242,7 @@ export class MetaBuilding {
* @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array<Entity> }}
*/
computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) {
if (!this.getIsRotateable(variant)) {
if (!this.getIsRotateable()) {
return {
rotation: 0,
rotationVariant: 0,

@ -7,6 +7,8 @@ import { types } from "../../savegame/serialization";
import { enumGameModeTypes, GameMode } from "../game_mode";
import { HUDPuzzleBackToMenu } from "../hud/parts/puzzle_back_to_menu";
import { HUDPuzzleDLCLogo } from "../hud/parts/puzzle_dlc_logo";
import { HUDBlueprintPlacer } from "../hud/parts/blueprint_placer";
import { HUDMassSelector } from "../hud/parts/mass_selector";
export class PuzzleGameMode extends GameMode {
static getType() {
@ -30,6 +32,8 @@ export class PuzzleGameMode extends GameMode {
this.additionalHudParts = {
puzzleBackToMenu: HUDPuzzleBackToMenu,
puzzleDlcLogo: HUDPuzzleDLCLogo,
blueprintPlacer: HUDBlueprintPlacer,
massSelector: HUDMassSelector,
};
this.zoneWidth = data.zoneWidth || 8;
@ -79,8 +83,8 @@ export class PuzzleGameMode extends GameMode {
return false;
}
getSupportsCopyPaste() {
return false;
getHasFreeCopyPaste() {
return true;
}
throughputDoesNotMatter() {

@ -24,13 +24,15 @@ export class GoalAcceptorSystem extends GameSystemWithFilter {
const entity = this.allEntities[i];
const goalComp = entity.components.GoalAcceptor;
// filter the ones which are no longer active, or which are not the same
goalComp.deliveryHistory = goalComp.deliveryHistory.filter(
d =>
now - d.time < globalConfig.goalAcceptorMinimumDurationSeconds && d.item === goalComp.item
);
if (!goalComp.lastDelivery) {
continue;
}
if (now - goalComp.lastDelivery.time > goalComp.getRequiredSecondsPerItem()) {
goalComp.clearItems();
}
if (goalComp.deliveryHistory.length < goalComp.getRequiredDeliveryHistorySize()) {
if (goalComp.currentDeliveredItems < globalConfig.goalAcceptorItemsRequired) {
allAccepted = false;
}
}
@ -64,8 +66,8 @@ export class GoalAcceptorSystem extends GameSystemWithFilter {
const staticComp = contents[i].components.StaticMapEntity;
const item = goalComp.item;
const requiredItemsForSuccess = goalComp.getRequiredDeliveryHistorySize();
const percentage = clamp(goalComp.deliveryHistory.length / requiredItemsForSuccess, 0, 1);
const requiredItemsForSuccess = globalConfig.goalAcceptorItemsRequired;
const percentage = clamp(goalComp.currentDeliveredItems / requiredItemsForSuccess, 0, 1);
const center = staticComp.getTileSpaceBounds().getCenter().toWorldSpace();
if (item) {
@ -78,7 +80,7 @@ export class GoalAcceptorSystem extends GameSystemWithFilter {
);
}
const isValid = item && goalComp.deliveryHistory.length >= requiredItemsForSuccess;
const isValid = item && goalComp.currentDeliveredItems >= requiredItemsForSuccess;
parameters.context.translate(center.x, center.y);
parameters.context.rotate((staticComp.rotation / 180) * Math.PI);
@ -90,7 +92,7 @@ export class GoalAcceptorSystem extends GameSystemWithFilter {
// progress arc
goalComp.displayPercentage = lerp(goalComp.displayPercentage, percentage, 0.3);
goalComp.displayPercentage = lerp(goalComp.displayPercentage, percentage, 0.2);
const startAngle = Math.PI * 0.595;
const maxAngle = Math.PI * 1.82;

@ -1,3 +1,4 @@
import { globalConfig } from "../../core/config";
import { BaseItem } from "../base_item";
import { enumColorMixingResults, enumColors } from "../colors";
import {
@ -572,23 +573,23 @@ export class ItemProcessorSystem extends GameSystemWithFilter {
const item = payload.items[0].item;
const now = this.root.time.now();
if (goalComp.item && !item.equals(goalComp.item)) {
goalComp.clearItems();
} else {
goalComp.currentDeliveredItems = Math.min(
goalComp.currentDeliveredItems + 1,
globalConfig.goalAcceptorItemsRequired
);
}
if (this.root.gameMode.getIsEditor()) {
// while playing in editor, assign the item
goalComp.item = payload.items[0].item;
goalComp.deliveryHistory.push({
item,
time: now,
});
} else {
// otherwise, make sure it is the same, otherwise reset
if (item.equals(goalComp.item)) {
goalComp.deliveryHistory.push({
item,
time: now,
});
} else {
goalComp.deliveryHistory = [];
}
}
goalComp.lastDelivery = {
item,
time: now,
};
}
}

@ -632,6 +632,7 @@ ingame:
zoneHeight: Height
trimZone: Trim
clearItems: Clear Items
clearBuildings: Clear Buildings
share: Share
report: Report

@ -262,8 +262,8 @@ dialogs:
title: Inserisci codice
desc: Inserisci il codice del puzzle per caricarlo.
puzzleDelete:
title: Delete Puzzle?
desc: Are you sure you want to delete '<title>'? This can not be undone!
title: Cancellare il puzzle?
desc: Sei sicuro di voler cancellare '<title>'? Questa azione non può essere annullata!
ingame:
keybindingsOverlay:
moveMap: Sposta
@ -455,7 +455,7 @@ ingame:
obiettivi</strong>
- 3. Una volta che un accettore di obiettivi riceve una forma per un
certo lasso di tempo, lo <strong>salva come obiettivo</strong> che
il giocatore dovrà poi produrre (Indicato dal <strong>aimbolo
il giocatore dovrà poi produrre (Indicato dal <strong>simbolo
verde</strong>).
- 4. Clicca il <strong>bottone di blocco</strong> su un edificio per
disabilitarlo.
@ -694,16 +694,16 @@ buildings:
livello elettrico come oggetti sul livello normale.
constant_producer:
default:
name: Constant Producer
description: Constantly outputs a specified shape or color.
name: Produttore costante
description: Produce costantemente una forma o un colore specificati.
goal_acceptor:
default:
name: Goal Acceptor
description: Deliver shapes to the goal acceptor to set them as a goal.
name: Accettore di obiettivi.
description: Consegna forme all'accettore di obiettivi per impostarli come obiettivo.
block:
default:
name: Block
description: Allows you to block a tile.
name: Blocco
description: Blocca una casella.
storyRewards:
reward_cutter_and_trash:
title: Taglio forme
@ -829,7 +829,7 @@ storyRewards:
letto? Prova a mostrarlo su di un display!"
reward_constant_signal:
title: Sengale costante
desc: Hai sblocatto l'edificio <strong>segnale costante</strong> sul livello
desc: Hai sbloccato l'edificio <strong>segnale costante</strong> sul livello
elettrico! È utile collegarlo ai <strong>filtri di oggetti</strong>
per esempio.<br><br> Il segnale costante può emettere una
<strong>forma</strong>, un <strong>colore</strong> o un
@ -1123,7 +1123,7 @@ keybindings:
rotateToLeft: "Ruota: punta a sinistra"
constant_producer: Produttore costante
goal_acceptor: Accettore di obiettivi
block: Bloca
block: Blocco
massSelectClear: Sgombra nastri
about:
title: Riguardo questo gioco
@ -1138,7 +1138,8 @@ about:
La colonna sonora è stata composta da<a href="https://soundcloud.com/pettersumelius" target="_blank"> Peppsen</a> - È un grande.<br><br>
Per finire, grazie di cuore al mio migliore amico <a href="https://github.com/niklas-dahl" target="_blank">Niklas</a> - Senza le nostre sessioni su factorio questo gioco non sarebbe mai esistito.
Per finire, grazie di cuore al mio migliore amico <a href="https://github.com/niklas-dahl" target="_blank">Niklas</a> -
Senza le nostre sessioni su factorio questo gioco non sarebbe mai esistito.
changelog:
title: Registro modifiche
demo:
@ -1241,14 +1242,14 @@ puzzleMenu:
easy: Facili
hard: Difficili
completed: Completati
medium: Medium
official: Official
trending: Trending today
trending-weekly: Trending weekly
categories: Categories
difficulties: By Difficulty
account: My Puzzles
search: Search
medium: Medi
official: Ufficiali
trending: Più popolari di oggi
trending-weekly: Più popolari della settimana
categories: Categorie
difficulties: Per difficoltà
account: I miei puzzle
search: Cerca
validation:
title: Puzzle non valido
noProducers: Per favore posiziona un Produttore costante!
@ -1264,9 +1265,9 @@ puzzleMenu:
produttori costanti non consegnino direttamente agli accettori di
obiettivi.
difficulties:
easy: Easy
medium: Medium
hard: Hard
easy: Facile
medium: Medio
hard: Difficile
backendErrors:
ratelimit: Stai facendo troppe azioni velocemente. Per favore attendi un attimo.
invalid-api-key: Comunicazione con il backend fallita, per favore prova ad
@ -1290,6 +1291,6 @@ backendErrors:
bad-payload: La richiesta contiene dati non validi.
bad-building-placement: Il tuo puzzle contiene edifici non validi.
timeout: La richiesta è scaduta.
too-many-likes-already: The puzzle alreay got too many likes. If you still want
to remove it, please contact support@shapez.io!
no-permission: You do not have the permission to perform this action.
too-many-likes-already: Questo puzzle ha già ricevuto troppi "mi piace". Se vuoi ancora
rimuoverlo, per favore contatta support@shapez.io!
no-permission: Non hai i permessi per eseguire questa azione.

@ -175,7 +175,7 @@ dialogs:
title: 아이템 설정
puzzleLoadFailed:
title: 퍼즐 불러오기 실패
desc: "Unfortunately the puzzles could not be loaded:"
desc: "불행히도 이 퍼즐은 불러오는데 실패하였습니다:"
submitPuzzle:
title: 퍼즐 보내기
descName: "퍼즐에 이름을 지어 주세요:"
@ -226,8 +226,8 @@ dialogs:
title: 짧은 키 입력
desc: 불러올 퍼즐의 짧은 키를 입력해 주세요.
puzzleDelete:
title: Delete Puzzle?
desc: Are you sure you want to delete '<title>'? This can not be undone!
title: 퍼즐을 지우시겠습니까?
desc: 정말로 퍼즐:'<title>'을 지우시겠습니까? 이것은 돌릴수 없습니다!
ingame:
keybindingsOverlay:
moveMap: 이동
@ -956,14 +956,14 @@ keybindings:
comparator: 비교기
item_producer: 아이템 생성기 (샌드박스)
copyWireValue: "전선: 커서 아래 값 복사"
rotateToUp: "Rotate: Point Up"
rotateToDown: "Rotate: Point Down"
rotateToRight: "Rotate: Point Right"
rotateToLeft: "Rotate: Point Left"
rotateToUp: "위로 향하게 회전"
rotateToDown: "아래로 향하게 회전"
rotateToRight: "오른쪽으로 향하게 회전"
rotateToLeft: "아래쪽으로 향하게 회전"
constant_producer: 일정 생성기
goal_acceptor: Goal Acceptor
block: Block
massSelectClear: Clear belts
goal_acceptor: 목표 수집기
block: 블록
massSelectClear: 밸트를 클리어합니다
about:
title: 게임 정보
body: >-
@ -1062,14 +1062,14 @@ puzzleMenu:
easy: 쉬움
hard: 어러움
completed: 완료함
medium: Medium
official: Official
trending: Trending today
trending-weekly: Trending weekly
categories: Categories
difficulties: By Difficulty
account: My Puzzles
search: Search
medium: 중간
official: 공식
trending: 오늘의 인기
trending-weekly: 이 주의 인기
categories: 카테고리
difficulties: 어려운 순서로
account: 내 퍼즐들
search: 검색
validation:
title: 잘못된 퍼즐
noProducers: 일정 생성기를 배치해주세요!
@ -1079,9 +1079,9 @@ puzzleMenu:
buildingOutOfBounds: 하나 이상의 건물이 지을 수 있는 영역 밖에 존재합니다. 영역을 늘리거나 건물을 제거하세요.
autoComplete: 퍼즐이 스스로 완료됩니다! 일정 생성기가 만든 모양이 목표 수집기로 바로 들어가고 있는건 아닌지 확인해주세요.
difficulties:
easy: Easy
medium: Medium
hard: Hard
easy: 쉬움
medium: 중간
hard: 어려움
backendErrors:
ratelimit: 너무 빠른 시간 내 작업을 반복하고 있습니다. 조금만 기다려 주세요.
invalid-api-key: 백엔드 서버와 통신할 수 없습니다. 게임을 업데이트하거나 재시작해 주세요 (잘못된 API 키).
@ -1102,6 +1102,5 @@ backendErrors:
bad-payload: 요청이 잘못된 데이터를 포함하고 있습니다.
bad-building-placement: 퍼즐에 잘못된 곳에 위치한 건물이 있습니다.
timeout: 요청 시간이 초과되었습니다.
too-many-likes-already: The puzzle alreay got too many likes. If you still want
to remove it, please contact support@shapez.io!
no-permission: You do not have the permission to perform this action.
too-many-likes-already: 이 퍼즐은 이미 너무 많은 하트를 받았습니다. 그래도 부족하다면 support@shapez.io로 문의하세요!
no-permission: 이 작업을 할 권한이 없습니다

@ -207,7 +207,7 @@ dialogs:
title: Puzzel indienen
descName: "Geef je puzzel een naam:"
descIcon: "Voer een unieke vorm sleutel in, die wordt weergegeven als het icoon
van uw puzzel (je kunt ze <link>hier</link> genereren, of je kunt er
van je puzzel (je kunt ze <link>hier</link> genereren, of je kunt er
een kiezen van de willekeurig voorgestelde vormen hieronder):"
placeholderName: Puzzel Naam
puzzleResizeBadBuildings:
@ -256,13 +256,13 @@ dialogs:
desc: De puzzel is gemarkeerd.
puzzleReportError:
title: Melden mislukt
desc: "Uw melding kan niet worden verwerkt:"
desc: "Je melding kan niet worden verwerkt:"
puzzleLoadShortKey:
title: Voer een vorm sleutel in
desc: Voer de vorm sleutel van de puzzel in om deze te laden.
puzzleDelete:
title: Delete Puzzle?
desc: Are you sure you want to delete '<title>'? This can not be undone!
title: Puzzel verwijderen?
desc: Weet je zeker dat je '<title>' wilt verwijderen? Dit kan niet ongedaan gemaakt worden!
ingame:
keybindingsOverlay:
moveMap: Beweeg rond de wereld
@ -1137,7 +1137,7 @@ demo:
settingNotAvailable: Niet beschikbaar in de demo.
tips:
- De HUB accepteert elke vorm van invoer, niet alleen de huidige vorm!
- Zorg ervoor dat uw fabrieken modulair zijn - het loont!
- Zorg ervoor dat je fabrieken modulair zijn - het loont!
- Bouw niet te dicht bij de HUB, anders wordt het een enorme chaos!
- Als het stapelen niet werkt, probeer dan de invoeren om te wisselen.
- Je kunt de richting van de lopende band planner wijzigen door op <b>R</b>
@ -1173,25 +1173,25 @@ tips:
- Vormontginningen die verder van de HUB verwijderd zijn, zijn complexer.
- Machines hebben een beperkte snelheid, verdeel ze voor maximale
efficiëntie.
- Gebruik verdelers om uw efficiëntie te maximaliseren.
- Gebruik verdelers om je efficiëntie te maximaliseren.
- Organisatie is belangrijk. Probeer de lopende banden niet te veel over te
steken.
- Plan van tevoren, anders wordt het een enorme chaos!
- Verwijder uw oude fabrieken niet! Je hebt ze nodig om upgrades te
- Verwijder je oude fabrieken niet! Je hebt ze nodig om upgrades te
ontgrendelen.
- Probeer in je eentje level 20 te verslaan voordat je hulp zoekt!
- Maak de dingen niet ingewikkeld, probeer eenvoudig te blijven en je zult
ver komen.
- Mogelijk zul je later in het spel fabrieken moeten hergebruiken. Plan uw
- Mogelijk zul je later in het spel fabrieken moeten hergebruiken. Plan je
fabrieken zodat ze herbruikbaar zijn.
- Soms kun je een gewenste vorm op de kaart vinden zonder deze met
stapelaars te maken.
- Volle windmolens kunnen nooit op natuurlijke wijze spawnen.
- Kleur uw vormen voordat je ze knipt voor maximale efficiëntie.
- Kleur je vormen voordat je ze knipt voor maximale efficiëntie.
- Bij modules is ruimte slechts een beleving; een zorg voor sterfelijke
mannen.
- Maak een aparte blueprint fabriek. Ze zijn belangrijk voor modules.
- Bekijk de kleurenmixer eens wat beter, en uw vragen worden beantwoord.
- Bekijk de kleurenmixer eens wat beter, en je vragen worden beantwoord.
- Gebruik <b>CTRL</b> + klik om een gebied te selecteren.
- Te dicht bij de HUB bouwen kan latere projecten in de weg staan.
- Met het speldpictogram naast elke vorm in de upgradelijst zet deze vast op
@ -1204,11 +1204,11 @@ tips:
- Dit spel heeft veel handige sneltoetsen! Bekijk zeker de
instellingenpagina.
- Dit spel heeft veel instellingen, bekijk ze zeker!
- De markering naar uw HUB heeft een klein kompas om de richting aan te
- De markering naar je HUB heeft een klein kompas om de richting aan te
geven!
- Om de lopende banden leeg te maken, kun je een gebied kopiëren en plakken
op dezelfde locatie.
- Druk op F4 om uw FPS en Tick Rate weer te geven.
- Druk op F4 om je FPS en Tick Rate weer te geven.
- Druk twee keer op F4 om de tegel van je muis en camera weer te geven.
- Je kan aan de linkerkant op een vastgezette vorm klikken om deze los te
maken.
@ -1222,6 +1222,7 @@ puzzleMenu:
validatingPuzzle: Puzzel Valideren
submittingPuzzle: Puzzel Indienen
noPuzzles: Er zijn momenteel geen puzzels in deze sectie.
dlcHint: Heb je de DLC al gekocht? Zorg ervoor dat het is geactiveerd door met de rechtermuisknop op shapez.io in uw bibliotheek te klikken, Eigenschappen > DLC's te selecteren.
categories:
levels: Levels
new: Nieuw
@ -1231,13 +1232,13 @@ puzzleMenu:
hard: Moeilijk
completed: Voltooid
medium: Medium
official: Official
trending: Trending today
trending-weekly: Trending weekly
categories: Categories
difficulties: By Difficulty
account: My Puzzles
search: Search
official: Officieell
trending: Trending vandaag
trending-weekly: Trending wekelijks
categories: Categorieën
difficulties: Op Moeilijkheidsgraad
account: Mijn Puzzels
search: Zoeken
validation:
title: Ongeldige Puzzel
noProducers: Plaats alstublieft een Constante Producent!
@ -1251,9 +1252,9 @@ puzzleMenu:
autoComplete: Je puzzel voltooit zichzelf automatisch! Zorg ervoor dat je
Constante Producenten niet rechtstreeks aan je Ontvangers leveren.
difficulties:
easy: Easy
easy: Makkelijk
medium: Medium
hard: Hard
hard: Moeilijk
backendErrors:
ratelimit: Je voert je handelingen te vaak uit. Wacht alstublieft even.
invalid-api-key: Kan niet communiceren met de servers, probeer alstublieft het
@ -1277,6 +1278,5 @@ backendErrors:
bad-payload: Het verzoek bevat ongeldige gegevens.
bad-building-placement: Je puzzel bevat ongeldig geplaatste gebouwen.
timeout: Het verzoek is verlopen.
too-many-likes-already: The puzzle alreay got too many likes. If you still want
to remove it, please contact support@shapez.io!
no-permission: You do not have the permission to perform this action.
too-many-likes-already: De puzzel heeft al te veel likes. Als je het nog steeds wilt verwijderen, neem dan contact op support@shapez.io!
no-permission: Je bent niet gemachtigd om deze actie uit te voeren.

Loading…
Cancel
Save