Files
TheLadder/content/frontier/events/people.js
T
JesseMarkowitzandClaude Opus 5 7f20be83e8 Add The Frontier, a second setting, and a picker to choose between them
Cold Fork is a freight yard: 29 events across two stages, a four-day cycle, and
its own relationship and skill vocabulary. src/engine/ was not touched. Adding it
needed three changes outside the engine: one save slot per pack, app.js holding
the current pack, and turn.js no longer naming the mailroom (DECISIONS #34).
build.js now handles imports wrapped across lines. A conformance suite runs over
every registered pack. DECISIONS #35 records three calls on open questions.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RxdJFbLq1rBKsUeticGV1g
2026-09-12 21:03:50 -04:00

416 lines
16 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// The three people in Cold Fork who have an opinion about you.
//
// Relationship-gated content, and the counterweight to the yard: the runs pay
// the room, but Dutch's book, Vane's ledger and Ward's slow appraisal are what
// decide whether the star is ever offered.
export const people = [
{
id: 'dutch_book',
stage: 'hand',
weight: 70,
cooldown: 5,
description:
'Dutch has his tally book open on the tailgate and is working through ' +
'who took which run this month. He has arrived at a number he does not ' +
'like and is now looking for somewhere to put it.',
options: [
{
id: 'let_him_talk',
label: 'Let him get all the way to the end of it.',
result:
'It takes twenty minutes. By the end he has talked himself into ' +
'thinking it was about the weather, which suits both of you.',
effects: [
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 6 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: -4 },
],
},
{
id: 'check_the_book',
label: 'Ask to see the book.',
result:
'The tally is right and his arithmetic is wrong by two runs, in his ' +
'own favour. You say so quietly. He does not thank you and does not ' +
'forget it either.',
effects: [
{ path: 'skills.trade', op: 'add', value: 3 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: 7 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 3 },
],
},
{
id: 'trade_a_run',
label: 'Offer him the next Ridge run to square it.',
requires: [{ path: 'relationships.dutch.trusts_you', op: '>=', value: 45 }],
result:
'He takes it, and the book gets a line in it on your side for the ' +
'first time. Dutch settles his lines.',
effects: [
{ path: 'money', op: 'add', value: -6 },
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'relationships.dutch.owes_you', op: 'add', value: 18 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 5 },
],
},
],
},
{
id: 'dutch_drunk',
stage: 'hand',
weight: 40,
cooldown: 9,
requires: [{ path: 'turn', op: '>=', value: 12 }],
description:
'Dutch did not come in for the morning run and the morning run is ' +
'loaded. He is at the Cordwood, upright, and in no condition to be ' +
'within thirty feet of a horse.',
options: [
{
id: 'cover',
label: 'Take his run and say nothing about it.',
result:
'Vane never learns. Dutch learns, in the afternoon, from the state ' +
'of the harness, and comes and stands near you for a while without ' +
'saying anything.',
effects: [
{ path: 'money', op: 'add', value: 7 },
{ path: 'skills.nerve', op: 'add', value: 2 },
{ path: 'flags.covered_for_dutch', op: 'set', value: true },
{ path: 'relationships.dutch.owes_you', op: 'add', value: 25 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 8 },
{ path: 'notable', op: 'push', value: 'Covered Dutch’s run and never mentioned it.' },
],
},
{
id: 'tell_vane',
label: 'Tell Vane the run needs a driver.',
result:
'Vane takes it out himself at fifty-one years of age and says one ' +
'sentence to Dutch on his return. Dutch works the rest of the month ' +
'like a man being watched, because he is.',
effects: [
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 7 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: -15 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: 12 },
{ path: 'standing', op: 'add', value: -2 },
],
},
{
id: 'sober_him',
label: 'Walk him round the yard until he can stand up to it.',
requires: [{ path: 'skills.nerve', op: '>=', value: 12 }],
result:
'Four circuits and a bucket. He drives it badly but he drives it, ' +
'and that distinction is the entire point.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 2 },
{ path: 'relationships.dutch.owes_you', op: 'add', value: 14 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 10 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: -6 },
],
},
],
},
{
id: 'vane_ledger',
stage: 'hand',
weight: 50,
cooldown: 7,
description:
'The office door is open for once. Vane has the ledger out and the look ' +
'of a man who has added a column twice and got two answers.',
options: [
{
id: 'offer_help',
label: 'Offer to run the column.',
result:
'You find it in ten minutes: a freight bill entered twice in March. ' +
'He does not say thank you. He leaves the door open after that.',
effects: [
{ path: 'skills.trade', op: 'add', value: 4 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 9 },
],
},
{
id: 'ask_for_more',
label: 'Ask him what the good runs pay.',
requires: [{ path: 'skills.trade', op: '>=', value: 22 }],
result:
'Twenty-two, and he has been giving them to Dutch for two years ' +
'because Dutch asked in his first month. Nobody had told you that ' +
'asking was the mechanism.',
effects: [
{ path: 'money', op: 'add', value: 22 },
{ path: 'skills.trade', op: 'add', value: 3 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 3 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: 6 },
{ path: 'notable', op: 'push', value: 'Asked Vane for the good runs.' },
],
},
{
id: 'call_in_the_debt',
label: 'Mention the smith’s bill you stood for.',
requires: [{ path: 'relationships.hollis.owes_you', op: '>=', value: 20 }],
result:
'He pays it back to the cent, in front of Dutch, and is short with ' +
'you for two days afterwards for having had to.',
effects: [
{ path: 'money', op: 'add', value: 24 },
{ path: 'relationships.hollis.owes_you', op: 'add', value: -20 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: -4 },
],
},
{
id: 'leave_him_to_it',
label: 'Leave him to it.',
result: 'The door is shut again within the hour.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 1 },
],
},
],
},
{
id: 'ward_asks',
stage: 'hand',
weight: 45,
cooldown: 6,
requires: [{ path: 'turn', op: '>=', value: 6 }],
description:
'Marshal Ward is leaning on the yard gate with no particular business ' +
'there. He asks, eventually and as though it has just occurred to him, ' +
'what came in on the stage.',
options: [
{
id: 'tell_him',
label: 'Tell him what came in on the stage.',
result:
'Hinges, nails, and a crate consigned to a name nobody in Cold Fork ' +
'has heard of. He writes none of it down and remembers all of it.',
effects: [
{ path: 'relationships.ward.trusts_you', op: 'add', value: 8 },
{ path: 'relationships.ward.wary_of_you', op: 'add', value: -4 },
{ path: 'standing', op: 'add', value: -1 },
],
},
{
id: 'say_nothing',
label: 'Say that is Vane’s business and not yours.',
result:
'He agrees that it is, pleasantly, and stays leaning on the gate for ' +
'another twenty minutes.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 2 },
{ path: 'relationships.ward.wary_of_you', op: 'add', value: 6 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 5 },
{ path: 'standing', op: 'add', value: 2 },
],
},
{
id: 'ask_him_back',
label: 'Ask him what he is actually looking for.',
requires: [{ path: 'skills.trade', op: '>=', value: 12 }],
result:
'He tells you, which surprises both of you. A crate a month, six ' +
'months running, and no consignee that exists.',
effects: [
{ path: 'skills.trade', op: 'add', value: 3 },
{ path: 'skills.nerve', op: 'add', value: 2 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 10 },
],
},
],
},
{
id: 'ward_deputizes',
stage: 'hand',
weight: 35,
cooldown: 10,
requires: [
{ path: 'turn', op: '>=', value: 18 },
{ path: 'relationships.ward.trusts_you', op: '>=', value: 45 },
],
description:
'There is a man in the one cell who needs moving to the county seat and ' +
'Ward cannot leave the town without somebody in it. He is not offering ' +
'you a job. He is offering you two days.',
options: [
{
id: 'ride_along',
label: 'Ride along.',
result:
'Two days out and two back, and the prisoner talks for all four. ' +
'Ward does not, which turns out to be the instruction.',
effects: [
{ path: 'money', op: 'add', value: 12 },
{ path: 'skills.nerve', op: 'add', value: 4 },
{ path: 'standing', op: 'add', value: 5 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 12 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: -4 },
{ path: 'notable', op: 'push', value: 'Rode to the county seat with Ward and a prisoner.' },
],
},
{
id: 'mind_the_town',
label: 'Offer to mind the town instead.',
requires: [{ path: 'skills.nerve', op: '>=', value: 22 }],
result:
'Two days with the keys and nothing whatever happens, which you ' +
'later understand was the test.',
effects: [
{ path: 'money', op: 'add', value: 12 },
{ path: 'skills.nerve', op: 'add', value: 3 },
{ path: 'standing', op: 'add', value: 8 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 15 },
{ path: 'notable', op: 'push', value: 'Held the town for two days while Ward was gone.' },
],
},
{
id: 'decline_ward',
label: 'Say the yard cannot spare you.',
result:
'It can. Both of you know it can. He takes the storekeeper instead ' +
'and the storekeeper tells the story for a year.',
effects: [
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: -8 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 6 },
],
},
],
},
{
id: 'saturday_night',
stage: 'hand',
weight: 55,
cooldown: 5,
description:
'The Cordwood on a Rest night: Dutch at the long table, half the yard ' +
'with him, and a game of cards that everybody present knows the ' +
'storekeeper’s nephew cannot afford to be in.',
options: [
{
id: 'sit_in',
label: 'Sit in.',
result:
'You come out four dollars ahead and the nephew comes out eleven ' +
'behind. Nobody says anything about it, then or afterwards.',
effects: [
{ path: 'money', op: 'add', value: 4 },
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 5 },
{ path: 'standing', op: 'add', value: -2 },
],
},
{
id: 'buy_the_table',
label: 'Buy the table a round and stay out of the game.',
result:
'Six dollars, and for the rest of the month you are a man who bought ' +
'the table a round, which in Cold Fork is a kind of address.',
effects: [
{ path: 'money', op: 'add', value: -6 },
{ path: 'standing', op: 'add', value: 5 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 4 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: -3 },
],
},
{
id: 'walk_the_nephew_out',
label: 'Get the nephew out of the game.',
requires: [{ path: 'skills.nerve', op: '>=', value: 12 }],
result:
'You do it badly and in front of everyone, and it works. The ' +
'storekeeper hears about it before you are back at the yard.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 3 },
{ path: 'standing', op: 'add', value: 7 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: 5 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 5 },
{ path: 'notable', op: 'push', value: 'Pulled the storekeeper’s nephew out of a card game.' },
],
},
{
id: 'early_night',
label: 'Go up early.',
result: 'The ceiling of a room at the Cordwood, at nine at night.',
effects: [
{ path: 'skills.trade', op: 'add', value: 1 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: -2 },
],
},
],
},
{
id: 'the_consignee',
stage: 'hand',
weight: 25,
cooldown: 12,
requires: [
{ path: 'turn', op: '>=', value: 24 },
{ path: 'relationships.ward.trusts_you', op: '>=', value: 50 },
],
description:
'The crate with no consignee is on the platform again, and this month ' +
'the manifest has Vane’s own hand on it. Ward is not at the gate today, ' +
'which is itself a decision somebody made.',
options: [
{
id: 'load_it',
label: 'Load it and drive it out to the Ridge like any other crate.',
result:
'It is heavier than hinges. Vane pays you eighteen dollars for a ' +
'nine dollar run and neither of you mentions the difference.',
effects: [
{ path: 'money', op: 'add', value: 18 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 10 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: -12 },
{ path: 'standing', op: 'add', value: -3 },
{ path: 'notable', op: 'push', value: 'Ran the unmarked crate out to the Ridge for Vane.' },
],
},
{
id: 'tell_ward',
label: 'Go and find Ward.',
result:
'He looks at the manifest for a long time and then puts it back on ' +
'the platform exactly as he found it. Nothing happens for eleven ' +
'days, and then a great deal happens at once.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 4 },
{ path: 'standing', op: 'add', value: 6 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 20 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: -14 },
{ path: 'notable', op: 'push', value: 'Took Vane’s manifest to Marshal Ward.' },
],
},
{
id: 'ask_vane_direct',
label: 'Ask Vane what is in it.',
requires: [{ path: 'skills.trade', op: '>=', value: 22 }],
result:
'He tells you, standing in the doorway of the office as always, and ' +
'then asks what you intend to do about it. It is the first real ' +
'question anybody in Cold Fork has asked you.',
effects: [
{ path: 'skills.trade', op: 'add', value: 4 },
{ path: 'skills.nerve', op: 'add', value: 3 },
{ path: 'standing', op: 'add', value: 2 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 6 },
{ path: 'notable', op: 'push', value: 'Asked Vane what was in the crate, and got an answer.' },
],
},
],
},
];
export default people;