Use observable for end move and prone flag

This commit is contained in:
Catalin Constantin Mititiuc 2024-05-22 09:12:47 -07:00
parent 7395df376d
commit 98e4fd58d8
5 changed files with 16 additions and 17 deletions

View File

@ -2,6 +2,7 @@ import * as panzoom from './modules/pan-zoom.js';
import * as gameboard from './modules/gameboard.js'; import * as gameboard from './modules/gameboard.js';
import * as recordSheet from './modules/record_sheet.js'; import * as recordSheet from './modules/record_sheet.js';
import * as mapSelectDialog from './modules/map_select_dialog.js'; import * as mapSelectDialog from './modules/map_select_dialog.js';
import { Observable } from './modules/observable.js';
globalThis.svgns = 'http://www.w3.org/2000/svg'; globalThis.svgns = 'http://www.w3.org/2000/svg';
@ -131,7 +132,7 @@ document.querySelectorAll('.end-turn').forEach(el =>
clearMoveEndedIndicators(opponentRecords); clearMoveEndedIndicators(opponentRecords);
gameboard.clearFiringArcs(opponent); gameboard.clearFiringArcs(opponent);
gameboard.select(firstOpponentRecord); Observable.notify('select', firstOpponentRecord);
}) })
); );
@ -157,12 +158,11 @@ gameboard.setDistanceCallback((count = '-') => {
distanceOutput.style.display = count === '-' ? 'none' : 'block'; distanceOutput.style.display = count === '-' ? 'none' : 'block';
}); });
gameboard.setProneFlagCallback(checked => proneToggle.checked = checked); Observable.subscribe('proneflag', checked => proneToggle.checked = checked);
document.querySelectorAll('.end-move').forEach(el => el.addEventListener('click', () => { document.querySelectorAll('.end-move').forEach(el =>
recordSheet.endMove(); el.addEventListener('click', () => Observable.notify('endmove'))
gameboard.endMove(); );
}));
document.querySelector('#fullscreen').addEventListener('click', () => { document.querySelector('#fullscreen').addEventListener('click', () => {
if (!document.fullscreenElement) { if (!document.fullscreenElement) {

View File

@ -129,7 +129,7 @@ export function endMove(svg, counter) {
} }
export function hasProne(counter) { export function hasProne(counter) {
return !!counter.querySelector('[href="#counter-prone"]'); return !!counter.querySelector('[href="#counter-prone"]:not(.removed)');
} }
export function toggleProne(counter) { export function toggleProne(counter) {

View File

@ -3,8 +3,7 @@ import * as sightLine from './game/sight_line.js';
import * as soldier from './game/soldier.js'; import * as soldier from './game/soldier.js';
import { Observable } from "./observable"; import { Observable } from "./observable";
let svg, distanceCallback, proneFlagCallback, let svg, distanceCallback, selected,
selected,
placing = []; placing = [];
function getCellContents(cell) { function getCellContents(cell) {
@ -78,6 +77,7 @@ function getSelected() {
function deselect() { function deselect() {
const selected = getSelected(); const selected = getSelected();
placing = []; placing = [];
Observable.notify('proneflag', false);
if (selected) { if (selected) {
selected.classList.remove(soldier.getSelectedClass()); selected.classList.remove(soldier.getSelectedClass());
@ -182,10 +182,6 @@ export function setDistanceCallback(callback) {
distanceCallback = callback; distanceCallback = callback;
} }
export function setProneFlagCallback(callback) {
proneFlagCallback = callback;
}
export function start(el) { export function start(el) {
svg = el; svg = el;
@ -231,6 +227,9 @@ export function start(el) {
console.log('removing cell contents'); console.log('removing cell contents');
getCellContents(cell).forEach(el => el.remove()); getCellContents(cell).forEach(el => el.remove());
} }
const selected = getSelected();
Observable.notify('proneflag', selected && soldier.hasProne(selected));
}); });
cell.addEventListener('dblclick', e => { cell.addEventListener('dblclick', e => {
@ -280,6 +279,7 @@ export function start(el) {
}); });
Observable.subscribe('select', select); Observable.subscribe('select', select);
Observable.subscribe('endmove', endMove);
console.log('gameboard.js loaded'); console.log('gameboard.js loaded');
} }
@ -295,6 +295,7 @@ export function select(data) {
counter.classList.add(soldier.getSelectedClass()); counter.classList.add(soldier.getSelectedClass());
firingArc.get(svg, counter).forEach(el => el.removeAttribute('clip-path')); firingArc.get(svg, counter).forEach(el => el.removeAttribute('clip-path'));
Observable.notify('proneflag', soldier.hasProne(counter));
placing.push(counter); placing.push(counter);
} }

View File

@ -2,7 +2,7 @@ const observers = {};
export const Observable = Object.freeze({ export const Observable = Object.freeze({
notify: (event, data) => { notify: (event, data) => {
observers[event].forEach((observer) => observer(data)) (observers[event] || []).forEach((observer) => observer(data))
}, },
subscribe: (event, func) => { subscribe: (event, func) => {

View File

@ -118,8 +118,6 @@ function deselect() {
if (selected) { if (selected) {
selected.classList.remove('selected'); selected.classList.remove('selected');
} }
document.getElementById('toggle-prone-counter').checked = false;
} }
function clear() { function clear() {
@ -137,7 +135,6 @@ function select(data) {
if (isSelected || !data) return; if (isSelected || !data) return;
record.classList.add('selected'); record.classList.add('selected');
document.querySelector('#toggle-prone-counter').checked = data.prone;
} }
export function getSelected() { export function getSelected() {
@ -170,5 +167,6 @@ export function start(startLoc, units) {
} }
Observable.subscribe('select', select); Observable.subscribe('select', select);
Observable.subscribe('endmove', endMove);
addEventListeners(); addEventListeners();
} }