From cd2ed178c7bf2d4e67dc923e7964cb4371763ec2 Mon Sep 17 00:00:00 2001 From: Sense101 <67970865+Sense101@users.noreply.github.com> Date: Thu, 6 May 2021 15:41:16 +0100 Subject: [PATCH] completed flow for building locking --- src/js/game/hud/parts/base_toolbar.js | 27 +++++++++++++++++++++++---- src/js/game/modes/puzzle_play.js | 1 - src/js/platform/api.js | 1 + src/js/savegame/puzzle_serializer.js | 16 ++++++++++++++-- 4 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/js/game/hud/parts/base_toolbar.js b/src/js/game/hud/parts/base_toolbar.js index e0664372..cb588f51 100644 --- a/src/js/game/hud/parts/base_toolbar.js +++ b/src/js/game/hud/parts/base_toolbar.js @@ -1,6 +1,7 @@ import { gMetaBuildingRegistry } from "../../../core/global_registries"; import { STOP_PROPAGATION } from "../../../core/signal"; import { makeDiv, safeModulo } from "../../../core/utils"; +import { StaticMapEntityComponent } from "../../components/static_map_entity"; import { KEYMAPPINGS } from "../../key_action_mapper"; import { MetaBuilding } from "../../meta_building"; import { GameRoot } from "../../root"; @@ -35,7 +36,8 @@ export class HUDBaseToolbar extends BaseHUDPart { * selected: boolean, * element: HTMLElement, * index: number - * puzzleLocked: boolean, + * puzzleLocked: boolean; + * class: typeof MetaBuilding, * }>} */ this.buildingHandles = {}; } @@ -106,7 +108,7 @@ export class HUDBaseToolbar extends BaseHUDPart { ); itemContainer.setAttribute("data-icon", "building_icons/" + metaBuilding.getId() + ".png"); itemContainer.setAttribute("data-id", metaBuilding.getId()); - binding.add(() => this.selectBuildingForPlacement(metaBuilding)); + binding.add(() => this.togglePuzzleLock(metaBuilding)); this.trackClicks(itemContainer, () => this.selectBuildingForPlacement(metaBuilding), { clickSound: null, @@ -121,12 +123,13 @@ export class HUDBaseToolbar extends BaseHUDPart { }); this.buildingHandles[metaBuilding.id] = { - metaBuilding, + metaBuilding: metaBuilding, element: itemContainer, unlocked: false, selected: false, index: i, puzzleLocked: false, + class: allBuildings[i], }; } @@ -154,7 +157,7 @@ export class HUDBaseToolbar extends BaseHUDPart { let recomputeSecondaryToolbarVisibility = false; for (const buildingId in this.buildingHandles) { const handle = this.buildingHandles[buildingId]; - const newStatus = handle.metaBuilding.getIsUnlocked(this.root); + const newStatus = !handle.puzzleLocked && handle.metaBuilding.getIsUnlocked(this.root); if (handle.unlocked !== newStatus) { handle.unlocked = newStatus; handle.element.classList.toggle("unlocked", newStatus); @@ -271,8 +274,24 @@ export class HUDBaseToolbar extends BaseHUDPart { return STOP_PROPAGATION; } + const entityManager = this.root.entityMgr; + for (const entity of entityManager.getAllWithComponent(StaticMapEntityComponent)) { + const staticComp = entity.components.StaticMapEntity; + if (staticComp.getMetaBuilding().id === metaBuilding.id) { + this.root.map.removeStaticEntity(entity); + entityManager.destroyEntity(entity); + } + } + entityManager.processDestroyList(); + + const currentMetaBuilding = this.root.hud.parts.buildingPlacer.currentMetaBuilding; + if (currentMetaBuilding.get() == metaBuilding) { + currentMetaBuilding.set(null); + } + const handle = this.buildingHandles[metaBuilding.getId()]; handle.puzzleLocked = !handle.puzzleLocked; + handle.element.classList.toggle("unlocked", handle.puzzleLocked); this.root.soundProxy.playUiClick(); } diff --git a/src/js/game/modes/puzzle_play.js b/src/js/game/modes/puzzle_play.js index 74fec28a..eafbd7ff 100644 --- a/src/js/game/modes/puzzle_play.js +++ b/src/js/game/modes/puzzle_play.js @@ -28,7 +28,6 @@ import { createLogger } from "../../core/logging"; import { HUDPuzzleCompleteNotification } from "../hud/parts/puzzle_complete_notification"; import { HUDPuzzlePlaySettings } from "../hud/parts/puzzle_play_settings"; import { MetaBlockBuilding } from "../buildings/block"; -import { gMetaBuildingRegistry } from "../../core/global_registries"; import { MetaBuilding } from "../meta_building"; const logger = createLogger("puzzle-play"); diff --git a/src/js/platform/api.js b/src/js/platform/api.js index cbecfb15..b50b684e 100644 --- a/src/js/platform/api.js +++ b/src/js/platform/api.js @@ -36,6 +36,7 @@ export class ClientAPI { if (G_IS_DEV) { return "http://localhost:15001"; } + return "https://api-staging.shapez.io"; if (window.location.host === "beta.shapez.io") { return "https://api-staging.shapez.io"; } diff --git a/src/js/savegame/puzzle_serializer.js b/src/js/savegame/puzzle_serializer.js index 309c1ecf..8a032e9a 100644 --- a/src/js/savegame/puzzle_serializer.js +++ b/src/js/savegame/puzzle_serializer.js @@ -7,7 +7,7 @@ import { StaticMapEntityComponent } from "../game/components/static_map_entity"; import { ShapeItem } from "../game/items/shape_item"; import { Vector } from "../core/vector"; import { MetaConstantProducerBuilding } from "../game/buildings/constant_producer"; -import { defaultBuildingVariant } from "../game/meta_building"; +import { defaultBuildingVariant, MetaBuilding } from "../game/meta_building"; import { gMetaBuildingRegistry } from "../core/global_registries"; import { MetaGoalAcceptorBuilding } from "../game/buildings/goal_acceptor"; import { createLogger } from "../core/logging"; @@ -82,6 +82,18 @@ export class PuzzleSerializer { const mode = /** @type {PuzzleGameMode} */ (root.gameMode); + const handles = root.hud.parts.buildingsToolbar.buildingHandles; + const ids = gMetaBuildingRegistry.getAllIds(); + + /** @type {Array} */ + let excludedBuildings = []; + for (let i = 0; i < ids.length; ++i) { + const handle = handles[ids[i]]; + if (handle && handle.puzzleLocked) { + excludedBuildings.push(handle.class); + } + } + return { version: 1, buildings, @@ -90,7 +102,7 @@ export class PuzzleSerializer { h: mode.zoneHeight, }, //read from the toolbar when making a puzzle - excludedBuildings: [MetaBlockBuilding], + excludedBuildings, }; }