From deacb601ba581f5f762b3765522b4bb9533af195 Mon Sep 17 00:00:00 2001 From: Catalin Constantin Mititiuc Date: Mon, 16 Jun 2025 22:41:29 -0700 Subject: [PATCH] Add grenade counter --- public/counter_grenade.jpg | Bin 0 -> 6649 bytes public/icon_grenade.png | Bin 0 -> 3252 bytes public/index.html | 4 +++- public/map.css | 4 ++++ public/map.svg | 5 +++-- src/index.js | 2 ++ src/modules/game.js | 21 ++++++++++++++++++++- 7 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 public/counter_grenade.jpg create mode 100644 public/icon_grenade.png diff --git a/public/counter_grenade.jpg b/public/counter_grenade.jpg new file mode 100644 index 0000000000000000000000000000000000000000..45d25f0d55d4fd4cd1bc69117670bc8b76b7d90b GIT binary patch literal 6649 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 Hxmfr=J5tO< literal 0 HcmV?d00001 diff --git a/public/icon_grenade.png b/public/icon_grenade.png new file mode 100644 index 0000000000000000000000000000000000000000..7642556d1208f8146b77183f0f335d703949dbed GIT binary patch literal 3252 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 mF!}|0m)LphZ~Q_I4gUpxox84`K5Zlb0000 6 MP -
Prone: + Turn: 0 diff --git a/public/map.css b/public/map.css index 780b912..ad67ce3 100644 --- a/public/map.css +++ b/public/map.css @@ -86,6 +86,10 @@ g.troop-counter-template text { transform: translate(-5px, 6px); } +[href="#counter-grenade"] { + transform: translate(-5px, -5px); +} + g#points g use.counter { r: 5px; } diff --git a/public/map.svg b/public/map.svg index 1436aea..c5e80f5 100644 --- a/public/map.svg +++ b/public/map.svg @@ -21,7 +21,8 @@ 6 7 - + + @@ -72,7 +73,7 @@ - + diff --git a/src/index.js b/src/index.js index 617e953..63925b1 100644 --- a/src/index.js +++ b/src/index.js @@ -206,6 +206,8 @@ window.addEventListener('load', () => { el.addEventListener('click', () => game.setFiringArc(el.dataset.size)) ); + document.querySelector('.set-grenade').addEventListener('click', () => game.setGrenade()); + recordSheetVisibility.addEventListener('input', e => { let divs = document.querySelectorAll('#content div'); diff --git a/src/modules/game.js b/src/modules/game.js index c94685e..a7bb05e 100644 --- a/src/modules/game.js +++ b/src/modules/game.js @@ -131,6 +131,7 @@ function linedraw(x1, y1, x2, y2) { export default class Game { info; + placing = []; #firingArcVisibility = { davion: false, @@ -392,13 +393,20 @@ export default class Game { point = this.getHex(cell); point.addEventListener('click', e => { + const toPlace = this.placing.pop(); + // TODO let existingOccupant = this.svg.querySelector(`.counter[data-x="${point.dataset.x}"][data-y="${point.dataset.y}"]`); + if (toPlace && toPlace.getAttribute('href') === '#counter-grenade') { + point.parentElement.appendChild(toPlace); + return; + } + if (this.getSelected() && !existingOccupant) { let sl = this.svg.querySelector('.sight-line'); - + this.placing.push(toPlace); this.Counter.place(point); if (sl) { @@ -618,6 +626,7 @@ export default class Game { let counter = container.getCounter(allegiance, number); if (counter) { + container.placing.push(counter); counter.classList.add(selectedClass); let existingArcs = container.getExistingArcs(allegiance, number); existingArcs.forEach(el => el.removeAttribute('clip-path')); @@ -627,6 +636,7 @@ export default class Game { this.unSelect = function () { let selected = container.getSelected(); + container.place = []; if (selected) { let { troopNumber, troopAllegiance } = selected.dataset; @@ -965,4 +975,13 @@ export default class Game { firingArc.addEventListener('contextmenu', cancelFiringArcPlacement); } } + + setGrenade() { + const svgns = "http://www.w3.org/2000/svg"; + + let counter = document.createElementNS(svgns, 'use'); + counter.setAttributeNS(null, 'href', '#counter-grenade'); + counter.addEventListener('click', () => counter.remove()); + this.placing.push(counter); + } }