index : btroops | |
Virtual board game-aid for BattleTroops, an infantry combat simulator wargame published by FASA in 1989. |
aboutsummaryrefslogtreecommitdiff |
diff options
author | Catalin Mititiuc <webdevcat@proton.me> | 2024-06-16 22:53:55 -0700 |
---|---|---|
committer | Catalin Mititiuc <webdevcat@proton.me> | 2024-06-16 23:25:38 -0700 |
commit | 0a30f7c7efe31f84f7ac33435a6c5c52ac14579d (patch) | |
tree | b04b529715e1f1f0a97e065639d714252f824056 /src | |
parent | 07ab30fdecfce4ede25e2403fa66a07685eccd4e (diff) |
WIP: radial hex grid
Diffstat (limited to 'src')
-rw-r--r-- | src/radial.js | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/radial.js b/src/radial.js new file mode 100644 index 0000000..98ae53d --- /dev/null +++ b/src/radial.js @@ -0,0 +1,96 @@ +if (window.IS_DEV) { + const source = new EventSource('/esbuild'); + source.addEventListener('change', () => location.reload()); +} + +function toKey(q, r, s) { + return `${[q, r, s]}`; +} + +function getNeighbors(coords) { + const [q, r, s] = coords.split(',').map(n => +n); + + return [ + toKey(q + 1, r, s - 1), + toKey(q - 1, r, s + 1), + toKey(q + 1, r - 1, s), + toKey(q - 1, r + 1, s), + toKey(q, r + 1, s - 1), + toKey(q, r - 1, s + 1), + ] +} + +function generateRadialCoords({ q, r, s }, radius) { + const origin = toKey(q, r, s); + const list = new Set(); + const neighbors = new Set(); + + let next = new Set(); + + list.add(origin); + next.add(origin); + + for (let i = 0; i < radius; i++) { + next.forEach(coords => { + getNeighbors(coords).forEach(n => { + list.add(n); + neighbors.add(n); + }); + }); + + next = new Set(neighbors); + neighbors.clear(); + } + + return list; +} + +const hex = { + inradius: 8.66, + circumradius: 10, +} + +const horzSpacing = hex.inradius; +const vertSpacing = hex.circumradius * 3 / 2; + +const list = generateRadialCoords({ q: 0, r: 0, s: 0 }, 5); +const svg = document.querySelector('svg'); +const xmlns = 'http://www.w3.org/2000/svg'; + +list.forEach(key => { + const [q, r, s] = key.split(',').map(n => +n); + + let x; + + if (q === s) + x = 0; + else if (q > -1 && s > -1 || q < 0 && s < 0) + x = Math.abs(q - s); + else + x = Math.abs(q) + Math.abs(s); + + x = (q > s ? -1 : 1) * x * horzSpacing; + y = r * vertSpacing; + + const use = document.createElementNS(xmlns, 'use'); + use.setAttributeNS(null, 'href', '#hex'); + use.setAttributeNS(null, 'x', x); + use.setAttributeNS(null, 'y', y); + + const qText = document.createElementNS(xmlns, 'text'); + qText.textContent = q; + qText.setAttributeNS(null, 'x', x - 3); + qText.setAttributeNS(null, 'y', y - 3); + + const rText = document.createElementNS(xmlns, 'text'); + rText.textContent = r; + rText.setAttributeNS(null, 'x', x + 5); + rText.setAttributeNS(null, 'y', y + 1.5); + + const sText = document.createElementNS(xmlns, 'text'); + sText.textContent = s; + sText.setAttributeNS(null, 'x', x - 3); + sText.setAttributeNS(null, 'y', y + 5); + + [use, qText, rText, sText].forEach(el => svg.appendChild(el)); +}); |