diff --git a/DESIGN.md b/DESIGN.md index 4122bd3..a380e6e 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -88,10 +88,22 @@ arrived at it by instinct. That convergence is the strongest evidence the model Fragments are dealt without replacement, borrowing from a neighbouring facet before repeating. -**Honest limit on "projected".** Only the motif cue fragment is projected from the appetite. The -second cue fragment, the decisions and the temptations still come from **global pools**, so the -current output is a projected wrapper around some generic room furniture. Making decisions and -temptations motif-scoped is the next content job. +**The furniture is motif-scoped too.** Codex's review found that only the motif cue fragment was +projected — decisions and temptations came from global pools, making the output "a consistent +wrapper around generic room furniture". Both now live under `motifs.`: **6 decisions and 5 +temptations per motif**, 88 authored entries across 8 motifs. A `keeping` delve offers a flower +that has not wilted, a lamp on three-century-old oil, and a room you may search or leave exactly +as you found it. A `precedence` delve offers a corridor that will not let two walk abreast. + +Two rules the tests enforce: +- **Nothing repeats inside one delve.** Decisions and temptations are dealt without replacement, + not picked per area — picking independently repeated a temptation in 75 of 80 test delves. +- **Motif purity beats variety for temptations.** Decisions may top up from the generic pool if a + long delve outruns its motif; temptations may not. A generic relic breaks the fiction, while a + repeated one only looks thin. + +**Remaining limit:** the second cue fragment still comes from a global `features` pool. That is +the last piece of generic furniture. ### The appeasement move diff --git a/core/beat.mjs b/core/beat.mjs index dff15d4..11713bf 100644 --- a/core/beat.mjs +++ b/core/beat.mjs @@ -20,17 +20,13 @@ const FACET_TRUTH = { demandEnd: 'the question itself, asked directly', }; -export function buildArea({ skeleton, planned, pack, pressure, rng, baneBeat = null, feature, decision }) { +export function buildArea({ skeleton, planned, pack, pressure, rng, baneBeat = null, feature, decision, temptation = null }) { const r = rng.derive('area', String(planned.index)); const fs = skeleton.foreshadow.find(f => f.index === planned.index) ?? {}; const names = pack.areaNames?.[planned.role] ?? pack.areaNames?.approach ?? ['Unnamed']; // feature/decision are dealt by the caller without replacement across the delve — drawing them // per-area from pools of 8 and 6 made repeats near-certain inside a single delve. - const temptation = planned.hoard - ? r.derive('temptation').pick(pack.temptations) - : null; - // Every area emits at least one attention trigger — draft 5 §9 weights triggers over the timer. const trigger = fs.facet === 'demand' ? skeleton.motif.trigger : r.derive('trigger').pick(['announced', 'loud', 'lingering', 'seenTwice', 'disturbed']); diff --git a/core/content/barrow.json b/core/content/barrow.json index 82850af..339d99f 100644 --- a/core/content/barrow.json +++ b/core/content/barrow.json @@ -285,7 +285,83 @@ "a wardrobe of three hundred dresses in a room with no dust in it", "one thing under cloth, and the cloth is clean" ] - } + }, + "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" + }, + { + "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" + }, + { + "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" + }, + { + "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" + }, + { + "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" + }, + { + "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" + } + ], + "temptations": [ + { + "id": "mask", + "cue": "a courtier's mask, gold leaf over lime-wood, the mouth fixed in a small smile", + "benefit": "the Host receives you as court, automatically", + "useCost": { + "bane": 1 + }, + "standingDrawback": "while worn you cannot be recognised by name — allies aiding you take −1 die" + }, + { + "id": "glass", + "cue": "a hand-mirror that shows the room a moment behind", + "benefit": "once per scene, see what was just here", + "useCost": { + "bane": 1 + }, + "standingDrawback": "your reflection lags, and other people notice" + }, + { + "id": "likeness", + "cue": "a small portrait of someone who is not you, painted beautifully", + "benefit": "show it and be taken for them, once", + "acceptanceCost": { + "vice": "Pride" + }, + "useCost": { + "bane": 2 + }, + "standingDrawback": "they will eventually want it back" + }, + { + "id": "veil", + "cue": "a mourning veil, fine enough to see through", + "benefit": "pass unremarked through the Host once", + "useCost": { + "bane": 1 + }, + "standingDrawback": "you see everyone as the barrow does — posed, waiting" + }, + { + "id": "eyes", + "cue": "a pair of painted eyes cut from a portrait", + "benefit": "once, know exactly who is watching", + "useCost": { + "bane": 1 + }, + "standingDrawback": "they are watching you back" + } + ] }, "naming": { "danger": "recognition", @@ -317,7 +393,83 @@ "a seal cut with a name worn smooth by rubbing", "a tally-stick longer than a person" ] - } + }, + "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" + }, + { + "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" + }, + { + "cue": "someone's name called softly from two directions at once", + "cost": "answer either and the other stops calling" + }, + { + "cue": "a lintel you must be announced under, or crawl beneath", + "cost": "announced costs a Bane; crawling costs your dignity and a Turn" + }, + { + "cue": "a list of the dead with one name you recognise", + "cost": "saying it aloud helps; it also tells the barrow you are connected" + }, + { + "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" + } + ], + "temptations": [ + { + "id": "ledger", + "cue": "a book of names, one line left blank", + "benefit": "write a name and the Host obeys it once", + "acceptanceCost": { + "vice": "Pride" + }, + "useCost": { + "bane": 2 + }, + "standingDrawback": "your own name is now in it" + }, + { + "id": "nameplate", + "cue": "a plate cut with a name worn smooth by rubbing", + "benefit": "doors that check a name open for you", + "useCost": { + "bane": 1 + }, + "standingDrawback": "you answer to that name whether you mean to or not" + }, + { + "id": "tally", + "cue": "a tally-stick longer than a person, one notch unfilled", + "benefit": "call in a debt the barrow owes — once", + "useCost": { + "bane": 1 + }, + "standingDrawback": "the stick keeps counting what you owe too" + }, + { + "id": "seal", + "cue": "a wax seal bearing a name struck through", + "benefit": "once, be forgotten by something hunting you", + "useCost": { + "bane": 1 + }, + "standingDrawback": "your allies find your name hard to recall" + }, + { + "id": "lintel", + "cue": "a chip of lintel-stone with three names on it", + "benefit": "once, summon one of the named dead to answer", + "useCost": { + "bane": 2 + }, + "standingDrawback": "they come whenever your name is said aloud" + } + ] }, "voices": { "danger": "obedience", @@ -349,7 +501,83 @@ "a staff of office propped where it was set down", "a key that fits nothing here" ] - } + }, + "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" + }, + { + "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" + }, + { + "cue": "a bell-pull that would summon someone", + "cost": "ring it and help comes, and it is not the kind you wanted" + }, + { + "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" + }, + { + "cue": "an instruction you can obey, ignore, or countermand", + "cost": "countermanding it works once and marks you as someone who gives orders" + }, + { + "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" + } + ], + "temptations": [ + { + "id": "signet", + "cue": "a signet, still warm, sized for a thumb", + "benefit": "doors that answer to rank open for you", + "useCost": { + "bane": 1 + }, + "standingDrawback": "the barrow's servants bring you their problems" + }, + { + "id": "tube", + "cue": "a short length of speaking-tube, cut and carried", + "benefit": "ask one question and get one true answer", + "useCost": { + "bane": 1 + }, + "standingDrawback": "whatever answers can now hear you" + }, + { + "id": "staff", + "cue": "a staff of office, propped where it was set down", + "benefit": "give one order the dead must follow", + "acceptanceCost": { + "vice": "Pride" + }, + "useCost": { + "bane": 2 + }, + "standingDrawback": "you may not refuse an order given to you" + }, + { + "id": "bell", + "cue": "a small bell from a servant's board", + "benefit": "ring it and one order is obeyed, by anything", + "useCost": { + "bane": 2 + }, + "standingDrawback": "it rings faintly when someone gives you an order" + }, + { + "id": "wax", + "cue": "a plug of wax, moulded to a mouth", + "benefit": "once, refuse to hear a compulsion", + "useCost": { + "bane": 1 + }, + "standingDrawback": "you cannot hear warnings either" + } + ] }, "keeping": { "danger": "preservation", @@ -381,7 +609,80 @@ "an hourglass that has never been turned", "a casket sized for something smaller than a body" ] - } + }, + "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" + }, + { + "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" + }, + { + "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" + }, + { + "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" + }, + { + "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" + }, + { + "cue": "food and water laid out, still good", + "cost": "eating restores you fully and the barrow adds you to what it keeps" + } + ], + "temptations": [ + { + "id": "jar", + "cue": "a sealed jar holding one good year", + "benefit": "open it to undo a wound entirely, once", + "useCost": { + "bane": 2 + }, + "standingDrawback": "the year is spent in front of everyone, visibly" + }, + { + "id": "stillglass", + "cue": "a mirror showing the room a little younger", + "benefit": "once, refuse a condition — the glass takes it", + "useCost": { + "bane": 1 + }, + "standingDrawback": "the glass cracks a little each time, and so do you" + }, + { + "id": "shoes", + "cue": "a child's shoes, unworn, in your size", + "benefit": "you do not tire; ignore fatigue for a scene", + "useCost": { + "bane": 1 + }, + "standingDrawback": "you have stopped ageing, and it shows in the wrong light" + }, + { + "id": "lamp", + "cue": "a lamp still burning on three-century-old oil", + "benefit": "light that never gutters", + "useCost": { + "bane": 1 + }, + "standingDrawback": "nothing near it changes, including wounds you want to heal" + }, + { + "id": "flower", + "cue": "a flower that has not wilted", + "benefit": "once, halt a condition where it stands", + "useCost": { + "bane": 1 + }, + "standingDrawback": "it also halts something you wanted to finish" + } + ] }, "display": { "danger": "comparison", @@ -413,7 +714,83 @@ "a case holding one item and a great deal of space", "a lock polished more often than the thing it guards" ] - } + }, + "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" + }, + { + "cue": "a case of trophies and one obviously missing", + "cost": "replacing it opens the next door; nothing else will" + }, + { + "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" + }, + { + "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" + }, + { + "cue": "a comparison invited — your gear against theirs", + "cost": "engage and gain their favour; decline and be marked as beneath notice" + }, + { + "cue": "a display you could improve, or rob", + "cost": "improving it opens the next door; robbing it opens all of them, badly" + } + ], + "temptations": [ + { + "id": "prize", + "cue": "the piece every rival was meant to want, still under glass", + "benefit": "+1 die whenever someone must be impressed", + "useCost": { + "bane": 1 + }, + "standingDrawback": "everyone who sees it wants it" + }, + { + "id": "ribbon", + "cue": "a ribbon awarded to whoever conceded the point", + "benefit": "end one argument in your favour, once", + "useCost": { + "bane": 1 + }, + "standingDrawback": "you cannot decline a challenge while wearing it" + }, + { + "id": "gift", + "cue": "a gift, unopened, addressed to no one in particular", + "benefit": "open it for exactly the thing you needed", + "acceptanceCost": { + "vice": "Greed" + }, + "useCost": { + "bane": 2 + }, + "standingDrawback": "it was for someone, and they know" + }, + { + "id": "case", + "cue": "a display case, small, with a good lock", + "benefit": "anything inside is beyond casual theft", + "useCost": { + "bane": 1 + }, + "standingDrawback": "whatever is in it is on show, always" + }, + { + "id": "plinth", + "cue": "a plinth-plate engraved FINEST OF ITS KIND", + "benefit": "once, make a thing you carry undeniably the best", + "useCost": { + "bane": 1 + }, + "standingDrawback": "someone will want to test that" + } + ] }, "company": { "danger": "attachment", @@ -445,7 +822,83 @@ "a chair kept empty and dusted", "a second cup, always out" ] - } + }, + "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" + }, + { + "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" + }, + { + "cue": "a door that will only admit one of you at a time", + "cost": "splitting the party is exactly what this place wants" + }, + { + "cue": "a hand, skeletal, held out to be taken", + "cost": "take it and you are not alone; you are also not alone later" + }, + { + "cue": "a way on that only works if someone stays behind", + "cost": "whoever stays is not alone, and that is the problem" + }, + { + "cue": "an invitation to stay the night, meant sincerely", + "cost": "accepting restores everything and costs a Turn and a Bane" + } + ], + "temptations": [ + { + "id": "keepsake", + "cue": "a keepsake still warm from being held", + "benefit": "once, someone comes when you call", + "useCost": { + "bane": 1 + }, + "standingDrawback": "something else comes too" + }, + { + "id": "cup", + "cue": "a second cup, always set out", + "benefit": "share it and gain an ally among the dead for a scene", + "useCost": { + "bane": 1 + }, + "standingDrawback": "they expect to be included from now on" + }, + { + "id": "hand", + "cue": "a skeletal hand that closes gently on yours", + "benefit": "you cannot be separated from the party by force", + "acceptanceCost": { + "vice": "Attachment" + }, + "useCost": { + "bane": 2 + }, + "standingDrawback": "nor can you leave one behind" + }, + { + "id": "chair", + "cue": "a folding chair, kept dusted", + "benefit": "set it down and something friendly sits", + "useCost": { + "bane": 1 + }, + "standingDrawback": "it follows you if you leave it" + }, + { + "id": "coat", + "cue": "a coat from a full rack, still shaped to someone", + "benefit": "once, be treated as expected and welcome", + "useCost": { + "bane": 1 + }, + "standingDrawback": "you are expected to come back" + } + ] }, "confession": { "danger": "judgement", @@ -477,7 +930,80 @@ "a ledger of sins with the last page blank", "a box that has only ever been opened once" ] - } + }, + "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" + }, + { + "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" + }, + { + "cue": "a book of absolutions with room for one more", + "cost": "signing it forgives someone; it does not say who" + }, + { + "cue": "a door that opens to whoever admits something first", + "cost": "whoever speaks pays; whoever stays silent owes" + }, + { + "cue": "a question asked directly of one hero, by name", + "cost": "answering costs privacy; refusing costs the way forward" + }, + { + "cue": "a penance offered instead of a fight", + "cost": "perform it and pass freely; it takes a Turn and it is humiliating" + } + ], + "temptations": [ + { + "id": "testament", + "cue": "a confession nobody ever heard, sealed", + "benefit": "read it aloud to unmake one accusation", + "useCost": { + "bane": 2 + }, + "standingDrawback": "the thing confessed to becomes yours to answer for" + }, + { + "id": "feather", + "cue": "the feather from the scale, weightless", + "benefit": "once, be believed absolutely", + "useCost": { + "bane": 1 + }, + "standingDrawback": "you cannot lie while carrying it, even usefully" + }, + { + "id": "kneeler", + "cue": "a fragment of stone worn through by knees", + "benefit": "once, take a condition from someone else", + "useCost": { + "bane": 1 + }, + "standingDrawback": "you keep every condition you take this way a little longer" + }, + { + "id": "screen", + "cue": "a splinter from the confessional screen", + "benefit": "once, hear whether someone is lying", + "useCost": { + "bane": 1 + }, + "standingDrawback": "they can tell you are listening for it" + }, + { + "id": "ash", + "cue": "a twist of ash from burned absolutions", + "benefit": "once, erase a wrong you did here", + "useCost": { + "bane": 2 + }, + "standingDrawback": "you cannot remember it either, and it mattered" + } + ] }, "precedence": { "danger": "procession", @@ -509,7 +1035,83 @@ "a staff of precedence, laid down", "a seat at the head of everything, occupied" ] - } + }, + "decisions": [ + { + "cue": "a corridor that will not let two walk abreast", + "cost": "whoever goes first meets whatever is there first" + }, + { + "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" + }, + { + "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" + }, + { + "cue": "banners in strict order, and one you could move", + "cost": "reordering them opens a way and insults everyone buried here" + }, + { + "cue": "a stair where the order of descent is visibly recorded", + "cost": "whoever goes last is remembered as having gone last" + }, + { + "cue": "a claim to settle: which of you the barrow should address", + "cost": "settling it opens the way; refusing to settle it does not" + } + ], + "temptations": [ + { + "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" + }, + { + "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" + }, + { + "id": "staffprec", + "cue": "a staff of precedence, laid down and not taken up", + "benefit": "once, decide the order of anything, and be obeyed", + "acceptanceCost": { + "vice": "Pride" + }, + "useCost": { + "bane": 2 + }, + "standingDrawback": "you may never be second while you hold it" + }, + { + "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" + }, + { + "id": "flagstone", + "cue": "a numbered flagstone, prised up, number one", + "benefit": "once, insist on going first and be obeyed", + "useCost": { + "bane": 1 + }, + "standingDrawback": "you go first into everything from now on" + } + ] } }, "placeNames": { @@ -839,5 +1441,6 @@ "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" - } + }, + "_globalPoolsNote": "decisions/temptations below are FALLBACKS ONLY. Real content is motif-scoped under motifs..decisions/.temptations, so the furniture matches the fiction." } \ No newline at end of file diff --git a/core/delve.mjs b/core/delve.mjs index f458c57..878c2e0 100644 --- a/core/delve.mjs +++ b/core/delve.mjs @@ -28,19 +28,34 @@ export function generateDelve(params = {}) { const pressure = new Pressure({ areas, clock }); // Deal features and decisions without replacement, cycling only if the delve outruns the pack. - const deal = (list, n, tag) => { + // Deal without replacement. If a delve outruns its motif pool, top up from the generic pool + // before ever repeating — a repeated decision reads as a bug, generic furniture only as thin. + const deal = (list, n, tag, overflow = []) => { const r = rng.derive(tag); - const out = []; + const out = [...r.shuffle(list)]; + if (out.length < n) out.push(...r.shuffle(overflow.filter(x => !out.includes(x)))); while (out.length < n) out.push(...r.shuffle(list)); return out.slice(0, n); }; + // Motif-scoped furniture. Global pools are a fallback only: drawing decisions and temptations + // globally made the output "a consistent wrapper around generic room furniture" — the fiction + // 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 decisions = deal(pack.decisions ?? [], plan.areas.length, 'decisions'); + 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: + // picking independently per area from a pool of three repeated in 75 of 80 test delves. + const temptPool = motifPack.temptations?.length ? motifPack.temptations : (pack.temptations ?? []); + const hoardCount = plan.areas.filter(a => a.hoard).length; + const temptations = deal(temptPool, hoardCount, 'temptations'); // no generic overflow — see note + let tIdx = 0; const built = plan.areas.map((planned, i) => { const beat = baneBeatFor(planned, pressure, rng.derive('banebeat', String(planned.index))); if (beat) pressure.bankBane('(offered)', beat, planned.index); - const area = buildArea({ skeleton, planned, pack, pressure, rng, baneBeat: beat, feature: features[i], decision: decisions[i] }); + const area = buildArea({ skeleton, planned, pack, pressure, rng, baneBeat: beat, feature: features[i], decision: decisions[i], temptation: planned.hoard ? temptations[tIdx++] : null }); area.fallback = fallbackRoute(area, skeleton); return area; }); diff --git a/core/test.mjs b/core/test.mjs index 5557703..54ed8c6 100644 --- a/core/test.mjs +++ b/core/test.mjs @@ -54,5 +54,35 @@ 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; +for (let i = 0; i < 40; i++) { + const d = generateDelve({ pack, seed: `scope-${i}`, areas: 6 }); + const m = pack.motifs[d.skeleton.motif.id]; + const okD = new Set((m.decisions ?? []).map(x => x.cue)); + const okT = new Set((m.temptations ?? []).map(x => x.id)); + for (const a of d.areas) { + checked++; + if (a.decision && !okD.has(a.decision.cue)) offMotifDecisions++; + if (a.temptation && !okT.has(a.temptation.id)) offMotifTemptations++; + } +} +t('decisions come from the delve\'s own motif', offMotifDecisions === 0, `${offMotifDecisions}/${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 +let dupD = 0, dupT = 0; +for (let i = 0; i < 40; i++) { + for (const areas of [6, 9]) { + const d = generateDelve({ pack, seed: `dup-${i}`, areas }); + const ds = d.areas.map(a => a.decision?.cue).filter(Boolean); + const ts = d.areas.map(a => a.temptation?.id).filter(Boolean); + if (new Set(ds).size !== ds.length) dupD++; + if (new Set(ts).size !== ts.length) dupT++; + } +} +t('no repeated decision inside one delve', dupD === 0, `${dupD}/80`); +t('no repeated temptation inside one delve', dupT === 0, `${dupT}/80`); + console.log(`\n${pass} passed, ${fail} failed`); process.exit(fail ? 1 : 0); diff --git a/samples/gilded-court-404.json b/samples/gilded-court-404.json index e89895c..6fc7b89 100644 --- a/samples/gilded-court-404.json +++ b/samples/gilded-court-404.json @@ -18,11 +18,11 @@ "placeName": "The Cairn of the Patient Lord", "knot": { "appetiteId": "first", - "accommodationId": "unmade", + "accommodationId": "bound", "claimant": "Patient Lord", "conscript": "a procession", - "transgression": "The Patient Lord had the faces struck from a procession, so that someone would always go behind them.", - "cruelty": 3 + "transgression": "The Patient Lord bound a procession by oath they could not break, so that someone would always go behind them.", + "cruelty": 2 }, "motif": { "id": "precedence", @@ -41,6 +41,20 @@ "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", @@ -113,10 +127,10 @@ "a stair too grand for the door it serves", "a floor mosaic worn only along one path" ], - "truth": "this is how the place was ordered, and it still is. The Patient Lord had the faces struck from a procession, so that someone would always go behind them.", + "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.", "decision": { - "cue": "a member of the faction, alone and not yet hostile", - "cost": "talking costs time; not talking costs later" + "cue": "banners in strict order, and one you could move", + "cost": "reordering them opens a way and insults everyone buried here" }, "encounter": null, "hoard": null, @@ -136,16 +150,16 @@ { "index": 2, "role": "complication", - "name": "The Hall of Bows", + "name": "The Lesser Vault", "facet": "ritual", "cueFragments": [ "banners in sequence, each house a place further back", "grave-goods stacked with obsessive neatness" ], - "truth": "the office is still being performed, for someone who is no longer served by it. The Patient Lord had the faces struck from a procession, so that someone would always go behind them.", + "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.", "decision": { - "cue": "two ways on: one narrow and dark, one wide and announced", - "cost": "the wide way is faster and the barrow hears it" + "cue": "a corridor that will not let two walk abreast", + "cost": "whoever goes first meets whatever is there first" }, "encounter": null, "hoard": null, @@ -165,16 +179,16 @@ { "index": 3, "role": "complication", - "name": "The Lesser Vault", + "name": "The Waiting Room", "facet": "ritual", "cueFragments": [ "a herald's script with the order still marked", "an alcove emptied in a hurry" ], - "truth": "the office is still being performed, for someone who is no longer served by it. The Patient Lord had the faces struck from a procession, so that someone would always go behind them.", + "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.", "decision": { - "cue": "something valuable, awkward to carry", - "cost": "carrying it slows you and it is not yours" + "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" }, "encounter": null, "hoard": null, @@ -200,24 +214,49 @@ "a door only one person may pass at a time, and only first", "a collapse that has opened a way the builders never meant" ], - "truth": "here the want is explicit — the place asks something of whoever enters. The Patient Lord had the faces struck from a procession, so that someone would always go behind them.", + "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.", "decision": { - "cue": "a sealed door, and a crack you could squeeze through", - "cost": "the crack costs skin and a Bane on a failure" + "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" }, "encounter": { "heat": "fight", - "kind": "undead" + "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": "coronet", - "cue": "a small crown, sized for someone who never grew", - "benefit": "+1 die when others must defer to you", + "id": "flagstone", + "cue": "a numbered flagstone, prised up, number one", + "benefit": "once, insist on going first and be obeyed", "useCost": { "bane": 1 }, - "standingDrawback": "you must be addressed correctly or lose the benefit" + "standingDrawback": "you go first into everything from now on" }, "trigger": "announced", "baneBeat": "relicUse", @@ -240,21 +279,24 @@ "a procession that doubled back on itself", "a lamp still burning on oil that should be long gone" ], - "truth": "this is the damage the want did to those who had to satisfy it. The Patient Lord had the faces struck from a procession, so that someone would always go behind them.", + "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.", "decision": { - "cue": "a shortcut down, through water", - "cost": "everything gets wet, including what burns" + "cue": "a stair where the order of descent is visibly recorded", + "cost": "whoever goes last is remembered as having gone last" }, "encounter": null, "hoard": "pocket", "temptation": { - "id": "glass", - "cue": "a hand-mirror that shows the room a moment behind", - "benefit": "once per scene, see what was just here", - "useCost": { - "bane": 1 + "id": "staffprec", + "cue": "a staff of precedence, laid down and not taken up", + "benefit": "once, decide the order of anything, and be obeyed", + "acceptanceCost": { + "vice": "Pride" }, - "standingDrawback": "your reflection lags, and others notice" + "useCost": { + "bane": 2 + }, + "standingDrawback": "you may never be second while you hold it" }, "trigger": "seenTwice", "baneBeat": "refusal", @@ -271,33 +313,55 @@ { "index": 6, "role": "threshold", - "name": "The Antechamber Royal", + "name": "The Last Door", "facet": "anchor", "cueFragments": [ "a seat at the head of everything, occupied", "a door that has been wedged open from the inside" ], - "truth": "the thing the whole barrow is arranged around is close. The Patient Lord had the faces struck from a procession, so that someone would always go behind them.", + "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.", "decision": { - "cue": "a way back, still open", - "cost": "leaving now means it will be worse when you return" + "cue": "a claim to settle: which of you the barrow should address", + "cost": "settling it opens the way; refusing to settle it does not" }, "encounter": { "heat": "battle", - "kind": "undead" + "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": "ledger", - "cue": "a book of names, one line left blank", - "benefit": "write a name and the Host obeys it once", - "acceptanceCost": { - "vice": "Pride" - }, + "id": "coronet", + "cue": "a small crown, sized for someone who never grew", + "benefit": "+1 die when others must defer to you", "useCost": { - "bane": 2 + "bane": 1 }, - "standingDrawback": "your own name is now in it" + "standingDrawback": "you must be addressed correctly or lose the benefit" }, "trigger": "disturbed", "baneBeat": "relicUse", @@ -318,13 +382,20 @@ "mode": "authored", "heat": null, "hoard": null, - "name": "The Gilded Audience", + "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", diff --git a/samples/gilded-court-404.md b/samples/gilded-court-404.md index e4bdbc0..5f1e0e4 100644 --- a/samples/gilded-court-404.md +++ b/samples/gilded-court-404.md @@ -52,7 +52,7 @@ On success it goes first, and The Silent Host will not open hostilities first. **The clue is automatic:** a stair too grand for the door it serves — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** a member of the faction, alone and not yet hostile — *talking costs time; not talking costs later* +**The decision.** banners in strict order, and one you could move — *reordering them opens a way and insults everyone buried here* **Attention trigger:** announced. @@ -75,7 +75,7 @@ On success it goes first, and The Silent Host will not open hostilities first. **The clue is automatic:** banners in sequence, each house a place further back — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** two ways on: one narrow and dark, one wide and announced — *the wide way is faster and the barrow hears it* +**The decision.** a corridor that will not let two walk abreast — *whoever goes first meets whatever is there first* **Attention trigger:** loud. @@ -98,7 +98,7 @@ On success it goes first, and The Silent Host will not open hostilities first. **The clue is automatic:** a herald's script with the order still marked — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** something valuable, awkward to carry — *carrying it slows you and it is not yours* +**The decision.** a door that opens only for the foremost of a party — *someone must be named first, aloud, and the others must accept it* **Attention trigger:** announced. @@ -121,7 +121,7 @@ On success it goes first, and The Silent Host will not open hostilities first. **The clue is automatic:** a door only one person may pass at a time, and only first — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** a sealed door, and a crack you could squeeze through — *the crack costs skin and a Bane on a failure* +**The decision.** a queue of the dead, and a way to step round it — *waiting costs two Turns; pushing in costs the Host's patience* **Encounter — fight.** 1 Ghoul and 2 Skeletons @@ -134,10 +134,10 @@ On success it goes first, and The Silent Host will not open hostilities first. - **Avoidable:** the Ghoul goes for court dress first — send someone plain - *Forge:* `forgeEncounter({heat:"fight", hoard:false, post:false, folderId})` **Hoard.** Tier **cache**. -**Temptation — coronet.** a small crown, sized for someone who never grew -- *Benefit:* +1 die when others must defer to you +**Temptation — flagstone.** a numbered flagstone, prised up, number one +- *Benefit:* once, insist on going first and be obeyed - *Accept:* free · *Use:* **+1 Bane** on the tab -- *Standing:* you must be addressed correctly or lose the benefit +- *Standing:* you go first into everything from now on **Attention trigger:** announced. **Bane beat — relicUse.** Who: *whoever spends the relic*. When: *each use*. repeatable. Say it aloud when it banks. @@ -159,13 +159,13 @@ On success it goes first, and The Silent Host will not open hostilities first. **The clue is automatic:** a procession that doubled back on itself — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** a shortcut down, through water — *everything gets wet, including what burns* +**The decision.** a stair where the order of descent is visibly recorded — *whoever goes last is remembered as having gone last* **Hoard.** Tier **pocket**. -**Temptation — glass.** a hand-mirror that shows the room a moment behind -- *Benefit:* once per scene, see what was just here -- *Accept:* free · *Use:* **+1 Bane** on the tab -- *Standing:* your reflection lags, and others notice +**Temptation — staffprec.** a staff of precedence, laid down and not taken up +- *Benefit:* once, decide the order of anything, and be obeyed +- *Accept:* take the Vice **Pride** · *Use:* **+2 Banes** on the tab +- *Standing:* you may never be second while you hold it **Attention trigger:** seenTwice. **Bane beat — refusal.** Who: *whoever refuses the offer*. When: *once*. once only. Say it aloud when it banks. @@ -187,7 +187,7 @@ On success it goes first, and The Silent Host will not open hostilities first. **The clue is automatic:** a seat at the head of everything, occupied — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** a way back, still open — *leaving now means it will be worse when you return* +**The decision.** a claim to settle: which of you the barrow should address — *settling it opens the way; refusing to settle it does not* **Encounter — battle.** 1 Wraith and 3 Skeletons @@ -200,10 +200,10 @@ On success it goes first, and The Silent Host will not open hostilities first. - **Avoidable:** it will take an appeasement over a fight every time - *Forge:* `forgeEncounter({heat:"battle", hoard:false, post:false, folderId})` **Hoard.** Tier **chest**. -**Temptation — ledger.** a book of names, one line left blank -- *Benefit:* write a name and the Host obeys it once -- *Accept:* take the Vice **Pride** · *Use:* **+2 Banes** on the tab -- *Standing:* your own name is now in it +**Temptation — coronet.** a small crown, sized for someone who never grew +- *Benefit:* +1 die when others must defer to you +- *Accept:* free · *Use:* **+1 Bane** on the tab +- *Standing:* you must be addressed correctly or lose the benefit **Attention trigger:** disturbed. **Bane beat — relicUse.** Who: *whoever spends the relic*. When: *each use*. repeatable. Say it aloud when it banks. diff --git a/samples/pale-tally-737.md b/samples/pale-tally-737.md index 1332272..d42a0b7 100644 --- a/samples/pale-tally-737.md +++ b/samples/pale-tally-737.md @@ -52,7 +52,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos **The clue is automatic:** lamps trimmed and filled, all of them — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** two ways on: one narrow and dark, one wide and announced — *the wide way is faster and the barrow hears it* +**The decision.** a room you can search, or leave exactly as you found it — *searching disturbs a preservation three centuries old — roll the clock* **Attention trigger:** disturbed. @@ -75,7 +75,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos **The clue is automatic:** a meal laid out, still warm, for people long past eating — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** something valuable, awkward to carry — *carrying it slows you and it is not yours* +**The decision.** a bed, made, and a body-shaped hollow that has not filled in — *lie in it and you rest fully; you also stop, and the barrow prefers that* **Encounter — fight.** 1 Ghoul and 2 Skeletons @@ -88,10 +88,10 @@ On success it hears that nothing has aged, and The Silent Host will not open hos - **Avoidable:** the Ghoul goes for court dress first — send someone plain - *Forge:* `forgeEncounter({heat:"fight", hoard:false, post:false, folderId})` **Hoard.** Tier **cache**. -**Temptation — ring.** a signet, still warm -- *Benefit:* doors that answer to rank open for you +**Temptation — flower.** a flower that has not wilted +- *Benefit:* once, halt a condition where it stands - *Accept:* free · *Use:* **+1 Bane** on the tab -- *Standing:* the barrow's servants bring you their problems +- *Standing:* it also halts something you wanted to finish **Attention trigger:** lingering. **Bane beat — relicUse.** Who: *whoever spends the relic*. When: *each use*. repeatable. Say it aloud when it banks. @@ -113,7 +113,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos **The clue is automatic:** a clock wound by somebody, recently — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** a member of the faction, alone and not yet hostile — *talking costs time; not talking costs later* +**The decision.** a door held shut by nothing but the fact it has never been opened — *open it and something that had not changed, changes* **Encounter — fight.** 1 Ghoul and 2 Skeletons @@ -126,10 +126,10 @@ On success it hears that nothing has aged, and The Silent Host will not open hos - **Avoidable:** the Ghoul goes for court dress first — send someone plain - *Forge:* `forgeEncounter({heat:"fight", hoard:false, post:false, folderId})` **Hoard.** Tier **cache**. -**Temptation — ledger.** a book of names, one line left blank -- *Benefit:* write a name and the Host obeys it once -- *Accept:* take the Vice **Pride** · *Use:* **+2 Banes** on the tab -- *Standing:* your own name is now in it +**Temptation — lamp.** a lamp still burning on three-century-old oil +- *Benefit:* light that never gutters +- *Accept:* free · *Use:* **+1 Bane** on the tab +- *Standing:* nothing near it changes, including wounds you want to heal **Attention trigger:** lingering. **Bane beat — relicUse.** Who: *whoever spends the relic*. When: *each use*. repeatable. Say it aloud when it banks. @@ -151,13 +151,13 @@ On success it hears that nothing has aged, and The Silent Host will not open hos **The clue is automatic:** a room that resets itself if you look away — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** a shortcut down, through water — *everything gets wet, including what burns* +**The decision.** a preserved thing blocking the way, which will not survive being moved — *move it and something here ends; leave it and lose a Turn* **Hoard.** Tier **pocket**. -**Temptation — glass.** a hand-mirror that shows the room a moment behind -- *Benefit:* once per scene, see what was just here +**Temptation — shoes.** a child's shoes, unworn, in your size +- *Benefit:* you do not tire; ignore fatigue for a scene - *Accept:* free · *Use:* **+1 Bane** on the tab -- *Standing:* your reflection lags, and others notice +- *Standing:* you have stopped ageing, and it shows in the wrong light **Attention trigger:** lingering. **Bane beat — flattery.** Who: *whoever performs the appeasement*. When: *each time it is used*. repeatable. Say it aloud when it banks. @@ -179,7 +179,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos **The clue is automatic:** something kept so well it has forgotten how to end — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** a sealed door, and a crack you could squeeze through — *the crack costs skin and a Bane on a failure* +**The decision.** a sealed jar, and a way on that needs what is inside — *breaking the seal spends the year it holds, in front of you* **Attention trigger:** seenTwice. @@ -202,7 +202,7 @@ On success it hears that nothing has aged, and The Silent Host will not open hos **The clue is automatic:** a casket sized for something smaller than a body — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** a way back, still open — *leaving now means it will be worse when you return* +**The decision.** food and water laid out, still good — *eating restores you fully and the barrow adds you to what it keeps* **Encounter — battle.** 1 Wraith and 3 Skeletons @@ -215,10 +215,10 @@ On success it hears that nothing has aged, and The Silent Host will not open hos - **Avoidable:** it will take an appeasement over a fight every time - *Forge:* `forgeEncounter({heat:"battle", hoard:false, post:false, folderId})` **Hoard.** Tier **chest**. -**Temptation — ledger.** a book of names, one line left blank -- *Benefit:* write a name and the Host obeys it once -- *Accept:* take the Vice **Pride** · *Use:* **+2 Banes** on the tab -- *Standing:* your own name is now in it +**Temptation — jar.** a sealed jar holding one good year +- *Benefit:* open it to undo a wound entirely, once +- *Accept:* free · *Use:* **+2 Banes** on the tab +- *Standing:* the year is spent in front of everyone, visibly **Attention trigger:** seenTwice. **Bane beat — refusal.** Who: *whoever refuses the offer*. When: *once*. once only. Say it aloud when it banks. diff --git a/samples/salt-vigil-201.md b/samples/salt-vigil-201.md index f5d1bcf..2c69573 100644 --- a/samples/salt-vigil-201.md +++ b/samples/salt-vigil-201.md @@ -52,7 +52,7 @@ On success it is not alone, and The Silent Host will not open hostilities first. **The clue is automatic:** a coat-rack, full — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** a way back, still open — *leaving now means it will be worse when you return* +**The decision.** an invitation to stay the night, meant sincerely — *accepting restores everything and costs a Turn and a Bane* **Attention trigger:** lingering. @@ -75,13 +75,13 @@ On success it is not alone, and The Silent Host will not open hostilities first. **The clue is automatic:** places set every evening for three hundred years — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** a shortcut down, through water — *everything gets wet, including what burns* +**The decision.** a way on that only works if someone stays behind — *whoever stays is not alone, and that is the problem* **Hoard.** Tier **pocket**. -**Temptation — coronet.** a small crown, sized for someone who never grew -- *Benefit:* +1 die when others must defer to you -- *Accept:* free · *Use:* **+1 Bane** on the tab -- *Standing:* you must be addressed correctly or lose the benefit +**Temptation — hand.** a skeletal hand that closes gently on yours +- *Benefit:* you cannot be separated from the party by force +- *Accept:* take the Vice **Attachment** · *Use:* **+2 Banes** on the tab +- *Standing:* nor can you leave one behind **Attention trigger:** lingering. **Bane beat — relicUse.** Who: *whoever spends the relic*. When: *each use*. repeatable. Say it aloud when it banks. @@ -103,7 +103,7 @@ On success it is not alone, and The Silent Host will not open hostilities first. **The clue is automatic:** chairs drawn up in a circle, all facing one seat — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** a member of the faction, alone and not yet hostile — *talking costs time; not talking costs later* +**The decision.** a hand, skeletal, held out to be taken — *take it and you are not alone; you are also not alone later* **Encounter — fight.** 1 Ghoul and 2 Skeletons @@ -116,10 +116,10 @@ On success it is not alone, and The Silent Host will not open hostilities first. - **Avoidable:** the Ghoul goes for court dress first — send someone plain - *Forge:* `forgeEncounter({heat:"fight", hoard:false, post:false, folderId})` **Hoard.** Tier **cache**. -**Temptation — mask.** a courtier's mask, gold leaf over lime-wood, the mouth fixed in a small smile -- *Benefit:* the Host receives you as court +**Temptation — chair.** a folding chair, kept dusted +- *Benefit:* set it down and something friendly sits - *Accept:* free · *Use:* **+1 Bane** on the tab -- *Standing:* while worn you cannot be recognised by name +- *Standing:* it follows you if you leave it **Attention trigger:** seenTwice. **Bane beat — relicUse.** Who: *whoever spends the relic*. When: *each use*. repeatable. Say it aloud when it banks. @@ -141,7 +141,7 @@ On success it is not alone, and The Silent Host will not open hostilities first. **The clue is automatic:** a doorway with the hinges taken off — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** something valuable, awkward to carry — *carrying it slows you and it is not yours* +**The decision.** a door that will only admit one of you at a time — *splitting the party is exactly what this place wants* **Encounter — fight.** 1 Ghoul and 2 Skeletons @@ -154,10 +154,10 @@ On success it is not alone, and The Silent Host will not open hostilities first. - **Avoidable:** the Ghoul goes for court dress first — send someone plain - *Forge:* `forgeEncounter({heat:"fight", hoard:false, post:false, folderId})` **Hoard.** Tier **cache**. -**Temptation — mask.** a courtier's mask, gold leaf over lime-wood, the mouth fixed in a small smile -- *Benefit:* the Host receives you as court +**Temptation — coat.** a coat from a full rack, still shaped to someone +- *Benefit:* once, be treated as expected and welcome - *Accept:* free · *Use:* **+1 Bane** on the tab -- *Standing:* while worn you cannot be recognised by name +- *Standing:* you are expected to come back **Attention trigger:** lingering. **Bane beat — relicUse.** Who: *whoever spends the relic*. When: *each use*. repeatable. Say it aloud when it banks. @@ -179,7 +179,7 @@ On success it is not alone, and The Silent Host will not open hostilities first. **The clue is automatic:** a name called so often it wore into the wall — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** a sealed door, and a crack you could squeeze through — *the crack costs skin and a Bane on a failure* +**The decision.** a chair drawn out, and a place laid, and time to sit — *sitting costs a Turn and buys the Host's goodwill entirely* **Attention trigger:** loud. @@ -202,7 +202,7 @@ On success it is not alone, and The Silent Host will not open hostilities first. **The clue is automatic:** a chair kept empty and dusted — and it was done deliberately. [VANITY: Observation — 1 success] buys who did it, and roughly when -**The decision.** two ways on: one narrow and dark, one wide and announced — *the wide way is faster and the barrow hears it* +**The decision.** one of the dead follows you and will not be told otherwise — *let it come and doors open; send it back and they close* **Encounter — battle.** 1 Wraith and 3 Skeletons @@ -215,10 +215,10 @@ On success it is not alone, and The Silent Host will not open hostilities first. - **Avoidable:** it will take an appeasement over a fight every time - *Forge:* `forgeEncounter({heat:"battle", hoard:false, post:false, folderId})` **Hoard.** Tier **chest**. -**Temptation — coronet.** a small crown, sized for someone who never grew -- *Benefit:* +1 die when others must defer to you +**Temptation — cup.** a second cup, always set out +- *Benefit:* share it and gain an ally among the dead for a scene - *Accept:* free · *Use:* **+1 Bane** on the tab -- *Standing:* you must be addressed correctly or lose the benefit +- *Standing:* they expect to be included from now on **Attention trigger:** disturbed. **Bane beat — flattery.** Who: *whoever performs the appeasement*. When: *each time it is used*. repeatable. Say it aloud when it banks.