A complete tabletop miniatures ruleset rebuilt as a browser wargame — live online multiplayer, an AI opponent with distinct personalities, and a from-scratch roguelike campaign. ~58,000 lines of vanilla JavaScript, zero build tooling.
A Redux-style single-mutation architecture — dispatch() is the only way to change state — drives deployment, BFS grid pathfinding, ranged and melee resolution, morale, and 300+ independently testable special rules and spell effects.
Every attack rolls transparently: hits, saves, and wounds resolve step by step, exactly as they would on the table.
A branching node-graph generator produces guaranteed-reachable maps with per-layer difficulty balancing and elite encounters — Monte-Carlo-verified against starvation across thousands of simulated generations.
Wrapped around a shop economy, a 30-entry doctrine system, and a 60-entry random event catalog — all feeding the same battle engine as regular matches.
The list builder parses natural-language upgrade text straight from the source rulebooks — weapon swaps, per-model upgrades, squad-wide options — into structured data at runtime.
A procedural icon generator then renders a distinct badge for every unit purely from its stats — no external art assets.
No npm, no bundler, no framework — just disciplined ES-module boundaries across a strict data → rules → engine → UI/AI/multiplayer layering.
Async and live play over PHP short-polling with full-state snapshots, optimistic-lock conflict handling, and a decision-pause protocol for accept/decline combat choices.
Any user can watch a live game or replay a finished one move-by-move — the same state stream that drives play drives playback.
Headless unit/integration tests plus a Playwright end-to-end suite covering multiplayer sync, deployment, and spectator flows — on a project with no build step.