mirror of
https://github.com/tobspr/shapez.io.git
synced 2024-10-27 20:34:29 +00:00
Merge branch 'master' of https://github.com/tobspr/shapez.io
This commit is contained in:
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 {
|
> .section {
|
||||||
display: grid;
|
display: grid;
|
||||||
@include S(grid-gap, 10px);
|
@include S(grid-gap, 5px);
|
||||||
grid-auto-flow: row;
|
grid-auto-flow: row;
|
||||||
|
|
||||||
> button {
|
> button {
|
||||||
|
@ -72,8 +72,8 @@ export const globalConfig = {
|
|||||||
|
|
||||||
readerAnalyzeIntervalSeconds: 10,
|
readerAnalyzeIntervalSeconds: 10,
|
||||||
|
|
||||||
goalAcceptorMinimumDurationSeconds: 5,
|
goalAcceptorItemsRequired: 10,
|
||||||
goalAcceptorsPerProducer: 4.5,
|
goalAcceptorsPerProducer: 5,
|
||||||
puzzleModeSpeed: 3,
|
puzzleModeSpeed: 3,
|
||||||
puzzleMinBoundsSize: 2,
|
puzzleMinBoundsSize: 2,
|
||||||
puzzleMaxBoundsSize: 20,
|
puzzleMaxBoundsSize: 20,
|
||||||
|
@ -101,8 +101,11 @@ export class Blueprint {
|
|||||||
const entity = this.entities[i];
|
const entity = this.entities[i];
|
||||||
const staticComp = entity.components.StaticMapEntity;
|
const staticComp = entity.components.StaticMapEntity;
|
||||||
|
|
||||||
staticComp.rotation = (staticComp.rotation + 90) % 360;
|
if (staticComp.getMetaBuilding().getIsRotateable()) {
|
||||||
staticComp.originalRotation = (staticComp.originalRotation + 90) % 360;
|
staticComp.rotation = (staticComp.rotation + 90) % 360;
|
||||||
|
staticComp.originalRotation = (staticComp.originalRotation + 90) % 360;
|
||||||
|
}
|
||||||
|
|
||||||
staticComp.origin = staticComp.origin.rotateFastMultipleOf90(90);
|
staticComp.origin = staticComp.origin.rotateFastMultipleOf90(90);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -31,19 +31,26 @@ export class GoalAcceptorComponent extends Component {
|
|||||||
|
|
||||||
clear() {
|
clear() {
|
||||||
// the last items we delivered
|
// the last items we delivered
|
||||||
/** @type {{ item: BaseItem; time: number; }[]} */
|
/** @type {{ item: BaseItem; time: number; }} */
|
||||||
this.deliveryHistory = [];
|
this.lastDelivery = null;
|
||||||
|
|
||||||
|
this.currentDeliveredItems = 0;
|
||||||
|
|
||||||
// Used for animations
|
// Used for animations
|
||||||
this.displayPercentage = 0;
|
this.displayPercentage = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
getRequiredDeliveryHistorySize() {
|
// clears items but doesn't instantly reset the progress bar
|
||||||
|
clearItems() {
|
||||||
|
this.lastDelivery = null;
|
||||||
|
|
||||||
|
this.currentDeliveredItems = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
getRequiredSecondsPerItem() {
|
||||||
return (
|
return (
|
||||||
(globalConfig.puzzleModeSpeed *
|
globalConfig.goalAcceptorsPerProducer /
|
||||||
globalConfig.goalAcceptorMinimumDurationSeconds *
|
(globalConfig.puzzleModeSpeed * globalConfig.beltSpeedItemsPerSecond)
|
||||||
globalConfig.beltSpeedItemsPerSecond) /
|
|
||||||
globalConfig.goalAcceptorsPerProducer
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -166,8 +166,8 @@ export class GameMode extends BasicSerializableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** @returns {boolean} */
|
/** @returns {boolean} */
|
||||||
getSupportsCopyPaste() {
|
getHasFreeCopyPaste() {
|
||||||
return true;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @returns {boolean} */
|
/** @returns {boolean} */
|
||||||
|
@ -27,6 +27,8 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
|
|||||||
}
|
}
|
||||||
|
|
||||||
initialize() {
|
initialize() {
|
||||||
|
this.isCopyPasteFree = this.root.gameMode.getHasFreeCopyPaste();
|
||||||
|
|
||||||
this.root.hud.signals.buildingsSelectedForCopy.add(this.createBlueprintFromBuildings, this);
|
this.root.hud.signals.buildingsSelectedForCopy.add(this.createBlueprintFromBuildings, this);
|
||||||
|
|
||||||
/** @type {TypedTrackedState<Blueprint?>} */
|
/** @type {TypedTrackedState<Blueprint?>} */
|
||||||
@ -82,7 +84,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
|
|||||||
|
|
||||||
update() {
|
update() {
|
||||||
const currentBlueprint = this.currentBlueprint.get();
|
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));
|
this.trackedCanAfford.set(currentBlueprint && currentBlueprint.canAfford(this.root));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,7 +116,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!blueprint.canAfford(this.root)) {
|
if (!this.isCopyPasteFree && !blueprint.canAfford(this.root)) {
|
||||||
this.root.soundProxy.playUiError();
|
this.root.soundProxy.playUiError();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -122,8 +124,10 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
|
|||||||
const worldPos = this.root.camera.screenToWorld(pos);
|
const worldPos = this.root.camera.screenToWorld(pos);
|
||||||
const tile = worldPos.toTileSpace();
|
const tile = worldPos.toTileSpace();
|
||||||
if (blueprint.tryPlace(this.root, tile)) {
|
if (blueprint.tryPlace(this.root, tile)) {
|
||||||
const cost = blueprint.getCost();
|
if (!this.isCopyPasteFree) {
|
||||||
this.root.hubGoals.takeShapeByKey(this.root.gameMode.getBlueprintShapeKey(), cost);
|
const cost = blueprint.getCost();
|
||||||
|
this.root.hubGoals.takeShapeByKey(this.root.gameMode.getBlueprintShapeKey(), cost);
|
||||||
|
}
|
||||||
this.root.soundProxy.playUi(SOUNDS.placeBuilding);
|
this.root.soundProxy.playUi(SOUNDS.placeBuilding);
|
||||||
}
|
}
|
||||||
return STOP_PROPAGATION;
|
return STOP_PROPAGATION;
|
||||||
@ -131,7 +135,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mose move handler
|
* Mouse move handler
|
||||||
*/
|
*/
|
||||||
onMouseMove() {
|
onMouseMove() {
|
||||||
// Prevent movement while blueprint is selected
|
// Prevent movement while blueprint is selected
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { globalConfig } from "../../../core/config";
|
import { globalConfig } from "../../../core/config";
|
||||||
import { DrawParameters } from "../../../core/draw_parameters";
|
import { DrawParameters } from "../../../core/draw_parameters";
|
||||||
|
import { gMetaBuildingRegistry } from "../../../core/global_registries";
|
||||||
import { createLogger } from "../../../core/logging";
|
import { createLogger } from "../../../core/logging";
|
||||||
import { STOP_PROPAGATION } from "../../../core/signal";
|
import { STOP_PROPAGATION } from "../../../core/signal";
|
||||||
import { formatBigNumberFull } from "../../../core/utils";
|
import { formatBigNumberFull } from "../../../core/utils";
|
||||||
@ -7,6 +8,8 @@ import { Vector } from "../../../core/vector";
|
|||||||
import { ACHIEVEMENTS } from "../../../platform/achievement_provider";
|
import { ACHIEVEMENTS } from "../../../platform/achievement_provider";
|
||||||
import { T } from "../../../translations";
|
import { T } from "../../../translations";
|
||||||
import { Blueprint } from "../../blueprint";
|
import { Blueprint } from "../../blueprint";
|
||||||
|
import { MetaBlockBuilding } from "../../buildings/block";
|
||||||
|
import { MetaConstantProducerBuilding } from "../../buildings/constant_producer";
|
||||||
import { enumMouseButton } from "../../camera";
|
import { enumMouseButton } from "../../camera";
|
||||||
import { Component } from "../../component";
|
import { Component } from "../../component";
|
||||||
import { Entity } from "../../entity";
|
import { Entity } from "../../entity";
|
||||||
@ -260,7 +263,14 @@ export class HUDMassSelector extends BaseHUDPart {
|
|||||||
for (let x = realTileStart.x; x <= realTileEnd.x; ++x) {
|
for (let x = realTileStart.x; x <= realTileEnd.x; ++x) {
|
||||||
for (let y = realTileStart.y; y <= realTileEnd.y; ++y) {
|
for (let y = realTileStart.y; y <= realTileEnd.y; ++y) {
|
||||||
const contents = this.root.map.getLayerContentXY(x, y, this.root.currentLayer);
|
const contents = this.root.map.getLayerContentXY(x, y, this.root.currentLayer);
|
||||||
|
|
||||||
if (contents && this.root.logic.canDeleteBuilding(contents)) {
|
if (contents && this.root.logic.canDeleteBuilding(contents)) {
|
||||||
|
const staticComp = contents.components.StaticMapEntity;
|
||||||
|
|
||||||
|
if (!staticComp.getMetaBuilding().getIsRemovable(this.root)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
this.selectedUids.add(contents.uid);
|
this.selectedUids.add(contents.uid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -320,6 +330,11 @@ export class HUDMassSelector extends BaseHUDPart {
|
|||||||
renderedUids.add(uid);
|
renderedUids.add(uid);
|
||||||
|
|
||||||
const staticComp = contents.components.StaticMapEntity;
|
const staticComp = contents.components.StaticMapEntity;
|
||||||
|
|
||||||
|
if (!staticComp.getMetaBuilding().getIsRemovable(this.root)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
const bounds = staticComp.getTileSpaceBounds();
|
const bounds = staticComp.getTileSpaceBounds();
|
||||||
parameters.context.beginRoundedRect(
|
parameters.context.beginRoundedRect(
|
||||||
bounds.x * globalConfig.tileSize + boundsBorder,
|
bounds.x * globalConfig.tileSize + boundsBorder,
|
||||||
|
@ -216,8 +216,8 @@ export class HUDPuzzleEditorReview extends BaseHUDPart {
|
|||||||
if (!goalComp.item) {
|
if (!goalComp.item) {
|
||||||
return T.puzzleMenu.validation.goalAcceptorNoItem;
|
return T.puzzleMenu.validation.goalAcceptorNoItem;
|
||||||
}
|
}
|
||||||
const required = goalComp.getRequiredDeliveryHistorySize();
|
const required = globalConfig.goalAcceptorItemsRequired;
|
||||||
if (goalComp.deliveryHistory.length < required) {
|
if (goalComp.currentDeliveredItems < required) {
|
||||||
return T.puzzleMenu.validation.goalAcceptorRateNotMet;
|
return T.puzzleMenu.validation.goalAcceptorRateNotMet;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,8 @@ import { makeDiv } from "../../../core/utils";
|
|||||||
import { T } from "../../../translations";
|
import { T } from "../../../translations";
|
||||||
import { StaticMapEntityComponent } from "../../components/static_map_entity";
|
import { StaticMapEntityComponent } from "../../components/static_map_entity";
|
||||||
import { BaseHUDPart } from "../base_hud_part";
|
import { BaseHUDPart } from "../base_hud_part";
|
||||||
|
import { gMetaBuildingRegistry } from "../../../core/global_registries";
|
||||||
|
import { MetaBlockBuilding } from "../../buildings/block";
|
||||||
|
|
||||||
const logger = createLogger("puzzle-editor");
|
const logger = createLogger("puzzle-editor");
|
||||||
|
|
||||||
@ -43,8 +45,13 @@ export class HUDPuzzleEditorSettings extends BaseHUDPart {
|
|||||||
|
|
||||||
<div class="buttonBar">
|
<div class="buttonBar">
|
||||||
<button class="styledButton trim">${T.ingame.puzzleEditorSettings.trimZone}</button>
|
<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>
|
||||||
|
|
||||||
|
<div class="buildingsButton">
|
||||||
|
<button class="styledButton clearBuildings">${T.ingame.puzzleEditorSettings.clearBuildings}</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>`
|
</div>`
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -53,14 +60,35 @@ export class HUDPuzzleEditorSettings extends BaseHUDPart {
|
|||||||
bind(".zoneHeight .minus", () => this.modifyZone(0, -1));
|
bind(".zoneHeight .minus", () => this.modifyZone(0, -1));
|
||||||
bind(".zoneHeight .plus", () => this.modifyZone(0, 1));
|
bind(".zoneHeight .plus", () => this.modifyZone(0, 1));
|
||||||
bind("button.trim", this.trim);
|
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();
|
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() {
|
trim() {
|
||||||
// Now, find the center
|
// Now, find the center
|
||||||
const buildings = this.root.entityMgr.entities.slice();
|
const buildings = this.root.entityMgr.entities.slice();
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
|
import { gMetaBuildingRegistry } from "../../../core/global_registries";
|
||||||
import { createLogger } from "../../../core/logging";
|
import { createLogger } from "../../../core/logging";
|
||||||
import { makeDiv } from "../../../core/utils";
|
import { makeDiv } from "../../../core/utils";
|
||||||
import { T } from "../../../translations";
|
import { T } from "../../../translations";
|
||||||
|
import { MetaBlockBuilding } from "../../buildings/block";
|
||||||
|
import { StaticMapEntityComponent } from "../../components/static_map_entity";
|
||||||
import { BaseHUDPart } from "../base_hud_part";
|
import { BaseHUDPart } from "../base_hud_part";
|
||||||
|
|
||||||
const logger = createLogger("puzzle-play");
|
const logger = createLogger("puzzle-play");
|
||||||
@ -17,19 +20,41 @@ export class HUDPuzzlePlaySettings extends BaseHUDPart {
|
|||||||
null,
|
null,
|
||||||
["section"],
|
["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();
|
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() {
|
initialize() {
|
||||||
this.visible = true;
|
this.visible = true;
|
||||||
}
|
}
|
||||||
|
@ -158,10 +158,9 @@ export class MetaBuilding {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns whether this building is rotateable
|
* Returns whether this building is rotateable
|
||||||
* @param {string} variant
|
|
||||||
* @returns {boolean}
|
* @returns {boolean}
|
||||||
*/
|
*/
|
||||||
getIsRotateable(variant) {
|
getIsRotateable() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -243,7 +242,7 @@ export class MetaBuilding {
|
|||||||
* @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array<Entity> }}
|
* @return {{ rotation: number, rotationVariant: number, connectedEntities?: Array<Entity> }}
|
||||||
*/
|
*/
|
||||||
computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) {
|
computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) {
|
||||||
if (!this.getIsRotateable(variant)) {
|
if (!this.getIsRotateable()) {
|
||||||
return {
|
return {
|
||||||
rotation: 0,
|
rotation: 0,
|
||||||
rotationVariant: 0,
|
rotationVariant: 0,
|
||||||
|
@ -7,6 +7,8 @@ import { types } from "../../savegame/serialization";
|
|||||||
import { enumGameModeTypes, GameMode } from "../game_mode";
|
import { enumGameModeTypes, GameMode } from "../game_mode";
|
||||||
import { HUDPuzzleBackToMenu } from "../hud/parts/puzzle_back_to_menu";
|
import { HUDPuzzleBackToMenu } from "../hud/parts/puzzle_back_to_menu";
|
||||||
import { HUDPuzzleDLCLogo } from "../hud/parts/puzzle_dlc_logo";
|
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 {
|
export class PuzzleGameMode extends GameMode {
|
||||||
static getType() {
|
static getType() {
|
||||||
@ -30,6 +32,8 @@ export class PuzzleGameMode extends GameMode {
|
|||||||
this.additionalHudParts = {
|
this.additionalHudParts = {
|
||||||
puzzleBackToMenu: HUDPuzzleBackToMenu,
|
puzzleBackToMenu: HUDPuzzleBackToMenu,
|
||||||
puzzleDlcLogo: HUDPuzzleDLCLogo,
|
puzzleDlcLogo: HUDPuzzleDLCLogo,
|
||||||
|
blueprintPlacer: HUDBlueprintPlacer,
|
||||||
|
massSelector: HUDMassSelector,
|
||||||
};
|
};
|
||||||
|
|
||||||
this.zoneWidth = data.zoneWidth || 8;
|
this.zoneWidth = data.zoneWidth || 8;
|
||||||
@ -79,8 +83,8 @@ export class PuzzleGameMode extends GameMode {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
getSupportsCopyPaste() {
|
getHasFreeCopyPaste() {
|
||||||
return false;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
throughputDoesNotMatter() {
|
throughputDoesNotMatter() {
|
||||||
|
@ -24,13 +24,15 @@ export class GoalAcceptorSystem extends GameSystemWithFilter {
|
|||||||
const entity = this.allEntities[i];
|
const entity = this.allEntities[i];
|
||||||
const goalComp = entity.components.GoalAcceptor;
|
const goalComp = entity.components.GoalAcceptor;
|
||||||
|
|
||||||
// filter the ones which are no longer active, or which are not the same
|
if (!goalComp.lastDelivery) {
|
||||||
goalComp.deliveryHistory = goalComp.deliveryHistory.filter(
|
continue;
|
||||||
d =>
|
}
|
||||||
now - d.time < globalConfig.goalAcceptorMinimumDurationSeconds && d.item === goalComp.item
|
|
||||||
);
|
|
||||||
|
|
||||||
if (goalComp.deliveryHistory.length < goalComp.getRequiredDeliveryHistorySize()) {
|
if (now - goalComp.lastDelivery.time > goalComp.getRequiredSecondsPerItem()) {
|
||||||
|
goalComp.clearItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (goalComp.currentDeliveredItems < globalConfig.goalAcceptorItemsRequired) {
|
||||||
allAccepted = false;
|
allAccepted = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -64,8 +66,8 @@ export class GoalAcceptorSystem extends GameSystemWithFilter {
|
|||||||
const staticComp = contents[i].components.StaticMapEntity;
|
const staticComp = contents[i].components.StaticMapEntity;
|
||||||
const item = goalComp.item;
|
const item = goalComp.item;
|
||||||
|
|
||||||
const requiredItemsForSuccess = goalComp.getRequiredDeliveryHistorySize();
|
const requiredItemsForSuccess = globalConfig.goalAcceptorItemsRequired;
|
||||||
const percentage = clamp(goalComp.deliveryHistory.length / requiredItemsForSuccess, 0, 1);
|
const percentage = clamp(goalComp.currentDeliveredItems / requiredItemsForSuccess, 0, 1);
|
||||||
|
|
||||||
const center = staticComp.getTileSpaceBounds().getCenter().toWorldSpace();
|
const center = staticComp.getTileSpaceBounds().getCenter().toWorldSpace();
|
||||||
if (item) {
|
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.translate(center.x, center.y);
|
||||||
parameters.context.rotate((staticComp.rotation / 180) * Math.PI);
|
parameters.context.rotate((staticComp.rotation / 180) * Math.PI);
|
||||||
@ -90,7 +92,7 @@ export class GoalAcceptorSystem extends GameSystemWithFilter {
|
|||||||
|
|
||||||
// progress arc
|
// 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 startAngle = Math.PI * 0.595;
|
||||||
const maxAngle = Math.PI * 1.82;
|
const maxAngle = Math.PI * 1.82;
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
import { globalConfig } from "../../core/config";
|
||||||
import { BaseItem } from "../base_item";
|
import { BaseItem } from "../base_item";
|
||||||
import { enumColorMixingResults, enumColors } from "../colors";
|
import { enumColorMixingResults, enumColors } from "../colors";
|
||||||
import {
|
import {
|
||||||
@ -572,23 +573,23 @@ export class ItemProcessorSystem extends GameSystemWithFilter {
|
|||||||
const item = payload.items[0].item;
|
const item = payload.items[0].item;
|
||||||
const now = this.root.time.now();
|
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()) {
|
if (this.root.gameMode.getIsEditor()) {
|
||||||
// while playing in editor, assign the item
|
// while playing in editor, assign the item
|
||||||
goalComp.item = payload.items[0].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
|
zoneHeight: Height
|
||||||
trimZone: Trim
|
trimZone: Trim
|
||||||
clearItems: Clear Items
|
clearItems: Clear Items
|
||||||
|
clearBuildings: Clear Buildings
|
||||||
share: Share
|
share: Share
|
||||||
report: Report
|
report: Report
|
||||||
|
|
||||||
|
@ -262,8 +262,8 @@ dialogs:
|
|||||||
title: Inserisci codice
|
title: Inserisci codice
|
||||||
desc: Inserisci il codice del puzzle per caricarlo.
|
desc: Inserisci il codice del puzzle per caricarlo.
|
||||||
puzzleDelete:
|
puzzleDelete:
|
||||||
title: Delete Puzzle?
|
title: Cancellare il puzzle?
|
||||||
desc: Are you sure you want to delete '<title>'? This can not be undone!
|
desc: Sei sicuro di voler cancellare '<title>'? Questa azione non può essere annullata!
|
||||||
ingame:
|
ingame:
|
||||||
keybindingsOverlay:
|
keybindingsOverlay:
|
||||||
moveMap: Sposta
|
moveMap: Sposta
|
||||||
@ -455,7 +455,7 @@ ingame:
|
|||||||
obiettivi</strong>
|
obiettivi</strong>
|
||||||
- 3. Una volta che un accettore di obiettivi riceve una forma per un
|
- 3. Una volta che un accettore di obiettivi riceve una forma per un
|
||||||
certo lasso di tempo, lo <strong>salva come obiettivo</strong> che
|
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>).
|
verde</strong>).
|
||||||
- 4. Clicca il <strong>bottone di blocco</strong> su un edificio per
|
- 4. Clicca il <strong>bottone di blocco</strong> su un edificio per
|
||||||
disabilitarlo.
|
disabilitarlo.
|
||||||
@ -694,16 +694,16 @@ buildings:
|
|||||||
livello elettrico come oggetti sul livello normale.
|
livello elettrico come oggetti sul livello normale.
|
||||||
constant_producer:
|
constant_producer:
|
||||||
default:
|
default:
|
||||||
name: Constant Producer
|
name: Produttore costante
|
||||||
description: Constantly outputs a specified shape or color.
|
description: Produce costantemente una forma o un colore specificati.
|
||||||
goal_acceptor:
|
goal_acceptor:
|
||||||
default:
|
default:
|
||||||
name: Goal Acceptor
|
name: Accettore di obiettivi.
|
||||||
description: Deliver shapes to the goal acceptor to set them as a goal.
|
description: Consegna forme all'accettore di obiettivi per impostarli come obiettivo.
|
||||||
block:
|
block:
|
||||||
default:
|
default:
|
||||||
name: Block
|
name: Blocco
|
||||||
description: Allows you to block a tile.
|
description: Blocca una casella.
|
||||||
storyRewards:
|
storyRewards:
|
||||||
reward_cutter_and_trash:
|
reward_cutter_and_trash:
|
||||||
title: Taglio forme
|
title: Taglio forme
|
||||||
@ -829,7 +829,7 @@ storyRewards:
|
|||||||
letto? Prova a mostrarlo su di un display!"
|
letto? Prova a mostrarlo su di un display!"
|
||||||
reward_constant_signal:
|
reward_constant_signal:
|
||||||
title: Sengale costante
|
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>
|
elettrico! È utile collegarlo ai <strong>filtri di oggetti</strong>
|
||||||
per esempio.<br><br> Il segnale costante può emettere una
|
per esempio.<br><br> Il segnale costante può emettere una
|
||||||
<strong>forma</strong>, un <strong>colore</strong> o un
|
<strong>forma</strong>, un <strong>colore</strong> o un
|
||||||
@ -1123,7 +1123,7 @@ keybindings:
|
|||||||
rotateToLeft: "Ruota: punta a sinistra"
|
rotateToLeft: "Ruota: punta a sinistra"
|
||||||
constant_producer: Produttore costante
|
constant_producer: Produttore costante
|
||||||
goal_acceptor: Accettore di obiettivi
|
goal_acceptor: Accettore di obiettivi
|
||||||
block: Bloca
|
block: Blocco
|
||||||
massSelectClear: Sgombra nastri
|
massSelectClear: Sgombra nastri
|
||||||
about:
|
about:
|
||||||
title: Riguardo questo gioco
|
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>
|
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:
|
changelog:
|
||||||
title: Registro modifiche
|
title: Registro modifiche
|
||||||
demo:
|
demo:
|
||||||
@ -1241,14 +1242,14 @@ puzzleMenu:
|
|||||||
easy: Facili
|
easy: Facili
|
||||||
hard: Difficili
|
hard: Difficili
|
||||||
completed: Completati
|
completed: Completati
|
||||||
medium: Medium
|
medium: Medi
|
||||||
official: Official
|
official: Ufficiali
|
||||||
trending: Trending today
|
trending: Più popolari di oggi
|
||||||
trending-weekly: Trending weekly
|
trending-weekly: Più popolari della settimana
|
||||||
categories: Categories
|
categories: Categorie
|
||||||
difficulties: By Difficulty
|
difficulties: Per difficoltà
|
||||||
account: My Puzzles
|
account: I miei puzzle
|
||||||
search: Search
|
search: Cerca
|
||||||
validation:
|
validation:
|
||||||
title: Puzzle non valido
|
title: Puzzle non valido
|
||||||
noProducers: Per favore posiziona un Produttore costante!
|
noProducers: Per favore posiziona un Produttore costante!
|
||||||
@ -1264,9 +1265,9 @@ puzzleMenu:
|
|||||||
produttori costanti non consegnino direttamente agli accettori di
|
produttori costanti non consegnino direttamente agli accettori di
|
||||||
obiettivi.
|
obiettivi.
|
||||||
difficulties:
|
difficulties:
|
||||||
easy: Easy
|
easy: Facile
|
||||||
medium: Medium
|
medium: Medio
|
||||||
hard: Hard
|
hard: Difficile
|
||||||
backendErrors:
|
backendErrors:
|
||||||
ratelimit: Stai facendo troppe azioni velocemente. Per favore attendi un attimo.
|
ratelimit: Stai facendo troppe azioni velocemente. Per favore attendi un attimo.
|
||||||
invalid-api-key: Comunicazione con il backend fallita, per favore prova ad
|
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-payload: La richiesta contiene dati non validi.
|
||||||
bad-building-placement: Il tuo puzzle contiene edifici non validi.
|
bad-building-placement: Il tuo puzzle contiene edifici non validi.
|
||||||
timeout: La richiesta è scaduta.
|
timeout: La richiesta è scaduta.
|
||||||
too-many-likes-already: The puzzle alreay got too many likes. If you still want
|
too-many-likes-already: Questo puzzle ha già ricevuto troppi "mi piace". Se vuoi ancora
|
||||||
to remove it, please contact support@shapez.io!
|
rimuoverlo, per favore contatta support@shapez.io!
|
||||||
no-permission: You do not have the permission to perform this action.
|
no-permission: Non hai i permessi per eseguire questa azione.
|
||||||
|
@ -175,7 +175,7 @@ dialogs:
|
|||||||
title: 아이템 설정
|
title: 아이템 설정
|
||||||
puzzleLoadFailed:
|
puzzleLoadFailed:
|
||||||
title: 퍼즐 불러오기 실패
|
title: 퍼즐 불러오기 실패
|
||||||
desc: "Unfortunately the puzzles could not be loaded:"
|
desc: "불행히도 이 퍼즐은 불러오는데 실패하였습니다:"
|
||||||
submitPuzzle:
|
submitPuzzle:
|
||||||
title: 퍼즐 보내기
|
title: 퍼즐 보내기
|
||||||
descName: "퍼즐에 이름을 지어 주세요:"
|
descName: "퍼즐에 이름을 지어 주세요:"
|
||||||
@ -226,8 +226,8 @@ dialogs:
|
|||||||
title: 짧은 키 입력
|
title: 짧은 키 입력
|
||||||
desc: 불러올 퍼즐의 짧은 키를 입력해 주세요.
|
desc: 불러올 퍼즐의 짧은 키를 입력해 주세요.
|
||||||
puzzleDelete:
|
puzzleDelete:
|
||||||
title: Delete Puzzle?
|
title: 퍼즐을 지우시겠습니까?
|
||||||
desc: Are you sure you want to delete '<title>'? This can not be undone!
|
desc: 정말로 퍼즐:'<title>'을 지우시겠습니까? 이것은 돌릴수 없습니다!
|
||||||
ingame:
|
ingame:
|
||||||
keybindingsOverlay:
|
keybindingsOverlay:
|
||||||
moveMap: 이동
|
moveMap: 이동
|
||||||
@ -956,14 +956,14 @@ keybindings:
|
|||||||
comparator: 비교기
|
comparator: 비교기
|
||||||
item_producer: 아이템 생성기 (샌드박스)
|
item_producer: 아이템 생성기 (샌드박스)
|
||||||
copyWireValue: "전선: 커서 아래 값 복사"
|
copyWireValue: "전선: 커서 아래 값 복사"
|
||||||
rotateToUp: "Rotate: Point Up"
|
rotateToUp: "위로 향하게 회전"
|
||||||
rotateToDown: "Rotate: Point Down"
|
rotateToDown: "아래로 향하게 회전"
|
||||||
rotateToRight: "Rotate: Point Right"
|
rotateToRight: "오른쪽으로 향하게 회전"
|
||||||
rotateToLeft: "Rotate: Point Left"
|
rotateToLeft: "아래쪽으로 향하게 회전"
|
||||||
constant_producer: 일정 생성기
|
constant_producer: 일정 생성기
|
||||||
goal_acceptor: Goal Acceptor
|
goal_acceptor: 목표 수집기
|
||||||
block: Block
|
block: 블록
|
||||||
massSelectClear: Clear belts
|
massSelectClear: 밸트를 클리어합니다
|
||||||
about:
|
about:
|
||||||
title: 게임 정보
|
title: 게임 정보
|
||||||
body: >-
|
body: >-
|
||||||
@ -1062,14 +1062,14 @@ puzzleMenu:
|
|||||||
easy: 쉬움
|
easy: 쉬움
|
||||||
hard: 어러움
|
hard: 어러움
|
||||||
completed: 완료함
|
completed: 완료함
|
||||||
medium: Medium
|
medium: 중간
|
||||||
official: Official
|
official: 공식
|
||||||
trending: Trending today
|
trending: 오늘의 인기
|
||||||
trending-weekly: Trending weekly
|
trending-weekly: 이 주의 인기
|
||||||
categories: Categories
|
categories: 카테고리
|
||||||
difficulties: By Difficulty
|
difficulties: 어려운 순서로
|
||||||
account: My Puzzles
|
account: 내 퍼즐들
|
||||||
search: Search
|
search: 검색
|
||||||
validation:
|
validation:
|
||||||
title: 잘못된 퍼즐
|
title: 잘못된 퍼즐
|
||||||
noProducers: 일정 생성기를 배치해주세요!
|
noProducers: 일정 생성기를 배치해주세요!
|
||||||
@ -1079,9 +1079,9 @@ puzzleMenu:
|
|||||||
buildingOutOfBounds: 하나 이상의 건물이 지을 수 있는 영역 밖에 존재합니다. 영역을 늘리거나 건물을 제거하세요.
|
buildingOutOfBounds: 하나 이상의 건물이 지을 수 있는 영역 밖에 존재합니다. 영역을 늘리거나 건물을 제거하세요.
|
||||||
autoComplete: 퍼즐이 스스로 완료됩니다! 일정 생성기가 만든 모양이 목표 수집기로 바로 들어가고 있는건 아닌지 확인해주세요.
|
autoComplete: 퍼즐이 스스로 완료됩니다! 일정 생성기가 만든 모양이 목표 수집기로 바로 들어가고 있는건 아닌지 확인해주세요.
|
||||||
difficulties:
|
difficulties:
|
||||||
easy: Easy
|
easy: 쉬움
|
||||||
medium: Medium
|
medium: 중간
|
||||||
hard: Hard
|
hard: 어려움
|
||||||
backendErrors:
|
backendErrors:
|
||||||
ratelimit: 너무 빠른 시간 내 작업을 반복하고 있습니다. 조금만 기다려 주세요.
|
ratelimit: 너무 빠른 시간 내 작업을 반복하고 있습니다. 조금만 기다려 주세요.
|
||||||
invalid-api-key: 백엔드 서버와 통신할 수 없습니다. 게임을 업데이트하거나 재시작해 주세요 (잘못된 API 키).
|
invalid-api-key: 백엔드 서버와 통신할 수 없습니다. 게임을 업데이트하거나 재시작해 주세요 (잘못된 API 키).
|
||||||
@ -1102,6 +1102,5 @@ backendErrors:
|
|||||||
bad-payload: 요청이 잘못된 데이터를 포함하고 있습니다.
|
bad-payload: 요청이 잘못된 데이터를 포함하고 있습니다.
|
||||||
bad-building-placement: 퍼즐에 잘못된 곳에 위치한 건물이 있습니다.
|
bad-building-placement: 퍼즐에 잘못된 곳에 위치한 건물이 있습니다.
|
||||||
timeout: 요청 시간이 초과되었습니다.
|
timeout: 요청 시간이 초과되었습니다.
|
||||||
too-many-likes-already: The puzzle alreay got too many likes. If you still want
|
too-many-likes-already: 이 퍼즐은 이미 너무 많은 하트를 받았습니다. 그래도 부족하다면 support@shapez.io로 문의하세요!
|
||||||
to remove it, please contact support@shapez.io!
|
no-permission: 이 작업을 할 권한이 없습니다
|
||||||
no-permission: You do not have the permission to perform this action.
|
|
||||||
|
@ -207,7 +207,7 @@ dialogs:
|
|||||||
title: Puzzel indienen
|
title: Puzzel indienen
|
||||||
descName: "Geef je puzzel een naam:"
|
descName: "Geef je puzzel een naam:"
|
||||||
descIcon: "Voer een unieke vorm sleutel in, die wordt weergegeven als het icoon
|
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):"
|
een kiezen van de willekeurig voorgestelde vormen hieronder):"
|
||||||
placeholderName: Puzzel Naam
|
placeholderName: Puzzel Naam
|
||||||
puzzleResizeBadBuildings:
|
puzzleResizeBadBuildings:
|
||||||
@ -256,13 +256,13 @@ dialogs:
|
|||||||
desc: De puzzel is gemarkeerd.
|
desc: De puzzel is gemarkeerd.
|
||||||
puzzleReportError:
|
puzzleReportError:
|
||||||
title: Melden mislukt
|
title: Melden mislukt
|
||||||
desc: "Uw melding kan niet worden verwerkt:"
|
desc: "Je melding kan niet worden verwerkt:"
|
||||||
puzzleLoadShortKey:
|
puzzleLoadShortKey:
|
||||||
title: Voer een vorm sleutel in
|
title: Voer een vorm sleutel in
|
||||||
desc: Voer de vorm sleutel van de puzzel in om deze te laden.
|
desc: Voer de vorm sleutel van de puzzel in om deze te laden.
|
||||||
puzzleDelete:
|
puzzleDelete:
|
||||||
title: Delete Puzzle?
|
title: Puzzel verwijderen?
|
||||||
desc: Are you sure you want to delete '<title>'? This can not be undone!
|
desc: Weet je zeker dat je '<title>' wilt verwijderen? Dit kan niet ongedaan gemaakt worden!
|
||||||
ingame:
|
ingame:
|
||||||
keybindingsOverlay:
|
keybindingsOverlay:
|
||||||
moveMap: Beweeg rond de wereld
|
moveMap: Beweeg rond de wereld
|
||||||
@ -1137,7 +1137,7 @@ demo:
|
|||||||
settingNotAvailable: Niet beschikbaar in de demo.
|
settingNotAvailable: Niet beschikbaar in de demo.
|
||||||
tips:
|
tips:
|
||||||
- De HUB accepteert elke vorm van invoer, niet alleen de huidige vorm!
|
- 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!
|
- 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.
|
- 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>
|
- 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.
|
- Vormontginningen die verder van de HUB verwijderd zijn, zijn complexer.
|
||||||
- Machines hebben een beperkte snelheid, verdeel ze voor maximale
|
- Machines hebben een beperkte snelheid, verdeel ze voor maximale
|
||||||
efficiëntie.
|
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
|
- Organisatie is belangrijk. Probeer de lopende banden niet te veel over te
|
||||||
steken.
|
steken.
|
||||||
- Plan van tevoren, anders wordt het een enorme chaos!
|
- 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.
|
ontgrendelen.
|
||||||
- Probeer in je eentje level 20 te verslaan voordat je hulp zoekt!
|
- Probeer in je eentje level 20 te verslaan voordat je hulp zoekt!
|
||||||
- Maak de dingen niet ingewikkeld, probeer eenvoudig te blijven en je zult
|
- Maak de dingen niet ingewikkeld, probeer eenvoudig te blijven en je zult
|
||||||
ver komen.
|
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.
|
fabrieken zodat ze herbruikbaar zijn.
|
||||||
- Soms kun je een gewenste vorm op de kaart vinden zonder deze met
|
- Soms kun je een gewenste vorm op de kaart vinden zonder deze met
|
||||||
stapelaars te maken.
|
stapelaars te maken.
|
||||||
- Volle windmolens kunnen nooit op natuurlijke wijze spawnen.
|
- 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
|
- Bij modules is ruimte slechts een beleving; een zorg voor sterfelijke
|
||||||
mannen.
|
mannen.
|
||||||
- Maak een aparte blueprint fabriek. Ze zijn belangrijk voor modules.
|
- 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.
|
- Gebruik <b>CTRL</b> + klik om een gebied te selecteren.
|
||||||
- Te dicht bij de HUB bouwen kan latere projecten in de weg staan.
|
- 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
|
- 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
|
- Dit spel heeft veel handige sneltoetsen! Bekijk zeker de
|
||||||
instellingenpagina.
|
instellingenpagina.
|
||||||
- Dit spel heeft veel instellingen, bekijk ze zeker!
|
- 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!
|
geven!
|
||||||
- Om de lopende banden leeg te maken, kun je een gebied kopiëren en plakken
|
- Om de lopende banden leeg te maken, kun je een gebied kopiëren en plakken
|
||||||
op dezelfde locatie.
|
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.
|
- 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
|
- Je kan aan de linkerkant op een vastgezette vorm klikken om deze los te
|
||||||
maken.
|
maken.
|
||||||
@ -1222,6 +1222,7 @@ puzzleMenu:
|
|||||||
validatingPuzzle: Puzzel Valideren
|
validatingPuzzle: Puzzel Valideren
|
||||||
submittingPuzzle: Puzzel Indienen
|
submittingPuzzle: Puzzel Indienen
|
||||||
noPuzzles: Er zijn momenteel geen puzzels in deze sectie.
|
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:
|
categories:
|
||||||
levels: Levels
|
levels: Levels
|
||||||
new: Nieuw
|
new: Nieuw
|
||||||
@ -1231,13 +1232,13 @@ puzzleMenu:
|
|||||||
hard: Moeilijk
|
hard: Moeilijk
|
||||||
completed: Voltooid
|
completed: Voltooid
|
||||||
medium: Medium
|
medium: Medium
|
||||||
official: Official
|
official: Officieell
|
||||||
trending: Trending today
|
trending: Trending vandaag
|
||||||
trending-weekly: Trending weekly
|
trending-weekly: Trending wekelijks
|
||||||
categories: Categories
|
categories: Categorieën
|
||||||
difficulties: By Difficulty
|
difficulties: Op Moeilijkheidsgraad
|
||||||
account: My Puzzles
|
account: Mijn Puzzels
|
||||||
search: Search
|
search: Zoeken
|
||||||
validation:
|
validation:
|
||||||
title: Ongeldige Puzzel
|
title: Ongeldige Puzzel
|
||||||
noProducers: Plaats alstublieft een Constante Producent!
|
noProducers: Plaats alstublieft een Constante Producent!
|
||||||
@ -1251,9 +1252,9 @@ puzzleMenu:
|
|||||||
autoComplete: Je puzzel voltooit zichzelf automatisch! Zorg ervoor dat je
|
autoComplete: Je puzzel voltooit zichzelf automatisch! Zorg ervoor dat je
|
||||||
Constante Producenten niet rechtstreeks aan je Ontvangers leveren.
|
Constante Producenten niet rechtstreeks aan je Ontvangers leveren.
|
||||||
difficulties:
|
difficulties:
|
||||||
easy: Easy
|
easy: Makkelijk
|
||||||
medium: Medium
|
medium: Medium
|
||||||
hard: Hard
|
hard: Moeilijk
|
||||||
backendErrors:
|
backendErrors:
|
||||||
ratelimit: Je voert je handelingen te vaak uit. Wacht alstublieft even.
|
ratelimit: Je voert je handelingen te vaak uit. Wacht alstublieft even.
|
||||||
invalid-api-key: Kan niet communiceren met de servers, probeer alstublieft het
|
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-payload: Het verzoek bevat ongeldige gegevens.
|
||||||
bad-building-placement: Je puzzel bevat ongeldig geplaatste gebouwen.
|
bad-building-placement: Je puzzel bevat ongeldig geplaatste gebouwen.
|
||||||
timeout: Het verzoek is verlopen.
|
timeout: Het verzoek is verlopen.
|
||||||
too-many-likes-already: The puzzle alreay got too many likes. If you still want
|
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!
|
||||||
to remove it, please contact support@shapez.io!
|
no-permission: Je bent niet gemachtigd om deze actie uit te voeren.
|
||||||
no-permission: You do not have the permission to perform this action.
|
|
||||||
|
Loading…
Reference in New Issue
Block a user