From a54db459994d6ff73df17d1de05c554475a5bf49 Mon Sep 17 00:00:00 2001 From: Christopher-Robin Date: Wed, 7 Oct 2020 23:57:24 +1100 Subject: [PATCH] Improved Highlighting and Added Key for Selecting --- src/js/game/hud/parts/mass_selector.js | 93 +++++++++++++++++++------- src/js/game/key_action_mapper.js | 3 +- translations/base-en.yaml | 1 + 3 files changed, 72 insertions(+), 25 deletions(-) diff --git a/src/js/game/hud/parts/mass_selector.js b/src/js/game/hud/parts/mass_selector.js index 72daddfe..94acc90c 100644 --- a/src/js/game/hud/parts/mass_selector.js +++ b/src/js/game/hud/parts/mass_selector.js @@ -7,6 +7,7 @@ import { Loader } from "../../../core/loader"; import { globalConfig } from "../../../core/config"; import { makeDiv, formatBigNumber, formatBigNumberFull } from "../../../core/utils"; import { DynamicDomAttach } from "../dynamic_dom_attach"; +import { MapChunkView } from "../../map_chunk_view"; import { createLogger } from "../../../core/logging"; import { enumMouseButton } from "../../camera"; import { T } from "../../../translations"; @@ -244,9 +245,16 @@ export class HUDMassSelector extends BaseHUDPart { for(let x = realTileStart.x; x <= realTileEnd.x; ++x) { for(let y = realTileStart.y; y <= realTileEnd.y; ++y) { - for(let contents of this.root.map.getLayersContentsMultipleXY(x, y)){ - if(this.root.logic.canDeleteBuilding(contents)) - this.selectedUids.add(contents.uid); + let entities = [] + if(this.root.keyMapper.getBinding(KEYMAPPINGS.massSelect.massSelectSelectMultiLayer).pressed) + entities = this.root.map.getLayersContentsMultipleXY(x, y); + else + entities = [this.root.map.getLayerContentXY(x, y, this.root.currentLayer)]; + + for(let i = 0; i < entities.length; ++i){ + let entity = entities[i]; + if(entity !== null && this.root.logic.canDeleteBuilding(entity)) + this.selectedUids.add(entity.uid); } } } @@ -289,32 +297,56 @@ export class HUDMassSelector extends BaseHUDPart { parameters.context.fill(); parameters.context.stroke(); - parameters.context.fillStyle = THEME.map.selectionOverlay; - const renderedUids = new Set(); + + let isMultiLayerPressed = this.root.keyMapper.getBinding(KEYMAPPINGS.massSelect.massSelectSelectMultiLayer).pressed; + + for(let x = realTileStart.x; x <= realTileEnd.x; ++x) { for(let y = realTileStart.y; y <= realTileEnd.y; ++y) { - for(let component of this.root.map.getLayersContentsMultipleXY(x, y)) { - + let entities = [] + if(isMultiLayerPressed) + entities = this.root.map.getLayersContentsMultipleXY(x, y); + else + entities = [this.root.map.getLayerContentXY(x, y, this.root.currentLayer)]; + + for(let i = 0; i < entities.length; ++i) { + let component = entities[i]; if(component && this.root.logic.canDeleteBuilding(component)) { // Prevent rendering the overlay twice const uid = component.uid; if(renderedUids.has(uid)) { continue; } - renderedUids.add(uid); + renderedUids.add(uid); + + + const staticComp = component.components.StaticMapEntity; + + const bounds = staticComp.getTileSpaceBounds(); + + parameters.context.beginPath(); + if(this.root.currentLayer === "wires" || component.layer === "regular"){ + parameters.context.fillStyle = THEME.map.selectionOverlay; + parameters.context.beginRoundedRect( + bounds.x * globalConfig.tileSize + boundsBorder, + bounds.y * globalConfig.tileSize + boundsBorder, + bounds.w * globalConfig.tileSize - 2 * boundsBorder, + bounds.h * globalConfig.tileSize - 2 * boundsBorder, + 2 + ); + }else{ + MapChunkView.drawSingleWiresOverviewTile({ + context: parameters.context, + x: bounds.x * globalConfig.tileSize + boundsBorder, + y: bounds.y * globalConfig.tileSize + boundsBorder, + entity: component, + tileSizePixels: globalConfig.tileSize * 1.01, + }); + } - const staticComp = component.components.StaticMapEntity; - const bounds = staticComp.getTileSpaceBounds(); - parameters.context.beginRoundedRect( - bounds.x * globalConfig.tileSize + boundsBorder, - bounds.y * globalConfig.tileSize + boundsBorder, - bounds.w * globalConfig.tileSize - 2 * boundsBorder, - bounds.h * globalConfig.tileSize - 2 * boundsBorder, - 2 - ); parameters.context.fill(); } } @@ -327,13 +359,26 @@ export class HUDMassSelector extends BaseHUDPart { const entity = this.root.entityMgr.findByUid(uid); const staticComp = entity.components.StaticMapEntity; const bounds = staticComp.getTileSpaceBounds(); - parameters.context.beginRoundedRect( - bounds.x * globalConfig.tileSize + boundsBorder, - bounds.y * globalConfig.tileSize + boundsBorder, - bounds.w * globalConfig.tileSize - 2 * boundsBorder, - bounds.h * globalConfig.tileSize - 2 * boundsBorder, - 2 - ); + parameters.context.beginPath(); + if(this.root.currentLayer === "wires" || entity.layer === "regular"){ + parameters.context.fillStyle = THEME.map.selectionOverlay; + parameters.context.beginRoundedRect( + bounds.x * globalConfig.tileSize + boundsBorder, + bounds.y * globalConfig.tileSize + boundsBorder, + bounds.w * globalConfig.tileSize - 2 * boundsBorder, + bounds.h * globalConfig.tileSize - 2 * boundsBorder, + 2 + ); + }else{ + MapChunkView.drawSingleWiresOverviewTile({ + context: parameters.context, + x: bounds.x * globalConfig.tileSize + boundsBorder, + y: bounds.y * globalConfig.tileSize + boundsBorder, + entity: entity, + tileSizePixels: globalConfig.tileSize * 1.01, + }); + } + parameters.context.fill(); }); } diff --git a/src/js/game/key_action_mapper.js b/src/js/game/key_action_mapper.js index 9fa4ffe1..bac853f6 100644 --- a/src/js/game/key_action_mapper.js +++ b/src/js/game/key_action_mapper.js @@ -90,7 +90,8 @@ export const KEYMAPPINGS = { massSelect: { massSelectStart: { keyCode: 17 }, // CTRL - massSelectSelectMultiple: { keyCode: 16 }, // SHIFT + massSelectSelectMultiple: { keyCode: 16 }, // SHIFT + massSelectSelectMultiLayer: { keyCode: 18 }, // Alt massSelectCopy: { keyCode: key("C") }, massSelectCut: { keyCode: key("X") }, confirmMassDelete: { keyCode: 46 }, // DEL diff --git a/translations/base-en.yaml b/translations/base-en.yaml index 62ed2808..16677f0c 100644 --- a/translations/base-en.yaml +++ b/translations/base-en.yaml @@ -1174,6 +1174,7 @@ keybindings: Wires: Copy value below cursor massSelectStart: Hold and drag to start massSelectSelectMultiple: Select multiple areas + massSelectSelectMultiLayer: Select multiple Layers massSelectCopy: Copy area massSelectCut: Cut area