diff --git a/src/js/game/blueprint.js b/src/js/game/blueprint.js index 3e7cdaa6..a2aa7186 100644 --- a/src/js/game/blueprint.js +++ b/src/js/game/blueprint.js @@ -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); } } diff --git a/src/js/game/game_mode.js b/src/js/game/game_mode.js index 5eca211a..bb60d8a6 100644 --- a/src/js/game/game_mode.js +++ b/src/js/game/game_mode.js @@ -166,8 +166,8 @@ export class GameMode extends BasicSerializableObject { } /** @returns {boolean} */ - getSupportsCopyPaste() { - return true; + getHasFreeCopyPaste() { + return false; } /** @returns {boolean} */ diff --git a/src/js/game/hud/parts/blueprint_placer.js b/src/js/game/hud/parts/blueprint_placer.js index 54e2e3b7..e006d24a 100644 --- a/src/js/game/hud/parts/blueprint_placer.js +++ b/src/js/game/hud/parts/blueprint_placer.js @@ -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} */ @@ -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 diff --git a/src/js/game/hud/parts/mass_selector.js b/src/js/game/hud/parts/mass_selector.js index ab933da3..b8283d55 100644 --- a/src/js/game/hud/parts/mass_selector.js +++ b/src/js/game/hud/parts/mass_selector.js @@ -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, diff --git a/src/js/game/meta_building.js b/src/js/game/meta_building.js index f3df0b62..7bfbce25 100644 --- a/src/js/game/meta_building.js +++ b/src/js/game/meta_building.js @@ -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 }} */ computeOptimalDirectionAndRotationVariantAtTile({ root, tile, rotation, variant, layer }) { - if (!this.getIsRotateable(variant)) { + if (!this.getIsRotateable()) { return { rotation: 0, rotationVariant: 0, diff --git a/src/js/game/modes/puzzle.js b/src/js/game/modes/puzzle.js index 4bf3b1e6..75a47ee2 100644 --- a/src/js/game/modes/puzzle.js +++ b/src/js/game/modes/puzzle.js @@ -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() {