diff --git a/core/content/barrow.json b/core/content/barrow.json index 339d99f..36c049c 100644 --- a/core/content/barrow.json +++ b/core/content/barrow.json @@ -289,27 +289,63 @@ "decisions": [ { "cue": "a doorway you can only reach by crossing open floor, in full view", - "cost": "cross it and you are seen — roll the clock; go the long way and lose a Turn" + "cost": "cross it and you are seen — roll the clock; go the long way and lose a Turn", + "resolve": { + "roll": "Wits 1", + "success": "you time the crossing between whatever is watching — no clock roll", + "failure": "you are seen: roll the clock now", + "orElse": "go the long way: one Turn, no risk" + } }, { "cue": "a mirror blocking the passage, angled to catch whoever passes", - "cost": "cover it and something notices the dark; pass it and something notices you" + "cost": "cover it and something notices the dark; pass it and something notices you", + "resolve": { + "roll": "Flair 2", + "success": "you cover it without meeting your own eye — pass freely", + "failure": "you meet your own eye: +1 Bane and roll the clock", + "orElse": "smash it — loud, roll the clock, but done" + } }, { "cue": "a portrait that must be moved to open the way behind it", - "cost": "turn it to the wall and the Host takes offence; carry it and you are announced everywhere" + "cost": "turn it to the wall and the Host takes offence; carry it and you are announced everywhere", + "resolve": { + "roll": "Poise 2", + "success": "you turn it aside with enough ceremony that the Host takes no offence", + "failure": "the Host is offended: they will not receive you until someone appeases", + "orElse": "leave it and squeeze past: one Turn, and you are watched" + } }, { "cue": "a gallery lit end to end, and an unlit servants' crawl beside it", - "cost": "the gallery is quick and bright; the crawl costs a Turn and a Brawn roll" + "cost": "the gallery is quick and bright; the crawl costs a Turn and a Brawn roll", + "resolve": { + "roll": "Brawn 2", + "success": "you make the crawl in good order", + "failure": "you arrive filthy and stuck: lose a Turn, +1 Bane", + "orElse": "take the gallery: fast, bright, and you are seen" + } }, { "cue": "a shuttered window onto the next room, and a choice about opening it", - "cost": "looking through costs nothing; being seen looking costs a Bane" + "cost": "looking through costs nothing; being seen looking costs a Bane", + "resolve": { + "roll": "Wits 1", + "success": "you see through without being framed in the opening", + "failure": "you are framed: whatever is beyond has your description", + "orElse": "do not look; you go in blind but unannounced" + } }, { "cue": "a room you must cross either quickly or quietly", - "cost": "quick is one Turn and a clock roll; quiet is two Turns and none" + "cost": "quick is one Turn and a clock roll; quiet is two Turns and none", + "resolve": { + "roll": null, + "success": null, + "failure": null, + "orElse": "a pure choice: quick costs a clock roll, quiet costs two Turns" + } } ], "temptations": [ @@ -361,6 +397,14 @@ }, "standingDrawback": "they are watching you back" } + ], + "features": [ + "a mirror smashed deliberately, and recently — the pieces swept into a corner", + "scorch-marks where someone burned a portrait and did not stay to watch", + "a sheet thrown over something, by living hands, in a hurry", + "eyeholes bored through a wall at three different heights", + "a lamp set facing the wall so it lights nothing but stone", + "dust disturbed in a wide circle, as though someone turned slowly on the spot" ] }, "naming": { @@ -397,27 +441,63 @@ "decisions": [ { "cue": "a door with a name cut into it, and a space beneath for a reply", - "cost": "answer with your own name and it opens — and it is written down" + "cost": "answer with your own name and it opens — and it is written down", + "resolve": { + "roll": "Wits 2", + "success": "you give a name that is true enough to open it and thin enough to cost nothing", + "failure": "the door takes your real name: it is written down, and things here now use it", + "orElse": "refuse to answer: the door stays shut, find another way at one Turn" + } }, { "cue": "a roll of the dead, and one line you could strike out", - "cost": "striking a name frees something; it also puts you where the name was" + "cost": "striking a name frees something; it also puts you where the name was", + "resolve": { + "roll": "Poise 2", + "success": "you strike the name cleanly and something long-bound is released, grateful", + "failure": "the strike is crooked: you are entered where the name was, +1 Bane", + "orElse": "leave the roll alone; nothing is freed and nothing is owed" + } }, { "cue": "someone's name called softly from two directions at once", - "cost": "answer either and the other stops calling" + "cost": "answer either and the other stops calling", + "resolve": { + "roll": "Wits 1", + "success": "you work out which call is the real one", + "failure": "you answer the wrong one and the other keeps calling, closer", + "orElse": "answer neither: both keep calling for the rest of the delve" + } }, { "cue": "a lintel you must be announced under, or crawl beneath", - "cost": "announced costs a Bane; crawling costs your dignity and a Turn" + "cost": "announced costs a Bane; crawling costs your dignity and a Turn", + "resolve": { + "roll": "Flair 2", + "success": "you are announced as something grander than you are, and it holds", + "failure": "the announcement is thin and the Host hears it: +1 Bane", + "orElse": "crawl beneath: undignified, one Turn, entirely safe" + } }, { "cue": "a list of the dead with one name you recognise", - "cost": "saying it aloud helps; it also tells the barrow you are connected" + "cost": "saying it aloud helps; it also tells the barrow you are connected", + "resolve": { + "roll": "Wits 2", + "success": "the hand is recent — you learn who else is down here and roughly when", + "failure": "you learn nothing but leave your own mark on the page", + "orElse": "do not touch it; the name stays unread" + } }, { "cue": "two passages, and someone is being called down one of them", - "cost": "follow the voice and be expected; take the other and arrive unannounced" + "cost": "follow the voice and be expected; take the other and arrive unannounced", + "resolve": { + "roll": "Poise 1", + "success": "you follow the voice and arrive expected, which opens doors", + "failure": "you arrive expected by the wrong thing", + "orElse": "take the other passage: unannounced, one extra Turn" + } } ], "temptations": [ @@ -469,6 +549,14 @@ }, "standingDrawback": "they come whenever your name is said aloud" } + ], + "features": [ + "a name freshly scratched over an old one, in a modern hand", + "a page torn out and the stub still in the binding", + "someone has been writing their own name on things, repeatedly", + "a gravestone laid face-down, which takes two people", + "chalk marks numbering the doorways, not old", + "a name spoken so recently the air still feels used" ] }, "voices": { @@ -505,27 +593,63 @@ "decisions": [ { "cue": "an order carved into the floor, still legible", - "cost": "obey it and the Host counts you as household; step over it and they do not" + "cost": "obey it and the Host counts you as household; step over it and they do not", + "resolve": { + "roll": "Poise 2", + "success": "you obey exactly enough to be counted household — Skeletons stand down for you", + "failure": "you obey wrongly, which is worse than not obeying: +1 Bane", + "orElse": "step over it: no cost now, and the Host does not count you as theirs" + } }, { "cue": "a speaking-tube that is warm, and asking a question down it", - "cost": "an answer comes back — and now something knows where you are" + "cost": "an answer comes back — and now something knows where you are", + "resolve": { + "roll": "Wits 2", + "success": "the tube answers truly, and you learn the way on", + "failure": "something answers and now knows where you are: roll the clock", + "orElse": "do not speak into it; you keep your position but learn nothing" + } }, { "cue": "a bell-pull that would summon someone", - "cost": "ring it and help comes, and it is not the kind you wanted" + "cost": "ring it and help comes, and it is not the kind you wanted", + "resolve": { + "roll": "Poise 2", + "success": "what comes is answerable to you for one scene", + "failure": "what comes is not the kind of help you wanted", + "orElse": "do not ring: the way on is longer by one Turn" + } }, { "cue": "two doors, and behind one a voice giving instructions to nobody", - "cost": "the quiet door is longer; the voice would tell you exactly where to go" + "cost": "the quiet door is longer; the voice would tell you exactly where to go", + "resolve": { + "roll": null, + "success": null, + "failure": null, + "orElse": "a pure choice: the voice names the route exactly, the quiet door takes one Turn" + } }, { "cue": "an instruction you can obey, ignore, or countermand", - "cost": "countermanding it works once and marks you as someone who gives orders" + "cost": "countermanding it works once and marks you as someone who gives orders", + "resolve": { + "roll": "Poise 2", + "success": "you countermand it and the dead obey you instead — this marks you as someone who gives orders: from now on the Host brings you their disputes, and once per delve you may issue one order they must follow", + "failure": "the order stands and you have been seen to fail at giving one: +1 Bane, and the Host addresses someone else from now on", + "orElse": "obey it, or ignore it and go round: ignoring costs one Turn" + } }, { "cue": "a door that opens to a spoken password nobody living knows", - "cost": "guessing costs a Bane per attempt; the long way costs two Turns" + "cost": "guessing costs a Bane per attempt; the long way costs two Turns", + "resolve": { + "roll": "Wits 2", + "success": "the fiction gives you the word — the unfinished order, the wax, the name on the tube all point at it", + "failure": "you have the shape of it but not the word: one more attempt, or take the long way", + "orElse": "the long way: two Turns, no guessing, no Banes" + } } ], "temptations": [ @@ -577,6 +701,14 @@ }, "standingDrawback": "you cannot hear warnings either" } + ], + "features": [ + "a bell-rope cut through, cleanly, from this side", + "wax jammed into a speaking-tube, still soft", + "an order half-scratched out and rewritten by a different hand", + "a door braced shut from within by furniture", + "boot-prints that stop mid-corridor and do not resume", + "someone has been talking here, and stopped when you arrived" ] }, "keeping": { @@ -613,27 +745,63 @@ "decisions": [ { "cue": "a room you can search, or leave exactly as you found it", - "cost": "searching disturbs a preservation three centuries old — roll the clock" + "cost": "searching disturbs a preservation three centuries old — roll the clock", + "resolve": { + "roll": "Wits 2", + "success": "you search without disturbing the arrangement", + "failure": "the preservation breaks: roll the clock, and something here begins to rot", + "orElse": "leave it exactly as found: nothing gained, nothing woken" + } }, { "cue": "a sealed jar, and a way on that needs what is inside", - "cost": "breaking the seal spends the year it holds, in front of you" + "cost": "breaking the seal spends the year it holds, in front of you", + "resolve": { + "roll": "Poise 2", + "success": "you break the seal cleanly and spend the year deliberately", + "failure": "the year escapes all at once, in front of everyone: +1 Bane", + "orElse": "find another way: one Turn" + } }, { "cue": "a bed, made, and a body-shaped hollow that has not filled in", - "cost": "lie in it and you rest fully; you also stop, and the barrow prefers that" + "cost": "lie in it and you rest fully; you also stop, and the barrow prefers that", + "resolve": { + "roll": null, + "success": null, + "failure": null, + "orElse": "a pure choice: rest fully and lose a Turn, or press on tired" + } }, { "cue": "a door held shut by nothing but the fact it has never been opened", - "cost": "open it and something that had not changed, changes" + "cost": "open it and something that had not changed, changes", + "resolve": { + "roll": "Brawn 2", + "success": "you move it and it survives, just", + "failure": "it does not survive, and the barrow notices what you cost it: +1 Bane", + "orElse": "squeeze past: one Turn and some skin" + } }, { "cue": "a preserved thing blocking the way, which will not survive being moved", - "cost": "move it and something here ends; leave it and lose a Turn" + "cost": "move it and something here ends; leave it and lose a Turn", + "resolve": { + "roll": "Wits 1", + "success": "you open it having understood what changes", + "failure": "something that had not changed, changes, and it was holding something back", + "orElse": "leave it shut; the way on is longer" + } }, { "cue": "food and water laid out, still good", - "cost": "eating restores you fully and the barrow adds you to what it keeps" + "cost": "eating restores you fully and the barrow adds you to what it keeps", + "resolve": { + "roll": "Poise 1", + "success": "you eat and are restored entirely", + "failure": "you are restored, and the barrow has added you to what it keeps: +1 Bane", + "orElse": "do not eat; you keep your Grit as it is" + } } ], "temptations": [ @@ -682,6 +850,14 @@ }, "standingDrawback": "it also halts something you wanted to finish" } + ], + "features": [ + "something here has been eaten, which should not be possible", + "a seal broken and the contents already spoiled", + "a clock stopped by hand — the pendulum caught and tied", + "one preserved thing removed, leaving a clean shape in the dust", + "a fire built recently, of furniture that was three centuries old", + "rot, in exactly one place, spreading" ] }, "display": { @@ -718,27 +894,63 @@ "decisions": [ { "cue": "an empty plinth, sized for something you are carrying", - "cost": "leave a thing and the Host approves; keep it and they compare you unfavourably" + "cost": "leave a thing and the Host approves; keep it and they compare you unfavourably", + "resolve": { + "roll": "Poise 2", + "success": "you leave the offering with enough style that the Host counts you a peer", + "failure": "your gift is judged and found wanting: +1 Bane, and they compare you aloud", + "orElse": "keep everything: the next door stays shut, find the long way at one Turn" + } }, { "cue": "a case of trophies and one obviously missing", - "cost": "replacing it opens the next door; nothing else will" + "cost": "replacing it opens the next door; nothing else will", + "resolve": { + "roll": "Wits 2", + "success": "you work out what the gap held and what would satisfy it", + "failure": "you fill it with the wrong thing and the Host notices the substitution", + "orElse": "force the case: loud, roll the clock, and the display is ruined" + } }, { "cue": "two ways on: one you must be invited down, one you may simply take", - "cost": "the invitation costs an act of admiration; taking it costs their good opinion" + "cost": "the invitation costs an act of admiration; taking it costs their good opinion", + "resolve": { + "roll": "Flair 2", + "success": "the invitation is given and you go down honoured", + "failure": "your admiration rings false: +1 Bane", + "orElse": "take the open way instead — free, and they think less of you for it" + } }, { "cue": "a gift left for you, unopened, with your description on it", - "cost": "opening it accepts the comparison; leaving it is a refusal, and noted" + "cost": "opening it accepts the comparison; leaving it is a refusal, and noted", + "resolve": { + "roll": "Wits 1", + "success": "you open it and find something chosen for someone like you", + "failure": "you open it and find it was not for you at all", + "orElse": "leave it: a refusal, noted, and the Host is cooler from here" + } }, { "cue": "a comparison invited — your gear against theirs", - "cost": "engage and gain their favour; decline and be marked as beneath notice" + "cost": "engage and gain their favour; decline and be marked as beneath notice", + "resolve": { + "roll": "Flair 2", + "success": "you win the comparison and their favour with it", + "failure": "you lose it publicly: +1 Bane and the Host addresses someone else", + "orElse": "decline: you are beneath notice, which is its own kind of safe" + } }, { "cue": "a display you could improve, or rob", - "cost": "improving it opens the next door; robbing it opens all of them, badly" + "cost": "improving it opens the next door; robbing it opens all of them, badly", + "resolve": { + "roll": "Poise 2", + "success": "you improve the display and the next door opens for a benefactor", + "failure": "your improvement is vandalism to them: +1 Bane", + "orElse": "rob it: every door in the barrow opens badly from now on" + } } ], "temptations": [ @@ -790,6 +1002,14 @@ }, "standingDrawback": "someone will want to test that" } + ], + "features": [ + "an empty case with the lock forced and the label left", + "a plinth pushed over, and nobody righted it", + "price marks chalked on the exhibits by someone practical", + "the best piece gone and a worse one moved into its place", + "a trophy defaced with a knife, thoroughly", + "sacking and rope left behind by people who meant to carry a lot" ] }, "company": { @@ -826,27 +1046,63 @@ "decisions": [ { "cue": "one of the dead follows you and will not be told otherwise", - "cost": "let it come and doors open; send it back and they close" + "cost": "let it come and doors open; send it back and they close", + "resolve": { + "roll": "Poise 2", + "success": "you let it come, courteously — it opens doors and stays close", + "failure": "it attaches: it will not be sent back, and it follows you out", + "orElse": "send it back firmly: doors close, and the way on costs a Turn" + } }, { "cue": "a chair drawn out, and a place laid, and time to sit", - "cost": "sitting costs a Turn and buys the Host's goodwill entirely" + "cost": "sitting costs a Turn and buys the Host's goodwill entirely", + "resolve": { + "roll": null, + "success": null, + "failure": null, + "orElse": "a pure choice: sit and lose a Turn for the Host's goodwill entirely, or press on" + } }, { "cue": "a door that will only admit one of you at a time", - "cost": "splitting the party is exactly what this place wants" + "cost": "splitting the party is exactly what this place wants", + "resolve": { + "roll": "Wits 2", + "success": "you find the order that gets everyone through without splitting for long", + "failure": "you are separated: the party is in two places when the clock next fires", + "orElse": "refuse to split: the door is not passed, one Turn to find another" + } }, { "cue": "a hand, skeletal, held out to be taken", - "cost": "take it and you are not alone; you are also not alone later" + "cost": "take it and you are not alone; you are also not alone later", + "resolve": { + "roll": "Poise 1", + "success": "you take it and are not alone — once, something comes when you call", + "failure": "you take it and are not alone later either, whether you call or not", + "orElse": "do not take it: it is left held out, and the Host remembers" + } }, { "cue": "a way on that only works if someone stays behind", - "cost": "whoever stays is not alone, and that is the problem" + "cost": "whoever stays is not alone, and that is the problem", + "resolve": { + "roll": "Brawn 2", + "success": "whoever stays holds the way open and rejoins later, shaken", + "failure": "whoever stays is kept: they rejoin at the ending, changed", + "orElse": "nobody stays: the way is impassable, two Turns to go round" + } }, { "cue": "an invitation to stay the night, meant sincerely", - "cost": "accepting restores everything and costs a Turn and a Bane" + "cost": "accepting restores everything and costs a Turn and a Bane", + "resolve": { + "roll": "Poise 1", + "success": "you accept, rest fully, and the Host is yours for the delve", + "failure": "you accept and the barrow counts you as staying: +1 Bane", + "orElse": "decline politely: no rest, no cost, slightly colder welcome" + } } ], "temptations": [ @@ -898,6 +1154,14 @@ }, "standingDrawback": "you are expected to come back" } + ], + "features": [ + "a bedroll, used, and not by anyone buried here", + "a chair dragged out of position and left where it was needed", + "two cups set out and one of them recently drunk from", + "a door tied open with a belt, so it could not close", + "someone has been counting the dead — tally marks by the entrance", + "a name carved beside another, joining them, badly" ] }, "confession": { @@ -934,27 +1198,63 @@ "decisions": [ { "cue": "a screen, a kneeler, and a question you can hear being asked", - "cost": "answer honestly and the way opens; lie and it opens anyway, differently" + "cost": "answer honestly and the way opens; lie and it opens anyway, differently", + "resolve": { + "roll": "Poise 2", + "success": "you answer honestly and the way opens, cleanly", + "failure": "you lie and it opens anyway, onto somewhere else", + "orElse": "go round: two Turns, and the question is still waiting" + } }, { "cue": "a scale, one pan holding a feather, the other empty", - "cost": "put something of yours in and it is weighed; walk past and you are not" + "cost": "put something of yours in and it is weighed; walk past and you are not", + "resolve": { + "roll": "Wits 1", + "success": "you weigh something small and true, and pass", + "failure": "you weigh something you needed: it is kept", + "orElse": "walk past unweighed: the way on is longer by a Turn" + } }, { "cue": "a book of absolutions with room for one more", - "cost": "signing it forgives someone; it does not say who" + "cost": "signing it forgives someone; it does not say who", + "resolve": { + "roll": "Poise 2", + "success": "you sign and someone long-accused is released", + "failure": "you sign and the accusation transfers to you: +1 Bane", + "orElse": "leave it unsigned: nothing forgiven, nothing owed" + } }, { "cue": "a door that opens to whoever admits something first", - "cost": "whoever speaks pays; whoever stays silent owes" + "cost": "whoever speaks pays; whoever stays silent owes", + "resolve": { + "roll": "Flair 1", + "success": "someone admits something and the door opens for them", + "failure": "nobody speaks: the door stays shut and the silence is counted", + "orElse": "force it: loud, roll the clock" + } }, { "cue": "a question asked directly of one hero, by name", - "cost": "answering costs privacy; refusing costs the way forward" + "cost": "answering costs privacy; refusing costs the way forward", + "resolve": { + "roll": "Wits 2", + "success": "you read the screen's angle and learn who has been here answering", + "failure": "you learn nothing and your own voice is now in the echo", + "orElse": "do not investigate: the room keeps its question" + } }, { "cue": "a penance offered instead of a fight", - "cost": "perform it and pass freely; it takes a Turn and it is humiliating" + "cost": "perform it and pass freely; it takes a Turn and it is humiliating", + "resolve": { + "roll": "Poise 2", + "success": "you perform the penance and pass freely", + "failure": "the penance is refused as insincere: +1 Bane", + "orElse": "fight instead — the way is open either way, at a cost" + } } ], "temptations": [ @@ -1003,6 +1303,14 @@ }, "standingDrawback": "you cannot remember it either, and it mattered" } + ], + "features": [ + "a confessional screen forced open from the wrong side", + "a page of absolutions torn out and burned separately", + "a kneeler moved to face a different way entirely", + "someone has answered the question aloud, and the echo has not settled", + "a knife left on the ledge where hands should rest", + "fresh ash in a place designed for keeping things" ] }, "precedence": { @@ -1039,27 +1347,63 @@ "decisions": [ { "cue": "a corridor that will not let two walk abreast", - "cost": "whoever goes first meets whatever is there first" + "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" + } }, { "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" + "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" + } }, { "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" + "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" + } }, { "cue": "banners in strict order, and one you could move", - "cost": "reordering them opens a way and insults everyone buried here" + "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" + } }, { "cue": "a stair where the order of descent is visibly recorded", - "cost": "whoever goes last is remembered as having gone last" + "cost": "whoever goes last is remembered as having gone last", + "resolve": { + "roll": null, + "success": null, + "failure": null, + "orElse": "a pure choice: whoever goes last is recorded as having gone last, and the Host treats them accordingly" + } }, { "cue": "a claim to settle: which of you the barrow should address", - "cost": "settling it opens the way; refusing to settle it does not" + "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" + } } ], "temptations": [ @@ -1111,6 +1455,14 @@ }, "standingDrawback": "you go first into everything from now on" } + ], + "features": [ + "banners pulled down and stacked without regard for order", + "a rank-plate prised off and dropped, still shiny where it sat", + "someone has walked the corridor the wrong way, scuffing one side", + "the queue disturbed — three of the dead pushed aside", + "a numbered flagstone lifted and not replaced", + "a seat at the head of the hall dragged back, as if to sit in" ] } }, @@ -1442,5 +1794,5 @@ "lingering": "stayed in one place longer than it takes to search it", "disturbed": "struck or moved something that had not moved in centuries" }, - "_globalPoolsNote": "decisions/temptations below are FALLBACKS ONLY. Real content is motif-scoped under motifs..decisions/.temptations, so the furniture matches the fiction." + "_globalPoolsNote": "decisions/temptations/features below are FALLBACKS ONLY. Real content is motif-scoped under motifs.." } \ No newline at end of file diff --git a/core/delve.mjs b/core/delve.mjs index 878c2e0..9cd9747 100644 --- a/core/delve.mjs +++ b/core/delve.mjs @@ -42,7 +42,8 @@ export function generateDelve(params = {}) { // cohered but the things in the rooms did not belong to it. const motifPack = pack.motifs?.[skeleton.motif.id] ?? {}; const decisionPool = motifPack.decisions?.length ? motifPack.decisions : (pack.decisions ?? []); - const features = deal(pack.features ?? [], plan.areas.length, 'features'); + const featurePool = motifPack.features?.length ? motifPack.features : (pack.features ?? []); + const features = deal(featurePool, plan.areas.length, 'features', pack.features ?? []); const decisions = deal(decisionPool, plan.areas.length, 'decisions', pack.decisions ?? []); // Temptations are dealt across the areas that carry a hoard, for the same reason as decisions: diff --git a/core/render.mjs b/core/render.mjs index d3b6949..9948c16 100644 --- a/core/render.mjs +++ b/core/render.mjs @@ -78,6 +78,15 @@ export function renderMarkdown(d) { L.push(''); } L.push(`**The decision.** ${a.decision.cue} — *${a.decision.cost}*`); + const rv = a.decision.resolve; + if (rv) { + if (rv.roll) { + L.push(`- **Attempt it:** \`[VANITY: ${rv.roll}]\``); + L.push(`- **Success:** ${rv.success}`); + L.push(`- **Failure:** ${rv.failure}`); + } + L.push(`- **Or simply:** ${rv.orElse}`); + } L.push(''); if (a.encounter) { const R = a.encounter.roster; diff --git a/core/test.mjs b/core/test.mjs index 54ed8c6..955b30a 100644 --- a/core/test.mjs +++ b/core/test.mjs @@ -55,7 +55,7 @@ for (let i = 0; i < 30; i++) { t('no repeated cue fragment inside one delve', repeats === 0, `${repeats}/30 had repeats`); // motif-scoping: the furniture must belong to the fiction, not a global pool -let offMotifDecisions = 0, offMotifTemptations = 0, checked = 0; +let offMotifDecisions = 0, offMotifTemptations = 0, offMotifFeatures = 0, checked = 0; for (let i = 0; i < 40; i++) { const d = generateDelve({ pack, seed: `scope-${i}`, areas: 6 }); const m = pack.motifs[d.skeleton.motif.id]; @@ -65,9 +65,11 @@ for (let i = 0; i < 40; i++) { checked++; if (a.decision && !okD.has(a.decision.cue)) offMotifDecisions++; if (a.temptation && !okT.has(a.temptation.id)) offMotifTemptations++; + if (a.cueFragments[1] && !(m.features ?? []).includes(a.cueFragments[1])) offMotifFeatures++; } } t('decisions come from the delve\'s own motif', offMotifDecisions === 0, `${offMotifDecisions}/${checked} off-motif`); +t('features come from the delve\'s own motif', offMotifFeatures === 0, `${offMotifFeatures}/${checked} off-motif`); t('temptations come from the delve\'s own motif', offMotifTemptations === 0, `${offMotifTemptations} off-motif`); // no repeated decision or temptation inside one delve @@ -84,5 +86,19 @@ for (let i = 0; i < 40; i++) { t('no repeated decision inside one delve', dupD === 0, `${dupD}/80`); t('no repeated temptation inside one delve', dupT === 0, `${dupT}/80`); +// every decision must be resolvable, and no decision may gate progress without an escape +let noResolve = 0, noEscape = 0, halfSpecified = 0; +for (const m of Object.values(pack.motifs)) { + for (const dec of m.decisions ?? []) { + const r = dec.resolve; + if (!r) { noResolve++; continue; } + if (!r.orElse) noEscape++; + if (r.roll && (!r.success || !r.failure)) halfSpecified++; + } +} +t('every decision has a resolution', noResolve === 0, `${noResolve} missing`); +t('no decision gates progress without an alternative', noEscape === 0, `${noEscape} gated — playtest 1 died on one`); +t('every rolled decision states success AND failure', halfSpecified === 0, `${halfSpecified} half-specified`); + console.log(`\n${pass} passed, ${fail} failed`); process.exit(fail ? 1 : 0); diff --git a/samples/gilded-court-404.md b/samples/gilded-court-404.md index 5f1e0e4..88122cd 100644 --- a/samples/gilded-court-404.md +++ b/samples/gilded-court-404.md @@ -45,7 +45,7 @@ On success it goes first, and The Silent Host will not open hostilities first. **Cue** — *assemble aloud; these are fragments, not read-aloud text* - a stair too grand for the door it serves -- a floor mosaic worn only along one path +- the queue disturbed — three of the dead pushed aside **Truth.** this is how the place was ordered, and it still is. The Patient Lord bound a procession by oath they could not break, so that someone would always go behind them. @@ -68,7 +68,7 @@ On success it goes first, and The Silent Host will not open hostilities first. **Cue** — *assemble aloud; these are fragments, not read-aloud text* - banners in sequence, each house a place further back -- grave-goods stacked with obsessive neatness +- a seat at the head of the hall dragged back, as if to sit in **Truth.** the office is still being performed, for someone who is no longer served by it. The Patient Lord bound a procession by oath they could not break, so that someone would always go behind them. @@ -91,7 +91,7 @@ On success it goes first, and The Silent Host will not open hostilities first. **Cue** — *assemble aloud; these are fragments, not read-aloud text* - a herald's script with the order still marked -- an alcove emptied in a hurry +- someone has walked the corridor the wrong way, scuffing one side **Truth.** the office is still being performed, for someone who is no longer served by it. The Patient Lord bound a procession by oath they could not break, so that someone would always go behind them. @@ -114,7 +114,7 @@ On success it goes first, and The Silent Host will not open hostilities first. **Cue** — *assemble aloud; these are fragments, not read-aloud text* - a door only one person may pass at a time, and only first -- a collapse that has opened a way the builders never meant +- a numbered flagstone lifted and not replaced **Truth.** here the want is explicit — the place asks something of whoever enters. The Patient Lord bound a procession by oath they could not break, so that someone would always go behind them. @@ -152,7 +152,7 @@ On success it goes first, and The Silent Host will not open hostilities first. **Cue** — *assemble aloud; these are fragments, not read-aloud text* - a procession that doubled back on itself -- a lamp still burning on oil that should be long gone +- banners pulled down and stacked without regard for order **Truth.** this is the damage the want did to those who had to satisfy it. The Patient Lord bound a procession by oath they could not break, so that someone would always go behind them. @@ -180,7 +180,7 @@ On success it goes first, and The Silent Host will not open hostilities first. **Cue** — *assemble aloud; these are fragments, not read-aloud text* - a seat at the head of everything, occupied -- a door that has been wedged open from the inside +- a rank-plate prised off and dropped, still shiny where it sat **Truth.** the thing the whole barrow is arranged around is close. The Patient Lord bound a procession by oath they could not break, so that someone would always go behind them. diff --git a/samples/live-table-01.md b/samples/live-table-01.md new file mode 100644 index 0000000..df01e20 --- /dev/null +++ b/samples/live-table-01.md @@ -0,0 +1,243 @@ +# THE VAULT OF THE PATIENT LORD + +> *the dead here still take instruction, and give it.* + +**VANITY · Barrow · Depth 2 · 4 heroes · 5 areas + an authored ending** +**Seed `live-table-01` · generator 0.1.0 · catalog barrow@1** + +> **Skeleton seed, not a replay seed.** It reproduces the fiction, the area order, the +> heat and the hoard tiers. It does **not** reproduce encounter composition, mood or +> hoard contents — those come from the Forge, which is not seeded. + +--- + +## The truth (GM only) + +**The Vault of the Patient Lord.** The Patient Lord bought a household from those with nothing left, so that someone would always obey. The Patient Lord is disobeyed now, and cannot bear it. The prize is the signet that is still obeyed — the only thing the household answers to. The Silent Host are still performing the ritual they were buried for; they are handled by courtesy. The motif is **voices**, and the danger is obedience: the dead here still take instruction, and give it. + +**They will ask you:** "Do as you are told." + +## Pressure + +- **The clock.** Roll 1d6 on a trigger, or every 3 Turns. **1 or under — something comes.** Telegraph one Turn ahead. +- **Triggers this delve:** seenTwice · loud · disturbed +- **The tab.** Target **5 Banes** by the ending. Banes are *offered by named beats*, never hoped for. +- **The danger is obedience:** the dead here still take instruction, and give it. + +## The way through — the appeasement + +Anyone may **do one small thing it asks, without arguing**. `[VANITY: Poise — 2 successes]` +On success it was obeyed, and The Silent Host will not open hostilities first. +**Cost: +1 Vanity now, +1 Bane on the tab.** Shine now, bill later. +**Repeatable in every area.** Say the Bane aloud when it banks — the table must be able to see the route is open. + +## Factions + +- **The Silent Host** (undead) — still performing the ritual they were buried for. Handled by *courtesy*. +- **things that moved in** (beast) — neither know nor care whose tomb this is. Handled by *force or food*. + +**Planned fights:** 2 of 5 areas · base heat *fight* + +--- + +### AREA 1 — The Weeping Stair +*approach · facet: institution · no encounter* + +**Cue** — *assemble aloud; these are fragments, not read-aloud text* +- servants' bones arranged as though mid-errand +- someone has been talking here, and stopped when you arrived + +**Truth.** this is how the place was ordered, and it still is. The Patient Lord bought a household from those with nothing left, so that someone would always obey. + +**The clue is automatic:** servants' bones arranged as though mid-errand — and it was done deliberately. +[VANITY: Observation — 1 success] buys who did it, and roughly when + +**The decision.** an order carved into the floor, still legible — *obey it and the Host counts you as household; step over it and they do not* +- **Attempt it:** `[VANITY: Poise 2]` +- **Success:** you obey exactly enough to be counted household — Skeletons stand down for you +- **Failure:** you obey wrongly, which is worse than not obeying: +1 Bane +- **Or simply:** step over it: no cost now, and the Host does not count you as theirs + + +**Attention trigger:** seenTwice. +**Bane beat — announcing.** Who: *the whole party*. When: *once, on entering loudly*. once only. Say it aloud when it banks. +**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. + +*Failure case.* If they skip this, move its cue fragment into the next area so the motif still completes. + +--- + +### AREA 2 — The Lesser Vault +*complication · facet: ritual · encounter: fight · hoard: cache* + +**Cue** — *assemble aloud; these are fragments, not read-aloud text* +- orders scratched into the floor, the last one unfinished +- a door braced shut from within by furniture + +**Truth.** the office is still being performed, for someone who is no longer served by it. The Patient Lord bought a household from those with nothing left, so that someone would always obey. + +**The clue is automatic:** orders scratched into the floor, the last one unfinished — and it was done deliberately. +[VANITY: Observation — 1 success] buys who did it, and roughly when + +**The decision.** two doors, and behind one a voice giving instructions to nobody — *the quiet door is longer; the voice would tell you exactly where to go* +- **Or simply:** a pure choice: the voice names the route exactly, the quiet door takes one Turn + +**Encounter — fight.** 1 Ghoul and 2 Skeletons + +| Foe | atk | def | Grit | Nerve | | +|---|---|---|---|---|---| +| 1× Ghoul | 4 | 3 | 4 | 5 | on a hit, a free Called Shot to freeze for a round | +| 2× Skeleton | 3 | 2 | 1 | 5 | fearless | + +- **Harmed by:** anything +- **Avoidable:** the Ghoul goes for court dress first — send someone plain +- *Forge:* `forgeEncounter({heat:"fight", hoard:false, post:false, folderId})` +**Hoard.** Tier **cache**. +**Temptation — tube.** a short length of speaking-tube, cut and carried +- *Benefit:* ask one question and get one true answer +- *Accept:* free · *Use:* **+1 Bane** on the tab +- *Standing:* whatever answers can now hear you + +**Attention trigger:** loud. +**Bane beat — noticing.** Who: *whoever lingers on their own reflection*. When: *once per hero here*. repeatable across areas. Say it aloud when it banks. +**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. + +*Failure case.* If they skip this, move its cue fragment into the next area so the motif still completes. + +--- + +### AREA 3 — The Crossing +*turn · facet: demand · no encounter* + +**Cue** — *assemble aloud; these are fragments, not read-aloud text* +- a hall where your own voice arrives before you speak +- an order half-scratched out and rewritten by a different hand + +**Truth.** here the want is explicit — the place asks something of whoever enters. The Patient Lord bought a household from those with nothing left, so that someone would always obey. + +**The clue is automatic:** a hall where your own voice arrives before you speak — and it was done deliberately. +[VANITY: Observation — 1 success] buys who did it, and roughly when + +**The decision.** a bell-pull that would summon someone — *ring it and help comes, and it is not the kind you wanted* +- **Attempt it:** `[VANITY: Poise 2]` +- **Success:** what comes is answerable to you for one scene +- **Failure:** what comes is not the kind of help you wanted +- **Or simply:** do not ring: the way on is longer by one Turn + + +**Attention trigger:** loud. +**Bane beat — noticing.** Who: *whoever lingers on their own reflection*. When: *once per hero here*. repeatable across areas. Say it aloud when it banks. +**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. + +*Failure case.* If they skip this, move its cue fragment into the next area so the motif still completes. + +--- + +### AREA 4 — The Servants' Deep +*descent · facet: wound · no encounter · hoard: pocket* + +**Cue** — *assemble aloud; these are fragments, not read-aloud text* +- an instruction repeated until the stone gave out +- boot-prints that stop mid-corridor and do not resume + +**Truth.** this is the damage the want did to those who had to satisfy it. The Patient Lord bought a household from those with nothing left, so that someone would always obey. + +**The clue is automatic:** an instruction repeated until the stone gave out — and it was done deliberately. +[VANITY: Observation — 1 success] buys who did it, and roughly when + +**The decision.** a door that opens to a spoken password nobody living knows — *guessing costs a Bane per attempt; the long way costs two Turns* +- **Attempt it:** `[VANITY: Wits 2]` +- **Success:** the fiction gives you the word — the unfinished order, the wax, the name on the tube all point at it +- **Failure:** you have the shape of it but not the word: one more attempt, or take the long way +- **Or simply:** the long way: two Turns, no guessing, no Banes + +**Hoard.** Tier **pocket**. +**Temptation — bell.** a small bell from a servant's board +- *Benefit:* ring it and one order is obeyed, by anything +- *Accept:* free · *Use:* **+2 Banes** on the tab +- *Standing:* it rings faintly when someone gives you an order + +**Attention trigger:** disturbed. +**Bane beat — relicUse.** Who: *whoever spends the relic*. When: *each use*. repeatable. Say it aloud when it banks. +**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. + +*Failure case.* If they skip this, move its cue fragment into the next area so the motif still completes. + +--- + +### AREA 5 — The Last Door +*threshold · facet: anchor · encounter: battle · hoard: chest* + +**Cue** — *assemble aloud; these are fragments, not read-aloud text* +- a key that fits nothing here +- wax jammed into a speaking-tube, still soft + +**Truth.** the thing the whole barrow is arranged around is close. The Patient Lord bought a household from those with nothing left, so that someone would always obey. + +**The clue is automatic:** a key that fits nothing here — and it was done deliberately. +[VANITY: Observation — 1 success] buys who did it, and roughly when + +**The decision.** an instruction you can obey, ignore, or countermand — *countermanding it works once and marks you as someone who gives orders* +- **Attempt it:** `[VANITY: Poise 2]` +- **Success:** you countermand it and the dead obey you instead — this marks you as someone who gives orders: from now on the Host brings you their disputes, and once per delve you may issue one order they must follow +- **Failure:** the order stands and you have been seen to fail at giving one: +1 Bane, and the Host addresses someone else from now on +- **Or simply:** obey it, or ignore it and go round: ignoring costs one Turn + +**Encounter — battle.** 1 Wraith and 3 Skeletons + +| Foe | atk | def | Grit | Nerve | | +|---|---|---|---|---|---| +| 1× Wraith | 5 | 3 | 10 | 5 | INCORPOREAL — chill touch ignores armour and drains 1 max Grit | +| 3× Skeleton | 3 | 2 | 1 | 5 | fearless | + +- **Harmed by:** blessed, silvered or magical weapons ONLY — **say this before initiative** +- **Avoidable:** it will take an appeasement over a fight every time +- *Forge:* `forgeEncounter({heat:"battle", hoard:false, post:false, folderId})` +**Hoard.** Tier **chest**. +**Temptation — staff.** a staff of office, propped where it was set down +- *Benefit:* give one order the dead must follow +- *Accept:* take the Vice **Pride** · *Use:* **+2 Banes** on the tab +- *Standing:* you may not refuse an order given to you + +**Attention trigger:** disturbed. +**Bane beat — refusal.** Who: *whoever refuses the offer*. When: *once*. once only. Say it aloud when it banks. +**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. + +*Failure case.* If they skip this, the ending opens with them holding nothing the bottom problem wants. + +--- + +### ENDING — The Audience +### ⟨ AUTHORED SLOT — this is the seam ⟩ + +**Areas 1–5 are what DELVE generates. This is what it hands over.** + +**Cue** — *fragments* +- a seat that expects to be addressed + +**The Patient Lord** — is disobeyed now, and cannot bear it. Wants: *to be obeyed without asking*. +Handled by giving them what they want, at a price. + +**They open by asking:** "Do as you are told." + +| Party's route | The audience | +|---|---| +| Appeased it even once (**do one small thing it asks, without arguing**) | It listens. It will trade the signet that is still obeyed for the real thing, done to its face. `[VANITY: Poise — 2]` or take **Rattled**. | +| Refused throughout, tab under 4 | It offers a Vice — take the shine, bank the bill. Refusing starts the fight. | +| Carrying the signet that is still obeyed | It wants that more than it wants you. | +| Fighting | Winnable by two engaged heroes. **Name what harms it before initiative.** | + +> **Before initiative, always say what can hurt it.** Playtest 1 was unwinnable because +> the table discovered the immunity by failing. + +## Trigger glossary + +- **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 + +--- + +*Private VANITY development material — not for sale or distribution.* \ No newline at end of file diff --git a/samples/pale-tally-737.md b/samples/pale-tally-737.md index d42a0b7..3bc2ce7 100644 --- a/samples/pale-tally-737.md +++ b/samples/pale-tally-737.md @@ -45,7 +45,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos **Cue** — *assemble aloud; these are fragments, not read-aloud text* - lamps trimmed and filled, all of them -- water that has got in and taken three centuries to do it +- a seal broken and the contents already spoiled **Truth.** this is how the place was ordered, and it still is. The Silent Margrave bought the young from those with nothing left, so that nothing would ever age. @@ -68,7 +68,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos **Cue** — *assemble aloud; these are fragments, not read-aloud text* - a meal laid out, still warm, for people long past eating -- a collapse that has opened a way the builders never meant +- one preserved thing removed, leaving a clean shape in the dust **Truth.** the office is still being performed, for someone who is no longer served by it. The Silent Margrave bought the young from those with nothing left, so that nothing would ever age. @@ -106,7 +106,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos **Cue** — *assemble aloud; these are fragments, not read-aloud text* - a clock wound by somebody, recently -- grave-goods stacked with obsessive neatness +- a fire built recently, of furniture that was three centuries old **Truth.** the office is still being performed, for someone who is no longer served by it. The Silent Margrave bought the young from those with nothing left, so that nothing would ever age. @@ -144,7 +144,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos **Cue** — *assemble aloud; these are fragments, not read-aloud text* - a room that resets itself if you look away -- a floor mosaic worn only along one path +- a clock stopped by hand — the pendulum caught and tied **Truth.** here the want is explicit — the place asks something of whoever enters. The Silent Margrave bought the young from those with nothing left, so that nothing would ever age. @@ -172,7 +172,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos **Cue** — *assemble aloud; these are fragments, not read-aloud text* - something kept so well it has forgotten how to end -- a door that has been wedged open from the inside +- rot, in exactly one place, spreading **Truth.** this is the damage the want did to those who had to satisfy it. The Silent Margrave bought the young from those with nothing left, so that nothing would ever age. @@ -195,7 +195,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos **Cue** — *assemble aloud; these are fragments, not read-aloud text* - a casket sized for something smaller than a body -- a lamp still burning on oil that should be long gone +- something here has been eaten, which should not be possible **Truth.** the thing the whole barrow is arranged around is close. The Silent Margrave bought the young from those with nothing left, so that nothing would ever age. diff --git a/samples/salt-vigil-201.md b/samples/salt-vigil-201.md index 2c69573..5db222c 100644 --- a/samples/salt-vigil-201.md +++ b/samples/salt-vigil-201.md @@ -45,7 +45,7 @@ On success it is not alone, and The Silent Host will not open hostilities first. **Cue** — *assemble aloud; these are fragments, not read-aloud text* - a coat-rack, full -- a door that has been wedged open from the inside +- two cups set out and one of them recently drunk from **Truth.** this is how the place was ordered, and it still is. The Peacock Prince bound servants by oath they could not break, so that someone would always be there. @@ -68,7 +68,7 @@ On success it is not alone, and The Silent Host will not open hostilities first. **Cue** — *assemble aloud; these are fragments, not read-aloud text* - places set every evening for three hundred years -- a collapse that has opened a way the builders never meant +- someone has been counting the dead — tally marks by the entrance **Truth.** the office is still being performed, for someone who is no longer served by it. The Peacock Prince bound servants by oath they could not break, so that someone would always be there. @@ -96,7 +96,7 @@ On success it is not alone, and The Silent Host will not open hostilities first. **Cue** — *assemble aloud; these are fragments, not read-aloud text* - chairs drawn up in a circle, all facing one seat -- a lamp still burning on oil that should be long gone +- a bedroll, used, and not by anyone buried here **Truth.** the office is still being performed, for someone who is no longer served by it. The Peacock Prince bound servants by oath they could not break, so that someone would always be there. @@ -134,7 +134,7 @@ On success it is not alone, and The Silent Host will not open hostilities first. **Cue** — *assemble aloud; these are fragments, not read-aloud text* - a doorway with the hinges taken off -- a floor mosaic worn only along one path +- a name carved beside another, joining them, badly **Truth.** here the want is explicit — the place asks something of whoever enters. The Peacock Prince bound servants by oath they could not break, so that someone would always be there. @@ -172,7 +172,7 @@ On success it is not alone, and The Silent Host will not open hostilities first. **Cue** — *assemble aloud; these are fragments, not read-aloud text* - a name called so often it wore into the wall -- a hole broken through a wall, recently, and not by you +- a door tied open with a belt, so it could not close **Truth.** this is the damage the want did to those who had to satisfy it. The Peacock Prince bound servants by oath they could not break, so that someone would always be there. @@ -195,7 +195,7 @@ On success it is not alone, and The Silent Host will not open hostilities first. **Cue** — *assemble aloud; these are fragments, not read-aloud text* - a chair kept empty and dusted -- an alcove emptied in a hurry +- a chair dragged out of position and left where it was needed **Truth.** the thing the whole barrow is arranged around is close. The Peacock Prince bound servants by oath they could not break, so that someone would always be there.