Files
tevansandClaude Opus 4.8 2090e8902c Blueprint News: engine-agnostic SLA BPN briefing generator
Reusable framework-free component (core generation engine, seeded procedural
SVG art, render layer) plus a standalone app built on it. Produces two separate
surfaces per briefing — Player Brief and GM Dossier — in the SLA house style
with bundled local fonts. Per-band procedural artwork, deterministic from seed.
NPC/monster generation left to a future companion module via a clean seam.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 11:24:14 +01:00

3.7 KiB

Blueprint News

An engine-agnostic generator for SLA Industries BPN (Blue Print News) mission briefings. It produces two clearly separated surfaces from one briefing:

  • Player Brief — the official corporate dispatch the squad is allowed to see.
  • GM Dossier — the handler-only truth: the twist, the withheld fact, the real threat read, the levers, and the dice state.

Every briefing is reproducible from a short seed, which also drives the procedural SVG artwork — flat, stencil/propaganda SLA styling, never photorealistic. Fonts are bundled locally, so it looks identical offline.

It deliberately owns no game-engine schema. NPC and monster generation are left to companion modules; each briefing reserves a clean hand-off seam (npcSeam) carrying archetype keys only.

Run the app

No build step. Serve the folder over HTTP (ES modules need it) and open it:

python3 -m http.server 8778
# then open http://localhost:8778/index.html

The app: pick a colour band / scenario frame (or leave on Any to roll), Generate, toggle Player / GM / Both, Save to a local library, Print (clean print stylesheet) or Export HTML (self-contained file).

Architecture — a component, plus an app built on it

The reusable component is three framework-free ES-module layers with no DOM or engine dependencies in the core:

core/                 generation engine (pure, deterministic)
  bpn-core.js           generateBPN(opts) -> resolved BPN object; randomSeed()
  data/colours.js       the 10 colour bands + d20 issue table
  data/frames.js        hand-authored scenario frames (with npcSeam hints)
  data/tables.js        generic SLA flavour tables
art/
  bpn-art.js            seeded procedural SVG: crestSVG(), bannerSVG()
render/
  bpn-render.js         briefHTML() / dossierHTML() + mount helpers
  bpn-render.css        the SLA-styled, responsive, print-ready stylesheet
assets/fonts/           bundled Josefin Sans, Roboto Mono, Modesto Condensed
app/                    the standalone generator UI (consumes the above)
index.html

Using the component in another engine

import { generateBPN } from "./core/bpn-core.js";
import { briefHTML, dossierHTML } from "./render/bpn-render.js";

const bpn = generateBPN({ seed: "BPN-1A2B-3C4D", colourKey: "red" });
host.innerHTML = `<div class="bpn">${briefHTML(bpn)}</div>`;   // player-facing
gmPanel.innerHTML = `<div class="bpn">${dossierHTML(bpn)}</div>`; // GM-only

Include render/bpn-render.css and assets/fonts/fonts.css in the host. The markup is plain HTML/SVG scoped under .bpn, so it drops into a Foundry journal page, a website, or an Electron app unchanged.

generateBPN(opts) accepts: seed, colourKey, frameId, squadSize, and an overrides object to pin any individual field. Same inputs → identical output, art included.

The NPC / monster seam

Each briefing exposes bpn.npcSeam = { contactArchetype, threatArchetype, threatRole } — archetype keys only, no stats. A future NPC/monster module reads these to spin up cast members in whatever engine it targets, without this module ever importing that engine's actor schema. The GM Dossier surfaces the seam explicitly so the handler knows which cast slots are reserved.

Colour bands

Blue · Yellow · Green · White · Grey · Silver · Jade · Red · Black · Platinum — each with its own classification, SCL requirement, CBS pay band, media posture, and render accent. See core/data/colours.js.

Provenance

Rebuilt from the strongest parts of the earlier Foundry-bound experiments (sla-bpn-dispatch's mission engine and player/GM split, the sla-bpn-toolkit data, sla-briefing-desk's output pattern), with every engine call removed and the real SLA house fonts and palette applied.