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
This commit is contained in:
JesseMarkowitz
2026-09-12 21:03:50 -04:00
co-authored by Claude Opus 5
parent 4957c24e31
commit 7f20be83e8
25 changed files with 3015 additions and 300 deletions
+584
View File
@@ -0,0 +1,584 @@
// The second rung: the marshal's office.
//
// `rounds`, `office_day` and `the_cells` are the floor here — no conditions,
// no cooldown, no `once` — so this stage can never run dry. The pay is real
// and the days are worse, which is the trade the offer did not mention.
export const deputy = [
{
id: 'rounds',
stage: 'deputy',
weight: 100,
description:
'The evening round: the length of the street, the back of the store, ' +
'the yard gate, and the Cordwood twice. Mostly it is a walk. The ' +
'difference between the nights it is a walk and the nights it is not ' +
'announces itself late.',
options: [
{
id: 'walk_it',
label: 'Walk it properly, both ends.',
result:
'Two doors unlocked that should not have been, and the storekeeper ' +
'hears about both from you rather than from a stranger.',
effects: [
{ path: 'standing', op: 'add', value: 2 },
{ path: 'skills.nerve', op: 'add', value: 1 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 2 },
],
},
{
id: 'sit_the_cordwood',
label: 'Do it from a chair at the Cordwood.',
result:
'You hear more in two hours than the street gives up in a week, and ' +
'everybody in the room adjusts what they say in front of you.',
effects: [
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'standing', op: 'add', value: -2 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 2 },
],
},
{
id: 'walk_the_yard',
label: 'Take the long way past Vane’s yard.',
result:
'The office light is on at eleven and Vane does not come to the ' +
'window. He knows the sound of the round by now.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 2 },
{ path: 'relationships.hollis.wary_of_you', op: 'add', value: 4 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 3 },
],
},
],
},
{
id: 'office_day',
stage: 'deputy',
weight: 100,
description:
'Paper. The county wants its returns, Ward has not filed since March, ' +
'and the stove is the only warm thing in the building.',
options: [
{
id: 'do_the_returns',
label: 'Do the returns.',
result:
'Four hours and a hand that will not straighten. The county sends a ' +
'letter of acknowledgement, which Ward pins up, which is the most ' +
'sentimental act you have seen from him.',
effects: [
{ path: 'skills.trade', op: 'add', value: 3 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 5 },
],
},
{
id: 'read_the_paper',
label: 'Read six months of the county paper instead.',
result:
'Three names in it you have loaded freight for, and one of them ' +
'twice. You start a list of your own.',
effects: [
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'skills.nerve', op: 'add', value: 1 },
{ path: 'standing', op: 'add', value: 1 },
],
},
{
id: 'ride_out',
label: 'Leave the paper and ride out to the Ridge camp.',
result:
'Nothing is wrong at the Ridge camp. Being seen there when nothing ' +
'is wrong turns out to be most of the job.',
effects: [
{ path: 'money', op: 'add', value: -2 },
{ path: 'standing', op: 'add', value: 4 },
{ path: 'skills.nerve', op: 'add', value: 2 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: -2 },
],
},
],
},
{
id: 'the_cells',
stage: 'deputy',
weight: 100,
description:
'One cell, one occupant, and eleven hours until the county wagon. He ' +
'has been talking since six and has not yet said anything about why he ' +
'is in there.',
options: [
{
id: 'let_him_talk',
label: 'Let him talk.',
result:
'By the ninth hour he has told you about a horse sold twice in ' +
'Bitter Wells, and does not appear to notice that he has.',
effects: [
{ path: 'skills.trade', op: 'add', value: 3 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 4 },
],
},
{
id: 'feed_him_proper',
label: 'Buy him a proper dinner out of your own pocket.',
result:
'Two dollars forty. He is quiet afterwards, and the county wagon ' +
'takes a man who is not angry, which the driver notices.',
effects: [
{ path: 'money', op: 'add', value: -3 },
{ path: 'standing', op: 'add', value: 3 },
{ path: 'skills.nerve', op: 'add', value: 1 },
],
},
{
id: 'shut_him_up',
label: 'Tell him to be quiet.',
result:
'He is quiet. Eleven hours is a long time in a building with two ' +
'rooms in it and one of you able to leave.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 2 },
{ path: 'standing', op: 'add', value: -2 },
],
},
],
},
{
id: 'saloon_trouble',
stage: 'deputy',
weight: 70,
cooldown: 4,
description:
'Something has gone wrong at the Cordwood and the noise of it reaches ' +
'the office before anybody does. Ward is at the county seat until ' +
'Thursday.',
options: [
{
id: 'wade_in',
label: 'Go in and take hold of the nearest one.',
result:
'It stops. Your sleeve does not survive it and neither does a ' +
'table, and the whole street knows by morning which it was.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 4 },
{ path: 'standing', op: 'add', value: 4 },
{ path: 'money', op: 'add', value: -4 },
],
},
{
id: 'wait_outside',
label: 'Stand in the doorway and wait for it to come to you.',
result:
'It comes to you, in ones, which is the entire trick and takes a ' +
'nerve you did not have a year ago.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 2 },
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'standing', op: 'add', value: 6 },
],
},
{
id: 'send_for_dutch',
label: 'Send for Dutch.',
requires: [{ path: 'relationships.dutch.owes_you', op: '>=', value: 25 }],
result:
'He arrives inside four minutes, takes one man out by the collar, ' +
'and says afterwards that the book is square now. It is not, and ' +
'both of you let that stand.',
effects: [
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'standing', op: 'add', value: 3 },
{ path: 'relationships.dutch.owes_you', op: 'add', value: -20 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 5 },
],
},
],
},
{
id: 'vane_across_the_street',
stage: 'deputy',
weight: 55,
cooldown: 6,
description:
'Vane has a load going out that the manifest describes as agricultural ' +
'implements, and it is going out at four in the morning, which no ' +
'agricultural implement in the county has ever needed to do.',
options: [
{
id: 'stop_it',
label: 'Be at the yard gate at four.',
result:
'He does not argue and he does not open the crate. He turns the ' +
'wagon round in front of you and takes it back inside, and that is ' +
'the last civil word between you.',
effects: [
{ path: 'standing', op: 'add', value: 7 },
{ path: 'skills.nerve', op: 'add', value: 3 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 8 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: -18 },
{ path: 'relationships.hollis.wary_of_you', op: 'add', value: 15 },
{ path: 'notable', op: 'push', value: 'Stood at Vane’s gate at four in the morning.' },
],
},
{
id: 'let_it_go',
label: 'Be somewhere else at four.',
result:
'The wagon goes. Nothing comes of it, which is the part that stays ' +
'with you, because nothing coming of it means nothing was ever ' +
'going to.',
effects: [
{ path: 'standing', op: 'add', value: -5 },
{ path: 'skills.trade', op: 'add', value: 1 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 10 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: -8 },
],
},
{
id: 'go_and_ask',
label: 'Go to the office at nine and ask him straight out.',
requires: [{ path: 'skills.trade', op: '>=', value: 32 }],
result:
'He tells you, in the doorway, the same as he told you about the ' +
'crate. Then he asks whether the star has changed what you intend ' +
'to do about it. It has, and you say so.',
effects: [
{ path: 'skills.trade', op: 'add', value: 4 },
{ path: 'skills.nerve', op: 'add', value: 3 },
{ path: 'standing', op: 'add', value: 5 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: -4 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 6 },
{ path: 'notable', op: 'push', value: 'Asked Vane straight out, wearing the star.' },
],
},
],
},
{
id: 'ward_tired',
stage: 'deputy',
weight: 45,
cooldown: 8,
requires: [{ path: 'flags.sworn_in', op: '==', value: true }],
description:
'Ward has been six years retiring and today he says the word out loud ' +
'for the first time, sitting on the office step with his boots off.',
options: [
{
id: 'talk_him_round',
label: 'Tell him the town is not ready.',
result:
'He says the town is never ready and that is not a reason. He stays ' +
'anyway, for now, which both of you understand is a favour to you ' +
'and not to the town.',
effects: [
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 6 },
{ path: 'relationships.ward.owes_you', op: 'add', value: 5 },
],
},
{
id: 'tell_him_go',
label: 'Tell him to go.',
result:
'He looks at you for a while. Then he laughs, once, and puts his ' +
'boots back on, and does not mention it again for a month.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 4 },
{ path: 'standing', op: 'add', value: 3 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 10 },
{ path: 'notable', op: 'push', value: 'Told Ward to go and retire.' },
],
},
{
id: 'say_nothing_ward',
label: 'Let him sit.',
result: 'You sit on the step with him until it gets dark.',
effects: [
{ path: 'relationships.ward.trusts_you', op: 'add', value: 4 },
{ path: 'relationships.ward.wary_of_you', op: 'add', value: -5 },
{ path: 'skills.nerve', op: 'add', value: 1 },
],
},
],
},
{
id: 'county_wagon',
stage: 'deputy',
weight: 50,
cooldown: 5,
description:
'The county wagon is a day late, there are two men in one cell who ' +
'should not be in one cell, and the second cell has never had a lock ' +
'that works.',
options: [
{
id: 'sit_up_with_them',
label: 'Sit up all night in the office.',
result:
'Nothing happens, twice, at two and at four. In the morning the ' +
'wagon comes and you have been awake for thirty hours.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 3 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 5 },
{ path: 'standing', op: 'add', value: 2 },
],
},
{
id: 'fix_the_lock',
label: 'Spend the afternoon making the second lock work.',
result:
'It works. It has not worked since before Ward came, and he stands ' +
'in the doorway turning the key for longer than the job took.',
effects: [
{ path: 'money', op: 'add', value: -5 },
{ path: 'skills.trade', op: 'add', value: 3 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 7 },
],
},
{
id: 'release_one',
label: 'Turn the quieter one loose on his word.',
requires: [{ path: 'skills.nerve', op: '>=', value: 32 }],
result:
'He comes back at eight in the morning, as he said he would, and ' +
'the county never knows there was a decision in it.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 3 },
{ path: 'standing', op: 'add', value: 6 },
{ path: 'relationships.ward.wary_of_you', op: 'add', value: 8 },
{ path: 'notable', op: 'push', value: 'Turned a man loose on his word, and was right.' },
],
},
],
},
{
id: 'dutch_in_the_cells',
stage: 'deputy',
weight: 40,
cooldown: 10,
requires: [{ path: 'turn', op: '>=', value: 12 }],
description:
'Dutch is in the cell. It is the Cordwood and a table and nobody hurt, ' +
'and it is also the third time this season, and the storekeeper has ' +
'started using the word "again."',
options: [
{
id: 'let_him_out',
label: 'Let him out in the morning and say nothing to the county.',
result:
'He goes to work. Neither of you refers to it, then or later, and ' +
'the storekeeper notices that neither of you did.',
effects: [
{ path: 'standing', op: 'add', value: -4 },
{ path: 'relationships.dutch.owes_you', op: 'add', value: 20 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 8 },
{ path: 'relationships.ward.wary_of_you', op: 'add', value: 6 },
],
},
{
id: 'book_him',
label: 'Book him properly.',
result:
'Eight dollars and a night, and his name on a county return with ' +
'your hand on it. He pays the eight dollars. He reads the return ' +
'twice.',
effects: [
{ path: 'standing', op: 'add', value: 5 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 6 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: -18 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: 14 },
{ path: 'notable', op: 'push', value: 'Booked Dutch on a county return.' },
],
},
{
id: 'talk_to_him',
label: 'Sit outside the cell until he says what it is about.',
requires: [{ path: 'relationships.dutch.trusts_you', op: '>=', value: 50 }],
result:
'It is about two years on the Ridge road and a book with nobody ' +
'else’s name in it. He gets most of the way to saying so.',
effects: [
{ path: 'skills.trade', op: 'add', value: 3 },
{ path: 'skills.nerve', op: 'add', value: 2 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 12 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: -10 },
{ path: 'notable', op: 'push', value: 'Sat outside the cell with Dutch until he talked.' },
],
},
],
},
{
id: 'the_ridge_camp_dispute',
stage: 'deputy',
weight: 45,
cooldown: 7,
description:
'Two men at the Ridge camp both hold paper on the same claim and one of ' +
'them has a brother in Bitter Wells. The camp has asked for the marshal ' +
'and the marshal has sent you.',
options: [
{
id: 'read_the_paper_claim',
label: 'Read both papers all the way through.',
result:
'Both are good. Both were issued by the same clerk eleven days ' +
'apart. The problem is in Bitter Wells and not on the Ridge, and ' +
'saying so ends it.',
effects: [
{ path: 'skills.trade', op: 'add', value: 4 },
{ path: 'standing', op: 'add', value: 5 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 5 },
],
},
{
id: 'stand_between',
label: 'Stand between them until the county can rule.',
result:
'Six weeks of standing between them, in instalments. Nobody is shot ' +
'and nobody is satisfied, which Ward says is the job described.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 4 },
{ path: 'standing', op: 'add', value: 2 },
{ path: 'money', op: 'add', value: 4 },
],
},
{
id: 'take_a_side',
label: 'Decide it yourself, on the spot.',
result:
'You are probably right. The brother from Bitter Wells arrives on ' +
'Thursday to find out how right, and stays four days.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 3 },
{ path: 'standing', op: 'add', value: -3 },
{ path: 'relationships.ward.wary_of_you', op: 'add', value: 10 },
{ path: 'money', op: 'add', value: 8 },
],
},
],
},
{
id: 'the_star_and_the_yard',
stage: 'deputy',
weight: 30,
cooldown: 14,
requires: [
{ path: 'turn', op: '>=', value: 20 },
{ path: 'relationships.hollis.trusts_you', op: '<=', value: 30 },
],
description:
'Vane & Co. has a note falling due and the bank in Bitter Wells has ' +
'declined it. Vane is fifty-one and has not asked anybody in Cold Fork ' +
'for anything in nineteen years, and is standing in the office doorway ' +
'across the street looking at your building.',
options: [
{
id: 'go_over',
label: 'Cross the street.',
result:
'He does not ask. You do not offer. The two of you stand in the ' +
'doorway of the office for a while, which is where every ' +
'conversation you have ever had with him has happened.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 3 },
{ path: 'standing', op: 'add', value: 3 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 12 },
{ path: 'notable', op: 'push', value: 'Crossed the street to Vane when the note fell due.' },
],
},
{
id: 'lend_him',
label: 'Put your own money into the note.',
requires: [{ path: 'money', op: '>=', value: 60 }],
result:
'Sixty dollars, and the outfit keeps its animals. He pays it back ' +
'over a year, in the doorway, in instalments, never once in front ' +
'of Dutch.',
effects: [
{ path: 'money', op: 'add', value: -60 },
{ path: 'relationships.hollis.owes_you', op: 'add', value: 40 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 25 },
{ path: 'standing', op: 'add', value: 4 },
{ path: 'notable', op: 'push', value: 'Put sixty dollars of your own into Vane’s note.' },
],
},
{
id: 'stay_put',
label: 'Stay on your own side of the street.',
result:
'The note goes. The yard is sold in the spring and the new outfit ' +
'brings its own men, and the Ridge road is driven by somebody you ' +
'do not know.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 1 },
{ path: 'standing', op: 'add', value: -2 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: -10 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: -8 },
{ path: 'notable', op: 'push', value: 'Stayed on your own side of the street.' },
],
},
],
},
{
id: 'quiet_week',
stage: 'deputy',
weight: 60,
cooldown: 4,
description:
'Nothing. Four days of nothing. The stove, the returns, the length of ' +
'the street twice a night, and a town that does not need you at all ' +
'this week and might not next week either.',
options: [
{
id: 'learn_the_law',
label: 'Read the county statutes properly.',
result:
'Most of it is fees. Some of it is not, and the part that is not is ' +
'the part nobody in Cold Fork has ever read.',
effects: [
{ path: 'skills.trade', op: 'add', value: 3 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 3 },
],
},
{
id: 'work_the_yard_again',
label: 'Go and load freight for a day, for the money.',
result:
'Vane pays you the hand’s rate without comment. Dutch says one ' +
'thing about the star and then works alongside you all afternoon.',
effects: [
{ path: 'money', op: 'add', value: 9 },
{ path: 'standing', op: 'add', value: -3 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 5 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 5 },
],
},
{
id: 'ride_the_county',
label: 'Ride the county line and look at it.',
result:
'Two days out. Nobody sends for you and nothing needs you, and you ' +
'come back having decided something you do not tell anybody.',
effects: [
{ path: 'money', op: 'add', value: -3 },
{ path: 'skills.nerve', op: 'add', value: 3 },
{ path: 'standing', op: 'add', value: 1 },
],
},
],
},
];
export default deputy;
+139
View File
@@ -0,0 +1,139 @@
// Running out of money.
//
// No game over and no failure mode in the engine — these are ordinary events
// whose conditions happen to be about money, weighted heavily enough to crowd
// out an ordinary day. Neither declares a stage: being broke follows you up
// the ladder rather than vanishing when you take the star.
//
// The arithmetic that matters, and the one Corporate Ladder got wrong once:
// `every_run` pays 30 against a room-and-board cycle of 20 and a fully-loaded
// store charge of 10, so there is always a way out that is worth more than the
// hole is deep. Change either number and re-derive the other.
export const hardTimes = [
{
id: 'store_cut_off',
// Heavy, but on a cooldown: being broke should colour a run, not become
// the run. Corporate Ladder learned this the expensive way at weight 5000
// with no cooldown.
weight: 900,
cooldown: 3,
requires: [{ path: 'money', op: '<', value: 0 }],
description:
'The storekeeper turns the book round on the counter so you can see ' +
'your own line in it, and does not say anything at all, which is worse ' +
'than the several things he could have said.',
options: [
{
id: 'on_the_book',
label: 'Ask him to carry you a while longer.',
// He stops eventually. Past that, the ways out cost standing and
// favours rather than interest, which is where the spiral gets real.
requires: [{ path: 'owed', op: '<', value: 120 }],
result:
'He turns the book back round and writes it. The figure at the ' +
'bottom of your line is now larger than a month of runs.',
effects: [
{ path: 'money', op: 'add', value: 30 },
{ path: 'owed', op: 'add', value: 32 },
{ path: 'flags.owes_the_store', op: 'set', value: true },
{ path: 'standing', op: 'add', value: -2 },
{ path: 'notable', op: 'push', value: 'Went further into the book at the store.' },
],
},
{
id: 'ask_dutch',
label: 'Ask Dutch to settle a line of his own.',
requires: [{ path: 'relationships.dutch.owes_you', op: '>=', value: 20 }],
result:
'He pays it without a word and crosses it out of the book in front ' +
'of you, and afterwards you are a man he has settled with rather ' +
'than a man he owes.',
effects: [
{ path: 'money', op: 'add', value: 18 },
{ path: 'relationships.dutch.owes_you', op: 'add', value: -20 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: -3 },
{ path: 'notable', op: 'push', value: 'Called in what Dutch owed.' },
],
},
{
id: 'ask_hollis',
label: 'Ask Vane for the smith’s money back.',
requires: [{ path: 'relationships.hollis.owes_you', op: '>=', value: 20 }],
result:
'He pays in the doorway, in full, and finds a reason not to look at ' +
'you for the rest of the week.',
effects: [
{ path: 'money', op: 'add', value: 22 },
{ path: 'relationships.hollis.owes_you', op: 'add', value: -20 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: -4 },
],
},
{
id: 'every_run',
label: 'Take every run going.',
// Has to be worth more than a cycle of room and board plus the fully
// stepped-up store charge, or it is not a way out — it is the hole
// with extra hours in it.
result:
'Eleven days without one off. The Ridge road stops being a road ' +
'after a while and becomes a sequence of turns you take.',
effects: [
{ path: 'money', op: 'add', value: 30 },
{ path: 'skills.nerve', op: 'add', value: 2 },
{ path: 'standing', op: 'add', value: -1 },
],
},
],
},
{
id: 'the_book_called',
// Often enough to matter. At weight 25 Corporate Ladder's equivalent
// appeared six times in 262 turns and debt became a one-way ratchet.
weight: 45,
cooldown: 4,
requires: [{ path: 'owed', op: '>', value: 0 }],
description:
'The storekeeper has written to the county about three lines in his ' +
'book and yours is one of them. He mentions this to you in the street, ' +
'in daylight, in front of two other people.',
options: [
{
id: 'pay_chunk',
label: 'Pay a real piece of it down.',
requires: [{ path: 'money', op: '>=', value: 45 }],
result: 'He rules a line through most of it and is disappointed about it.',
effects: [
{ path: 'money', op: 'add', value: -45 },
{ path: 'owed', op: 'add', value: -45 },
{ path: 'standing', op: 'add', value: 2 },
],
},
{
id: 'pay_minimum',
label: 'Pay what you have on you.',
requires: [{ path: 'money', op: '>=', value: 12 }],
result: 'Twelve dollars, ten of which is the line and two of which is coffee.',
effects: [
{ path: 'money', op: 'add', value: -12 },
{ path: 'owed', op: 'add', value: -10 },
],
},
{
id: 'stall',
label: 'Tell him after the next stage.',
result:
'He says after the next stage. The two other people in the street ' +
'say nothing, and repeat all of it by evening.',
effects: [
{ path: 'owed', op: 'add', value: 4 },
{ path: 'standing', op: 'add', value: -3 },
{ path: 'relationships.ward.wary_of_you', op: 'add', value: 4 },
],
},
],
},
];
export default hardTimes;
+8
View File
@@ -0,0 +1,8 @@
import { routine } from './routine.js';
import { people } from './people.js';
import { promotion } from './promotion.js';
import { deputy } from './deputy.js';
import { hardTimes } from './hard-times.js';
export const events = [...routine, ...people, ...promotion, ...deputy, ...hardTimes];
export default events;
+415
View File
@@ -0,0 +1,415 @@
// 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;
+93
View File
@@ -0,0 +1,93 @@
// Taking the star.
//
// The same shape as Corporate Ladder's Dispatch offer, and for the same
// reason: the engine has no notion of a promotion, only of a stage that
// determines which events are in the pool. The offer is an ordinary event
// whose effects happen to include { path: 'stage', op: 'set', value: 'deputy' }.
//
// Declining is a real option. It comes back after a cooldown, and staying in
// the yard to build trade and a book full of favours is a way to play rather
// than a mistake.
export const promotion = [
{
id: 'deputy_offer',
stage: 'hand',
weight: 800,
cooldown: 12,
// A long way in, deliberately. The yard is where most of this pack lives,
// and the star at turn twenty would skip it.
requires: [
{ path: 'standing', op: '>=', value: 70 },
{ path: 'turn', op: '>=', value: 40 },
// Two ways to be offered it: the marshal has decided about you, or the
// town has, on the evidence of what you have walked into.
{
any: [
{ path: 'relationships.ward.trusts_you', op: '>=', value: 68 },
{ path: 'skills.nerve', op: '>=', value: 40 },
],
},
],
description:
'Ward has the county paper that makes a deputy and has already written a ' +
'name on it. He says the pay is thirty-eight a run and the work is mostly ' +
'walking about, and that the second half of that is a lie he tells ' +
'everybody once.',
options: [
{
id: 'accept',
label: 'Take the star.',
result:
'Vane says nothing at all, which is worse than anything he could ' +
'have said. Dutch carries your kit up the street and talks the ' +
'entire way about the Ridge road.',
effects: [
{ path: 'stage', op: 'set', value: 'deputy' },
{ path: 'flags.sworn_in', op: 'set', value: true },
{ path: 'standing', op: 'add', value: 6 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 5 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: -14 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: 10 },
{ path: 'notable', op: 'push', value: 'Took the star.' },
],
},
{
id: 'accept_and_speak',
label: 'Take it, and put Dutch up for the good runs.',
requires: [{ path: 'relationships.dutch.trusts_you', op: '>=', value: 55 }],
result:
'Vane writes the name down in front of you, which is as close as he ' +
'comes to a farewell. Dutch is insufferable about it for a month and ' +
'then, quietly, is not.',
effects: [
{ path: 'stage', op: 'set', value: 'deputy' },
{ path: 'flags.sworn_in', op: 'set', value: true },
{ path: 'flags.spoke_for_dutch', op: 'set', value: true },
{ path: 'standing', op: 'add', value: 4 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 5 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: -8 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 15 },
{ path: 'relationships.dutch.owes_you', op: 'add', value: 20 },
{ path: 'notable', op: 'push', value: 'Took the star, and put Dutch up for the good runs.' },
],
},
{
id: 'decline',
label: 'Not yet.',
result:
'He folds the paper back into his coat. He has carried it around ' +
'unsigned for six years and is in no hurry now.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 3 },
{ path: 'standing', op: 'add', value: -3 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: -6 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 8 },
{ path: 'notable', op: 'push', value: 'Turned down the star.' },
],
},
],
},
];
export default promotion;
+422
View File
@@ -0,0 +1,422 @@
// Ordinary days in the yard.
//
// `stage_day`, `ridge_road` and `yard_work` carry no conditions, no cooldown
// and no `once`, which makes them this stage's floor: whatever else is
// excluded, there is always a turn to play.
//
// Note what the ungated options give. Corporate Ladder put four of its best
// negotiation gains behind a negotiation gate, and its logs show players
// bouncing off that wall for thirty turns. Every gate in this pack has ungated
// repeatable growth underneath it — see DECISIONS.md #32.
export const routine = [
{
id: 'first_morning',
stage: 'hand',
weight: 99999,
once: true,
description:
'Hollis Vane looks at your hands rather than your face, says the pay is ' +
'twenty-four dollars a run, the room at the Cordwood is eight and the ' +
'feed is what it is, and lets you do that arithmetic yourself. Dutch ' +
'Rennels is already harnessing.',
options: [
{
id: 'ask_the_rate',
label: 'Ask what a man makes on top of the twenty-four.',
result:
'He says that depends entirely on you, and goes inside. It is the ' +
'most useful thing anybody tells you all week.',
effects: [
{ path: 'skills.trade', op: 'add', value: 3 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 2 },
{ path: 'notable', op: 'push', value: 'Asked Vane what the work was really worth.' },
],
},
{
id: 'get_to_work',
label: 'Say nothing and pick up a harness.',
result:
'Dutch watches you do it wrong, then watches you do it right, and ' +
'does not offer a word either time.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 2 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 4 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: 3 },
],
},
{
id: 'ask_dutch',
label: 'Ask Dutch which of these animals bites.',
result:
'He tells you. He also tells you he has driven the Ridge road two ' +
'years, which is not an answer to the question you asked.',
effects: [
{ path: 'skills.trade', op: 'add', value: 1 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 5 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: -5 },
],
},
],
},
{
id: 'stage_day',
stage: 'hand',
weight: 100,
description:
'The stage is in and there are nine crates on the platform for a wagon ' +
'that holds seven. The driver wants to be gone inside the hour and is ' +
'saying so at length.',
options: [
{
id: 'two_trips',
label: 'Run it twice. Nobody has to know it took all day.',
result: 'It takes all day. Everybody knows.',
effects: [
{ path: 'money', op: 'add', value: 4 },
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 2 },
],
},
{
id: 'load_high',
label: 'Stack it high and rope it down.',
result:
'Seven crates and two more where a man would sit. It holds as far as ' +
'the creek crossing, which is farther than you expected.',
effects: [
{ path: 'money', op: 'add', value: 8 },
{ path: 'skills.nerve', op: 'add', value: 2 },
{ path: 'standing', op: 'add', value: -2 },
],
},
{
id: 'talk_the_driver',
label: 'Talk the driver into leaving two for the next stage.',
requires: [{ path: 'skills.trade', op: '>=', value: 12 }],
result:
'He leaves two. He also mentions your name at the far end of the ' +
'line, favourably, which you will not hear about for a month.',
effects: [
{ path: 'money', op: 'add', value: 6 },
{ path: 'skills.trade', op: 'add', value: 3 },
{ path: 'standing', op: 'add', value: 3 },
],
},
],
},
{
id: 'ridge_road',
stage: 'hand',
weight: 100,
description:
'A load for the Ridge camp, out and back in a day if the weather holds. ' +
'The last mile is the one with the bad turn on it, and everybody knows ' +
'which mile that is.',
options: [
{
id: 'drive_it',
label: 'Take it out yourself.',
result:
'The bad turn is exactly as advertised. You come back with the wagon ' +
'and the animals and most of your composure.',
effects: [
{ path: 'money', op: 'add', value: 9 },
{ path: 'skills.nerve', op: 'add', value: 3 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 2 },
],
},
{
id: 'go_with_dutch',
label: 'Ask Dutch to take the reins and ride along.',
result:
'He drives it in silence and points at the bad turn without slowing. ' +
'You learn the road. You do not learn much else.',
effects: [
{ path: 'money', op: 'add', value: 4 },
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 4 },
{ path: 'relationships.dutch.owes_you', op: 'add', value: -2 },
],
},
{
id: 'take_the_gun',
label: 'Ask Hollis for the scattergun and go alone.',
requires: [{ path: 'skills.nerve', op: '>=', value: 12 }],
result:
'He hands it over without a word, which is the first time he has ' +
'agreed to anything you asked for.',
effects: [
{ path: 'money', op: 'add', value: 14 },
{ path: 'skills.nerve', op: 'add', value: 3 },
{ path: 'flags.carries_iron', op: 'set', value: true },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 5 },
{ path: 'standing', op: 'add', value: 2 },
],
},
],
},
{
id: 'yard_work',
stage: 'hand',
weight: 100,
description:
'No stage, no run, and a yard full of things that are nearly broken. ' +
'Hollis is in the office with the ledger and the door shut.',
options: [
{
id: 'mend_harness',
label: 'Mend the harness that keeps parting.',
result:
'You find where it parts. It is not where anybody has been mending ' +
'it, which explains the last two years.',
effects: [
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 3 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: 2 },
],
},
{
id: 'shoe_the_team',
label: 'Walk the team down to the smith and stand for the bill.',
result:
'Eleven dollars of your own money on Vane’s animals. The smith ' +
'writes your name in his book, and so, eventually, does Vane.',
effects: [
{ path: 'money', op: 'add', value: -11 },
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'relationships.hollis.owes_you', op: 'add', value: 12 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 4 },
],
},
{
id: 'idle',
label: 'Sit in the shade until something needs doing.',
result:
'Nothing needs doing. It is the first hour of the week that has been ' +
'yours, and you notice it going.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 1 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: -3 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 2 },
],
},
],
},
{
id: 'broken_axle',
stage: 'hand',
weight: 55,
cooldown: 5,
description:
'The near wagon comes back with a cracked axle and a driver who says it ' +
'was cracked when he took it. Dutch says it was not.',
options: [
{
id: 'fix_it',
label: 'Get under it and put a splint on.',
result:
'It will hold for a season, which is longer than the last three ' +
'repairs on the same wagon.',
effects: [
{ path: 'money', op: 'add', value: 3 },
{ path: 'skills.trade', op: 'add', value: 3 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 3 },
],
},
{
id: 'back_dutch',
label: 'Say Dutch is right, because Dutch is right.',
result:
'The driver takes it badly and the yard takes note. Dutch says ' +
'nothing, and writes something in his book.',
effects: [
{ path: 'standing', op: 'add', value: -3 },
{ path: 'skills.nerve', op: 'add', value: 2 },
{ path: 'relationships.dutch.trusts_you', op: 'add', value: 8 },
{ path: 'relationships.dutch.owes_you', op: 'add', value: 6 },
],
},
{
id: 'stay_out',
label: 'Have no view on the axle.',
result: 'Both of them decide, separately, that you are no use to them.',
effects: [
{ path: 'relationships.dutch.trusts_you', op: 'add', value: -4 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: -2 },
{ path: 'skills.trade', op: 'add', value: 1 },
],
},
],
},
{
id: 'the_store',
stage: 'hand',
weight: 60,
cooldown: 4,
description:
'Everything in Cold Fork that is not freight is in this one building, ' +
'and the book on the counter is where the town keeps its real accounts.',
options: [
{
id: 'buy_plain',
label: 'Buy what you need and pay for it.',
result: 'Coffee, a shirt, and a second blanket. The nights are turning.',
effects: [
{ path: 'money', op: 'add', value: -6 },
{ path: 'standing', op: 'add', value: 2 },
],
},
{
id: 'on_credit',
label: 'Put it on the book.',
result:
'He writes it without looking up. Being in the book is not a ' +
'disgrace here; being in it a long time is.',
effects: [
{ path: 'owed', op: 'add', value: 14 },
{ path: 'flags.owes_the_store', op: 'set', value: true },
{ path: 'standing', op: 'add', value: -1 },
],
},
{
id: 'haggle',
label: 'Argue the price of the coffee on principle.',
result:
'You win eleven cents and an hour of your life goes into it. He ' +
'enjoys it more than you do, and remembers you afterwards.',
effects: [
{ path: 'money', op: 'add', value: -4 },
{ path: 'skills.trade', op: 'add', value: 3 },
{ path: 'standing', op: 'add', value: 1 },
],
},
{
id: 'pay_down',
label: 'Put money against the book.',
requires: [
{ path: 'owed', op: '>', value: 0 },
{ path: 'money', op: '>=', value: 20 },
],
result: 'He crosses a line through it and turns the page back over.',
effects: [
{ path: 'money', op: 'add', value: -20 },
{ path: 'owed', op: 'add', value: -20 },
{ path: 'standing', op: 'add', value: 2 },
],
},
],
},
{
id: 'weather',
stage: 'hand',
weight: 45,
cooldown: 6,
description:
'It has been raining since the small hours and the creek crossing is ' +
'four feet up. There is a load for the camp that was wanted yesterday.',
options: [
{
id: 'wait_it_out',
label: 'Nothing moves today.',
result:
'The creek is down by evening and the camp waits a day. It is the ' +
'right call, which is not the same as a popular one.',
effects: [
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: -2 },
{ path: 'standing', op: 'add', value: 1 },
],
},
{
id: 'ford_it',
label: 'Ford it.',
result:
'The wagon floats for about six feet, which is six feet more than a ' +
'wagon should. The load gets there wet and on time.',
effects: [
{ path: 'money', op: 'add', value: 16 },
{ path: 'skills.nerve', op: 'add', value: 4 },
{ path: 'standing', op: 'add', value: 3 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: 6 },
],
},
{
id: 'long_way',
label: 'Take the long road round the head of the creek.',
requires: [{ path: 'skills.trade', op: '>=', value: 12 }],
result:
'Eleven extra miles and a dry load. Dutch did not know that road was ' +
'passable, and now has to know that you did.',
effects: [
{ path: 'money', op: 'add', value: 11 },
{ path: 'skills.trade', op: 'add', value: 2 },
{ path: 'relationships.hollis.trusts_you', op: 'add', value: 4 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: 4 },
],
},
],
},
{
id: 'road_agents',
stage: 'hand',
weight: 30,
cooldown: 8,
requires: [{ path: 'turn', op: '>=', value: 8 }],
description:
'Two riders come out of the rocks a mile short of the camp and sit their ' +
'horses across the road. Neither of them looks like he has done this ' +
'often enough to be calm about it.',
options: [
{
id: 'hand_it_over',
label: 'Give them the box and remember the horses.',
result:
'They take it and go. You give Marshal Ward a description of two ' +
'horses that is better than anything he has had in a year.',
effects: [
{ path: 'money', op: 'add', value: -8 },
{ path: 'skills.nerve', op: 'add', value: 2 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 8 },
{ path: 'notable', op: 'push', value: 'Was stopped on the Ridge road, and gave Ward the horses.' },
],
},
{
id: 'talk_them_down',
label: 'Tell them what is actually in the box.',
result:
'It is a crate of hinges and forty pounds of nails. The older one ' +
'laughs. They let you by, which is worse for them than it is for you.',
effects: [
{ path: 'skills.trade', op: 'add', value: 4 },
{ path: 'standing', op: 'add', value: 4 },
{ path: 'notable', op: 'push', value: 'Talked two road agents out of a crate of hinges.' },
],
},
{
id: 'bring_it_up',
label: 'Bring the scattergun up off the floorboards.',
requires: [{ path: 'flags.carries_iron', op: '==', value: true }],
result:
'Nobody fires. They go back into the rocks and the story is around ' +
'Cold Fork before the wagon is.',
effects: [
{ path: 'skills.nerve', op: 'add', value: 5 },
{ path: 'standing', op: 'add', value: 8 },
{ path: 'relationships.ward.trusts_you', op: 'add', value: 6 },
{ path: 'relationships.dutch.wary_of_you', op: 'add', value: 8 },
{ path: 'notable', op: 'push', value: 'Brought the scattergun up on the Ridge road.' },
],
},
],
},
];
export default routine;