The foe block broke twice in two releases, both times because each surface decided for itself, in its own hand-written ternary, which of the cases it was in. classifyFoes() in the new module/foes.mjs makes that choice once — forged, planned, unavailable, none — and both surfaces switch on it. foes.mjs is Foundry-free on purpose, so foundry-module/ test.mjs can run it under plain node with no shim. Fourteen tests, each one a case that shipped broken or nearly did. enter() now survives a Forge that throws. It had no catch, so a failure left the scene raised, no cards posted and the turn not advanced, and a retry would stage the area twice — while the comment above it claimed the branch handled exactly that. A failed stage stops before the turn advances, since there is nothing to run; a failed population keeps going, because the scene is up and the planned roster stands in. An area with combat heat but neither actors nor a roster used to render nothing at all. It now says so and points at the decision and fallback. The "say so before initiative" addendum is gone from all three renderers. It was gated on the literal word ONLY, and the palace, port and village battle rosters already end with that exact phrase, so it printed twice. The packs that need the instruction carry it themselves. Also: draft() spreads params before the pack, like raiseDungeon; and packById validates the cached pack rather than trusting it, so the fail-closed rule holds at boot too. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DELVE
An authoring system and Foundry VTT module for the VANITY tabletop RPG. Press one button and it generates a whole dungeon — fiction, areas, maps, encounters, hoards and a journal you can read cold — then drops it into your world.
Install (Foundry)
Add-on Modules → Install Module → Manifest URL:
https://github.com/slaguru666/vanity-delve/releases/latest/download/module.json
Requires the VANITY system, 0.10.4 or later — that is the release the Forge seams landed in, and without them a delve emits nine stray chat cards and three stray folders.
- ⛏ raise a dungeon
- 🗑 remove one you don't want — it deletes exactly what it made and nothing else
- ⏩ stage a delve you finished at the desk
Also a CLI
core/ is pure JavaScript with no Foundry dependencies, so a delve can be generated, rerolled and
finished outside the VTT:
node core/cli.mjs --new --seed=my-delve --file=my.json
node core/cli.mjs --file=my.json --worksheet # everything, with prompts for what only you can write
node core/cli.mjs --file=my.json --reroll=3:situation
node core/cli.mjs --file=my.json --play # the tight, table-facing sheet
What it does and does not do
It generates the fiction, the order and the pressure. It does not write your read-aloud text or your climax, and it says so — those are prompts, not output. It gets you to a strong first draft in a minute instead of an evening, then gets out of the way.
DESIGN.md has the whole design history, including four rounds of adversarial review
and two paper playtests that failed before anything worked.
Layout
core/ |
the generator — pure JS, 39 tests |
foundry-module/ |
the Foundry module, with core/ vendored |
paper/ |
a hand-written delve and both playtest logs |
spike/ |
the harness that measured VANITY's Forge outside Foundry |
samples/ |
generated output |
Licence
MIT — see LICENSE.