diff --git a/src/js/game/hud/hud.js b/src/js/game/hud/hud.js index d6a078f4..3f8ab0e1 100644 --- a/src/js/game/hud/hud.js +++ b/src/js/game/hud/hud.js @@ -74,6 +74,7 @@ export class GameHUD { shapeUnpinRequested: /** @type {TypedSignal<[string]>} */ (new Signal()), notification: /** @type {TypedSignal<[string, enumNotificationType]>} */ (new Signal()), buildingsSelectedForCopy: /** @type {TypedSignal<[Array]>} */ (new Signal()), + pasteBlueprintRequested: new Signal(), }; if (!IS_MOBILE) { diff --git a/src/js/game/hud/parts/blueprint_placer.js b/src/js/game/hud/parts/blueprint_placer.js index 69523bd0..0ffff9b4 100644 --- a/src/js/game/hud/parts/blueprint_placer.js +++ b/src/js/game/hud/parts/blueprint_placer.js @@ -29,6 +29,8 @@ export class HUDBlueprintPlacer extends BaseHUDPart { /** @type {TypedTrackedState} */ this.currentBlueprint = new TrackedState(this.onBlueprintChanged, this); + /** @type {Blueprint?} */ + this.lastBlueprintUsed = null; const keyActionMapper = this.root.keyMapper; keyActionMapper.getBinding(KEYMAPPINGS.general.back).add(this.abortPlacement, this); @@ -36,9 +38,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart { .getBinding(KEYMAPPINGS.placement.abortBuildingPlacement) .add(this.abortPlacement, this); keyActionMapper.getBinding(KEYMAPPINGS.placement.rotateWhilePlacing).add(this.rotateBlueprint, this); - keyActionMapper - .getBinding(KEYMAPPINGS.placement.abortBuildingPlacement) - .add(this.abortPlacement, this); + keyActionMapper.getBinding(KEYMAPPINGS.massSelect.pasteLastBlueprint).add(this.pasteBlueprint, this); this.root.camera.downPreHandler.add(this.onMouseDown, this); this.root.camera.movePreHandler.add(this.onMouseMove, this); @@ -73,6 +73,7 @@ export class HUDBlueprintPlacer extends BaseHUDPart { */ onBlueprintChanged(blueprint) { if (blueprint) { + this.lastBlueprintUsed = blueprint; this.costDisplayText.innerText = "" + blueprint.getCost(); } } @@ -144,6 +145,15 @@ export class HUDBlueprintPlacer extends BaseHUDPart { } } + pasteBlueprint() { + if (this.lastBlueprintUsed !== null) { + this.root.hud.signals.pasteBlueprintRequested.dispatch(); + this.currentBlueprint.set(this.lastBlueprintUsed); + } else { + this.root.soundProxy.playUiError(); + } + } + /** * * @param {DrawParameters} parameters diff --git a/src/js/game/hud/parts/building_placer.js b/src/js/game/hud/parts/building_placer.js index c1179f33..6da065b2 100644 --- a/src/js/game/hud/parts/building_placer.js +++ b/src/js/game/hud/parts/building_placer.js @@ -40,6 +40,7 @@ export class HUDBuildingPlacer extends BaseHUDPart { keyActionMapper.getBinding(KEYMAPPINGS.placement.cycleBuildingVariants).add(this.cycleVariants, this); this.root.hud.signals.buildingsSelectedForCopy.add(this.abortPlacement, this); + this.root.hud.signals.pasteBlueprintRequested.add(this.abortPlacement, this); this.domAttach = new DynamicDomAttach(this.root, this.element, {}); diff --git a/src/js/game/hud/parts/keybinding_overlay.js b/src/js/game/hud/parts/keybinding_overlay.js index 05455065..7b58858a 100644 --- a/src/js/game/hud/parts/keybinding_overlay.js +++ b/src/js/game/hud/parts/keybinding_overlay.js @@ -31,10 +31,10 @@ export class HUDKeybindingOverlay extends BaseHUDPart { ${getKeycode(KEYMAPPINGS.navigation.mapMoveDown)} ${getKeycode(KEYMAPPINGS.navigation.mapMoveRight)} - - - - + + + +
@@ -47,13 +47,18 @@ export class HUDKeybindingOverlay extends BaseHUDPart {
- - + +
+ ${getKeycode(KEYMAPPINGS.massSelect.pasteLastBlueprint)} + +
+ +
- +
${getKeycode(KEYMAPPINGS.placement.abortBuildingPlacement)} diff --git a/src/js/game/key_action_mapper.js b/src/js/game/key_action_mapper.js index 532e53cd..58077f01 100644 --- a/src/js/game/key_action_mapper.js +++ b/src/js/game/key_action_mapper.js @@ -67,6 +67,7 @@ export const KEYMAPPINGS = { massSelectCopy: { keyCode: key("C") }, massSelectCut: { keyCode: key("X") }, confirmMassDelete: { keyCode: 46 }, // DEL + pasteLastBlueprint: { keyCode: key("V") }, }, placementModifiers: { diff --git a/translations/base-en.yaml b/translations/base-en.yaml index 472d542d..c1944695 100644 --- a/translations/base-en.yaml +++ b/translations/base-en.yaml @@ -291,6 +291,7 @@ ingame: placeBuilding: Place building createMarker: Create Marker delete: Destroy + pasteLastBlueprint: Paste last blueprint # Everything related to placing buildings (I.e. as soon as you selected a building # from the toolbar) @@ -710,6 +711,7 @@ keybindings: Modifier: Rotate CCW instead cycleBuildingVariants: Cycle Variants confirmMassDelete: Confirm Mass Delete + pasteLastBlueprint: Paste last blueprint cycleBuildings: Cycle Buildings massSelectStart: Hold and drag to start