The brief was a tool in Foundry that generates everything on a click and injects
it as a new dungeon. Previously the module could only stage a delve authored at
the desk, and the only way in was a console command — an API with a button glued
on, which is why it looked like nothing was there.
The ⛏ button now opens a form (theme, areas, depth, heroes, deadliness, density,
greed, clock, ending, seed, and whether to build maps and roll encounters), and
Raise the dungeon builds the lot in about five seconds:
• a folder per document type, named for the dungeon
• one scene per area, walls and lighting placed, via the VANITY Forge
• encounter actors, foldered rather than scattered across the world
• a JournalEntry — GM truth, a page per area, the ending — which is the
adventure, and is written to be read cold
The journal is the deliverable. Scenes without it are a pile of maps.
Generating is cheap, so removing had to be. Every document DELVE creates is
stamped with a dungeonId, and a 🗑 button lists what it built and deletes one
dungeon entirely — confirming with exact counts first, and never deleting the
scene the GM is standing in. Colour is not an identifier: it is a Color object,
and a GM may recolour a folder.
Verified live: two dungeons raised from the form and the API, then one removed
cleanly at -3 scenes, -10 actors, -1 journal, -3 folders with nothing else
touched.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
535 lines
18 KiB
JSON
535 lines
18 KiB
JSON
{
|
|
"schema": 1,
|
|
"generatorVersion": "0.1.0",
|
|
"catalogVersion": "barrow@1",
|
|
"seed": "my-delve",
|
|
"params": {
|
|
"areas": 6,
|
|
"depth": 2,
|
|
"party": 4,
|
|
"deadliness": "standard",
|
|
"density": "standard",
|
|
"greed": "standard",
|
|
"clock": "standard",
|
|
"ending": "authored",
|
|
"theme": "barrow"
|
|
},
|
|
"skeleton": {
|
|
"placeName": "The Tomb of the Silent Margrave",
|
|
"knot": {
|
|
"appetiteId": "first",
|
|
"accommodationId": "bound",
|
|
"claimant": "Silent Margrave",
|
|
"conscript": "a procession",
|
|
"transgression": "The Silent Margrave bound a procession by oath they could not break, so that someone would always go behind them.",
|
|
"cruelty": 2
|
|
},
|
|
"motif": {
|
|
"id": "precedence",
|
|
"danger": "procession",
|
|
"dangerLine": "the barrow keeps its order, and you have joined the queue",
|
|
"trigger": "announced"
|
|
},
|
|
"prize": {
|
|
"kind": "regalia",
|
|
"label": "the crown worn first, and only once",
|
|
"function": "the proof of precedence"
|
|
},
|
|
"bottomProblem": {
|
|
"label": "The Silent Margrave",
|
|
"wantNow": "to be first in all things",
|
|
"failureState": "is second now, and cannot bear it",
|
|
"handledBy": "giving them what they want, at a price"
|
|
},
|
|
"appeasement": {
|
|
"move": "stand aside and let it go ahead of you",
|
|
"attribute": "Poise",
|
|
"successes": 2,
|
|
"why": "it goes first",
|
|
"gain": {
|
|
"vanity": 1
|
|
},
|
|
"cost": {
|
|
"bane": 1
|
|
},
|
|
"repeatable": true,
|
|
"faction": "The Silent Host"
|
|
},
|
|
"factions": [
|
|
{
|
|
"id": "host",
|
|
"name": "The Silent Host",
|
|
"kind": "undead",
|
|
"essence": "still performing the ritual they were buried for",
|
|
"handledBy": "courtesy",
|
|
"conscriptedAs": "a procession"
|
|
},
|
|
{
|
|
"id": "wardens",
|
|
"name": "the Barrow-Wardens",
|
|
"kind": "undead",
|
|
"essence": "sealed this place and stayed to make sure",
|
|
"handledBy": "proof of right"
|
|
}
|
|
],
|
|
"foreshadow": [
|
|
{
|
|
"index": 1,
|
|
"role": "approach",
|
|
"facet": "institution",
|
|
"fragment": "numbered flagstones, counting down"
|
|
},
|
|
{
|
|
"index": 2,
|
|
"role": "complication",
|
|
"facet": "ritual",
|
|
"fragment": "banners in sequence, each house a place further back"
|
|
},
|
|
{
|
|
"index": 3,
|
|
"role": "complication",
|
|
"facet": "ritual",
|
|
"fragment": "a herald's script with the order still marked"
|
|
},
|
|
{
|
|
"index": 4,
|
|
"role": "turn",
|
|
"facet": "demand",
|
|
"fragment": "a door only one person may pass at a time, and only first"
|
|
},
|
|
{
|
|
"index": 5,
|
|
"role": "descent",
|
|
"facet": "wound",
|
|
"fragment": "a name moved to the front by force, repeatedly"
|
|
},
|
|
{
|
|
"index": 6,
|
|
"role": "threshold",
|
|
"facet": "anchor",
|
|
"fragment": "the crown worn first, and only once"
|
|
},
|
|
{
|
|
"index": 7,
|
|
"role": "ending",
|
|
"facet": "demand",
|
|
"fragment": "a corridor that will not let two walk abreast"
|
|
}
|
|
]
|
|
},
|
|
"areas": [
|
|
{
|
|
"index": 1,
|
|
"role": "approach",
|
|
"name": "The Outer Cut",
|
|
"facet": "institution",
|
|
"cueFragments": [
|
|
"numbered flagstones, counting down",
|
|
"the queue disturbed — three of the dead pushed aside"
|
|
],
|
|
"situation": {
|
|
"occupant": "two of the Host",
|
|
"doing": "refusing, each of them, to go through a door second",
|
|
"onArrival": "they both look at you to break it",
|
|
"because": "neither may be seen to yield",
|
|
"offer": "rule between them and the loser attaches to you as a lesser"
|
|
},
|
|
"truth": "This is how the place was ordered, and it still is",
|
|
"decision": {
|
|
"cue": "banners in strict order, and one you could move",
|
|
"cost": "reordering them opens a way and insults everyone buried here",
|
|
"resolve": {
|
|
"roll": "Wits 2",
|
|
"success": "you reorder them correctly and a way opens",
|
|
"failure": "you reorder wrongly and insult everyone buried here: +1 Bane",
|
|
"orElse": "leave them: the way stays shut, one Turn to find another"
|
|
}
|
|
},
|
|
"encounter": null,
|
|
"hoard": null,
|
|
"temptation": null,
|
|
"trigger": "disturbed",
|
|
"baneBeat": "noticing",
|
|
"clue": {
|
|
"automatic": "numbered flagstones, counting down — and it was done deliberately",
|
|
"extra": "[VANITY: Observation — 1 success] buys who did it, and roughly when"
|
|
},
|
|
"failureCase": "If they skip this, move its cue fragment into the next area so the motif still completes.",
|
|
"fallback": {
|
|
"route": "The Silent Host will receive anyone who behaves as a guest",
|
|
"cost": "one Bane on the tab, and they will expect it again"
|
|
}
|
|
},
|
|
{
|
|
"index": 2,
|
|
"role": "complication",
|
|
"name": "The Waiting Room",
|
|
"facet": "ritual",
|
|
"cueFragments": [
|
|
"banners in sequence, each house a place further back",
|
|
"a rank-plate prised off and dropped, still shiny where it sat"
|
|
],
|
|
"situation": {
|
|
"occupant": "a procession",
|
|
"doing": "passing through, unhurried, with you in its way",
|
|
"onArrival": "it does not stop or go round",
|
|
"because": "it has right of way and has had for three centuries",
|
|
"offer": "stand aside and be counted courteous; join it and be counted one of them"
|
|
},
|
|
"truth": "The office is still being performed, for someone who is no longer served by it",
|
|
"decision": {
|
|
"cue": "a corridor that will not let two walk abreast",
|
|
"cost": "whoever goes first meets whatever is there first",
|
|
"resolve": {
|
|
"roll": "Poise 1",
|
|
"success": "you settle the order and whoever leads meets what is there, ready",
|
|
"failure": "you argue in the corridor and something arrives while you do",
|
|
"orElse": "send one scout: slow, one Turn, and they are alone"
|
|
}
|
|
},
|
|
"encounter": null,
|
|
"hoard": "pocket",
|
|
"temptation": {
|
|
"id": "herald",
|
|
"cue": "a herald's script with your name pencilled in",
|
|
"benefit": "once, be announced as whatever you claim",
|
|
"useCost": {
|
|
"bane": 1
|
|
},
|
|
"standingDrawback": "you must live up to it in front of the Host"
|
|
},
|
|
"trigger": "seenTwice",
|
|
"baneBeat": "noticing",
|
|
"clue": {
|
|
"automatic": "banners in sequence, each house a place further back — and it was done deliberately",
|
|
"extra": "[VANITY: Observation — 1 success] buys who did it, and roughly when"
|
|
},
|
|
"failureCase": "If they skip this, move its cue fragment into the next area so the motif still completes.",
|
|
"fallback": {
|
|
"route": "The Silent Host will receive anyone who behaves as a guest",
|
|
"cost": "one Bane on the tab, and they will expect it again"
|
|
}
|
|
},
|
|
{
|
|
"index": 3,
|
|
"role": "complication",
|
|
"name": "The Attendants' Row",
|
|
"facet": "ritual",
|
|
"cueFragments": [
|
|
"a herald's script with the order still marked",
|
|
"someone has walked the corridor the wrong way, scuffing one side"
|
|
],
|
|
"situation": {
|
|
"occupant": "a living robber",
|
|
"doing": "prising number-plates off the flagstones",
|
|
"onArrival": "they freeze, then offer you one",
|
|
"because": "they worked out the order is what keeps the doors shut",
|
|
"offer": "take a plate and go first anywhere — the Host will hate you for it"
|
|
},
|
|
"truth": "The office is still being performed, for someone who is no longer served by it",
|
|
"decision": {
|
|
"cue": "a door that opens only for the foremost of a party",
|
|
"cost": "someone must be named first, aloud, and the others must accept it",
|
|
"resolve": {
|
|
"roll": "Flair 2",
|
|
"success": "someone is named first, aloud, and the door opens for them",
|
|
"failure": "the naming is disputed and the door reads that as no answer",
|
|
"orElse": "let the barrow choose: it picks the loudest, and remembers"
|
|
}
|
|
},
|
|
"encounter": {
|
|
"heat": "fight",
|
|
"kind": "undead",
|
|
"roster": {
|
|
"line": "1 Ghoul and 2 Skeletons",
|
|
"foes": [
|
|
{
|
|
"n": 1,
|
|
"name": "Ghoul",
|
|
"atk": 4,
|
|
"def": 3,
|
|
"grit": 4,
|
|
"nerve": 5,
|
|
"note": "on a hit, a free Called Shot to freeze for a round"
|
|
},
|
|
{
|
|
"n": 2,
|
|
"name": "Skeleton",
|
|
"atk": 3,
|
|
"def": 2,
|
|
"grit": 1,
|
|
"nerve": 5,
|
|
"note": "fearless"
|
|
}
|
|
],
|
|
"harmedBy": "anything",
|
|
"avoid": "the Ghoul goes for court dress first — send someone plain"
|
|
}
|
|
},
|
|
"hoard": "cache",
|
|
"temptation": {
|
|
"id": "rankplate",
|
|
"cue": "a rank-plate prised off something and pocketed",
|
|
"benefit": "go first through any door the barrow guards",
|
|
"useCost": {
|
|
"bane": 1
|
|
},
|
|
"standingDrawback": "going first is now expected of you"
|
|
},
|
|
"trigger": "loud",
|
|
"baneBeat": "noticing",
|
|
"clue": {
|
|
"automatic": "a herald's script with the order still marked — and it was done deliberately",
|
|
"extra": "[VANITY: Observation — 1 success] buys who did it, and roughly when"
|
|
},
|
|
"failureCase": "If they skip this, move its cue fragment into the next area so the motif still completes.",
|
|
"fallback": {
|
|
"route": "The Silent Host will receive anyone who behaves as a guest",
|
|
"cost": "one Bane on the tab, and they will expect it again"
|
|
}
|
|
},
|
|
{
|
|
"index": 4,
|
|
"role": "turn",
|
|
"name": "The Middle Vault",
|
|
"facet": "demand",
|
|
"cueFragments": [
|
|
"a door only one person may pass at a time, and only first",
|
|
"a seat at the head of the hall dragged back, as if to sit in"
|
|
],
|
|
"situation": {
|
|
"occupant": "a queue of the Host",
|
|
"doing": "waiting to pass a door, in strict order, not moving",
|
|
"onArrival": "the queue opens a gap at exactly your rank",
|
|
"because": "the first in line is waiting for someone who never arrived",
|
|
"offer": "take the gap and go with them; take the front and they will remember it"
|
|
},
|
|
"truth": "Here the want is explicit — the place asks something of whoever enters",
|
|
"decision": {
|
|
"cue": "a claim to settle: which of you the barrow should address",
|
|
"cost": "settling it opens the way; refusing to settle it does not",
|
|
"resolve": {
|
|
"roll": "Poise 2",
|
|
"success": "the claim is settled and the barrow addresses one of you from now on",
|
|
"failure": "it is not settled, and the barrow keeps asking, in worse places",
|
|
"orElse": "refuse to settle: the way on does not open"
|
|
}
|
|
},
|
|
"encounter": null,
|
|
"hoard": null,
|
|
"temptation": null,
|
|
"trigger": "announced",
|
|
"baneBeat": "noticing",
|
|
"clue": {
|
|
"automatic": "a door only one person may pass at a time, and only first — and it was done deliberately",
|
|
"extra": "[VANITY: Observation — 1 success] buys who did it, and roughly when"
|
|
},
|
|
"failureCase": "If they skip this, move its cue fragment into the next area so the motif still completes.",
|
|
"fallback": {
|
|
"route": "The Silent Host will receive anyone who behaves as a guest",
|
|
"cost": "one Bane on the tab, and they will expect it again"
|
|
}
|
|
},
|
|
{
|
|
"index": 5,
|
|
"role": "descent",
|
|
"name": "The Lower Cut",
|
|
"facet": "wound",
|
|
"cueFragments": [
|
|
"a name moved to the front by force, repeatedly",
|
|
"a numbered flagstone lifted and not replaced"
|
|
],
|
|
"situation": {
|
|
"occupant": "one of the Host with a herald's staff",
|
|
"doing": "announcing arrivals to an empty stair",
|
|
"onArrival": "it announces you, inventing a rank",
|
|
"because": "the post requires arrivals and there have been none",
|
|
"offer": "accept the invented rank and the barrow will treat you as it"
|
|
},
|
|
"truth": "This is the damage the want did to those who had to satisfy it",
|
|
"decision": {
|
|
"cue": "a stair where the order of descent is visibly recorded",
|
|
"cost": "whoever goes last is remembered as having gone last",
|
|
"resolve": {
|
|
"roll": "Poise 2",
|
|
"success": "you settle the order before you descend and the record reads as a party, not a rabble",
|
|
"failure": "you descend in a scramble: whoever is recorded last is treated as least by the Host from here",
|
|
"orElse": "descend however you like and accept the record as it falls"
|
|
}
|
|
},
|
|
"encounter": null,
|
|
"hoard": null,
|
|
"temptation": null,
|
|
"trigger": "announced",
|
|
"baneBeat": "noticing",
|
|
"clue": {
|
|
"automatic": "a name moved to the front by force, repeatedly — and it was done deliberately",
|
|
"extra": "[VANITY: Observation — 1 success] buys who did it, and roughly when"
|
|
},
|
|
"failureCase": "If they skip this, move its cue fragment into the next area so the motif still completes.",
|
|
"fallback": {
|
|
"route": "The Silent Host will receive anyone who behaves as a guest",
|
|
"cost": "one Bane on the tab, and they will expect it again"
|
|
}
|
|
},
|
|
{
|
|
"index": 6,
|
|
"role": "threshold",
|
|
"name": "The Last Door",
|
|
"facet": "anchor",
|
|
"cueFragments": [
|
|
"the crown worn first, and only once",
|
|
"banners pulled down and stacked without regard for order"
|
|
],
|
|
"situation": {
|
|
"occupant": "one of the Host",
|
|
"doing": "reading out an order of precedence to an empty hall",
|
|
"onArrival": "it pauses and asks where you fall in it",
|
|
"because": "the list must be read in full before anyone may proceed",
|
|
"offer": "name your own place in the order and it will be honoured, exactly"
|
|
},
|
|
"truth": "The thing the whole barrow is arranged around is close",
|
|
"decision": {
|
|
"cue": "a queue of the dead, and a way to step round it",
|
|
"cost": "waiting costs two Turns; pushing in costs the Host's patience",
|
|
"resolve": {
|
|
"roll": "Poise 2",
|
|
"success": "you step round without breaking the order, and the Host allows it",
|
|
"failure": "you push in: +1 Bane and the queue closes behind you",
|
|
"orElse": "wait: two Turns, and the Host thinks better of you"
|
|
}
|
|
},
|
|
"encounter": {
|
|
"heat": "battle",
|
|
"kind": "undead",
|
|
"roster": {
|
|
"line": "1 Wraith and 3 Skeletons",
|
|
"foes": [
|
|
{
|
|
"n": 1,
|
|
"name": "Wraith",
|
|
"atk": 5,
|
|
"def": 3,
|
|
"grit": 10,
|
|
"nerve": 5,
|
|
"note": "INCORPOREAL — chill touch ignores armour and drains 1 max Grit"
|
|
},
|
|
{
|
|
"n": 3,
|
|
"name": "Skeleton",
|
|
"atk": 3,
|
|
"def": 2,
|
|
"grit": 1,
|
|
"nerve": 5,
|
|
"note": "fearless"
|
|
}
|
|
],
|
|
"harmedBy": "blessed, silvered or magical weapons ONLY",
|
|
"avoid": "it will take an appeasement over a fight every time"
|
|
}
|
|
},
|
|
"hoard": "chest",
|
|
"temptation": {
|
|
"id": "coronet",
|
|
"cue": "a small crown, sized for someone who never grew",
|
|
"benefit": "+1 die when others must defer to you",
|
|
"useCost": {
|
|
"bane": 1
|
|
},
|
|
"standingDrawback": "you must be addressed correctly or lose the benefit"
|
|
},
|
|
"trigger": "announced",
|
|
"baneBeat": null,
|
|
"clue": {
|
|
"automatic": "the crown worn first, and only once — and it was done deliberately",
|
|
"extra": "[VANITY: Observation — 1 success] buys who did it, and roughly when"
|
|
},
|
|
"failureCase": "If they skip this, the ending opens with them holding nothing the bottom problem wants.",
|
|
"fallback": {
|
|
"route": "The Silent Host will receive anyone who behaves as a guest",
|
|
"cost": "one Bane on the tab, and they will expect it again"
|
|
}
|
|
}
|
|
],
|
|
"ending": {
|
|
"index": 7,
|
|
"role": "ending",
|
|
"mode": "authored",
|
|
"heat": null,
|
|
"hoard": null,
|
|
"name": "The Audience",
|
|
"cueFragments": [
|
|
"a corridor that will not let two walk abreast"
|
|
],
|
|
"question": "\"Who goes first?\"",
|
|
"authored": true
|
|
},
|
|
"triggerGlossary": {
|
|
"announced": "entered somewhere grandly — the big doors, a shout, a herald",
|
|
"seenTwice": "reflected, echoed or witnessed twice over in one place",
|
|
"loud": "a raised voice, a broken door, steel on stone",
|
|
"lingering": "stayed in one place longer than it takes to search it",
|
|
"disturbed": "struck or moved something that had not moved in centuries"
|
|
},
|
|
"budget": {
|
|
"plannedFights": 2,
|
|
"heatBase": "fight",
|
|
"wantFights": 2
|
|
},
|
|
"pressure": {
|
|
"turn": 0,
|
|
"clockRolls": 0,
|
|
"clockFired": 0,
|
|
"triggerNumber": 1,
|
|
"escalated": false,
|
|
"tab": 5,
|
|
"target": 5
|
|
},
|
|
"authored": {
|
|
"title": null,
|
|
"intro": null,
|
|
"areas": {
|
|
"1": {
|
|
"readAloud": null,
|
|
"notes": null,
|
|
"nameOverride": null,
|
|
"locked": []
|
|
},
|
|
"2": {
|
|
"readAloud": null,
|
|
"notes": null,
|
|
"nameOverride": null,
|
|
"locked": []
|
|
},
|
|
"3": {
|
|
"readAloud": null,
|
|
"notes": null,
|
|
"nameOverride": null,
|
|
"locked": []
|
|
},
|
|
"4": {
|
|
"readAloud": null,
|
|
"notes": null,
|
|
"nameOverride": null,
|
|
"locked": []
|
|
},
|
|
"5": {
|
|
"readAloud": null,
|
|
"notes": null,
|
|
"nameOverride": null,
|
|
"locked": []
|
|
},
|
|
"6": {
|
|
"readAloud": null,
|
|
"notes": null,
|
|
"nameOverride": null,
|
|
"locked": []
|
|
}
|
|
},
|
|
"ending": {
|
|
"readAloud": null,
|
|
"notes": null,
|
|
"locked": []
|
|
}
|
|
}
|
|
} |