Both settings now carry a charge levied by standing itself, which no purchase ends. Corporate Ladder's steps on money (1200/-60, 2400/-120, 3600/-240): a flat charge cannot flatten a slope, since late income scales with how well the player plays, and the flat charge needed to stop an optimiser accumulating put ordinary archetypes below zero for 44% of a run. Stepped, the balance settles around $4,250 and ordinary play comes out better than before it existed. The Frontier's is flat at -4 a run, because its late game never accumulated in the first place. Found in the first two human sessions of this work: - A career saved before a pack gained a stat had no path for it, and conditions compare numbers only, so every event, option and upkeep entry gated on a new stat silently did not exist for that run. Loading now fills those in. - 'Wrap up my career' sat immediately after the last option in tab order, so one Tab too many and Enter read as the game ending at day 31. It goes last, and the retrospective says plainly that it is a summary. - A 181-turn session ran against a stale bundle and the change under test never fired. Every logged turn now records app_version and build. - src/version.js had reported 0.3.0 since 0.3.0, while playtesters were told to check the status bar. A test now holds it to package.json. - 'Put money against the book' was shown locked to a player who owed nothing, six times. Options gated on a state the player cannot choose to enter are now hidden rather than greyed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxdJFbLq1rBKsUeticGV1g
429 lines
16 KiB
JavaScript
429 lines
16 KiB
JavaScript
// 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.',
|
||
// Hidden rather than greyed out when there is nothing owed. A locked
|
||
// door is worth showing when it is a door the player could open later
|
||
// by playing differently; "pay down what you owe" shown to a man who
|
||
// owes nothing is not that. It was the most-locked option in a real
|
||
// 181-turn session, six times, and told the player nothing each time.
|
||
whenLocked: 'hide',
|
||
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;
|