fb459ad92c
- Pure geometry library src/lib/map/* (grid, distance 5e/pf2e/euclid, AoE circle/cone/line/square, polygon rasterize + point-in-polygon, brush, fog set algebra, player projection) with unit tests. - Schema: map tokens gain size/kind/characterId/hp/conditions/gmOnly; maps gain drawings/gridUnit(feet)/gridType/fogVersion + point/drawing sub-schemas. Dexie v8 additive migration; mapsRepo.get + transactional mutate. - Editor split into a shared MapCanvas renderer + MapEditor tool state machine: fog via brush/rectangle/polygon (+ size, reveal-all/hide-all), measurement (system-aware distance in feet), AoE templates (circle/cone/line/square preview), drawing annotations (freehand/line/arrow/rect/circle/text, GM-only), pings, and richer tokens (NxN size, character link with live HP ring, condition dots, edit popover). - Player-facing projection: toPlayerProjection strips GM-only content; PlayerMapView renders it read-only with opaque fog; uiStore.activeMapId + 'Show to players'; the player view now shows the live battle map. enemyStatus extracted to src/lib/combat/playerProjection.ts (reused, and for Phase 18). 9 geometry unit tests; maps e2e covers upload→token→reveal-all→player projection. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
23 lines
642 B
TypeScript
23 lines
642 B
TypeScript
import { cellKey } from './grid';
|
|
|
|
/** Immutable fog set algebra over the `revealed` cell-key array. */
|
|
|
|
export function applyReveal(revealed: string[], cells: string[]): string[] {
|
|
return [...new Set([...revealed, ...cells])];
|
|
}
|
|
|
|
export function applyHide(revealed: string[], cells: string[]): string[] {
|
|
const drop = new Set(cells);
|
|
return revealed.filter((k) => !drop.has(k));
|
|
}
|
|
|
|
export function revealAll(cols: number, rows: number): string[] {
|
|
const all: string[] = [];
|
|
for (let c = 0; c < cols; c++) for (let r = 0; r < rows; r++) all.push(cellKey(c, r));
|
|
return all;
|
|
}
|
|
|
|
export function hideAll(): string[] {
|
|
return [];
|
|
}
|