Each pack declares a lifestyle tier, bought on the second rung and charged for every cycle after: Corporate Ladder's car and address, the Frontier's bay and the room over the Ellis place. Falling behind what the job expects costs standing, in steps that steepen as standing rises. A Dispatch coordinator keeping up fully nets -21 a week and earns the difference out of the days. No engine change; the only interface change is a tier display format. Sized by measurement, not feel (DECISIONS #36): a -2/week penalty is invisible against Dispatch's standing gains, and a player who chases standing every turn beats any flat penalty — 99 standing while buying nothing, and $2,245 richer than one who kept up. Hence the top step. Two defects fixed on the way. The conformance suite excluded debt from the economic baseline by matching /debt|owed|loan/i on path names, which would have counted every lifestyle tier into it; packs now declare tuning.baselineExcludes. And 'the promotion leaves a player better off' pooled end balances across archetypes that do not spend alike, so it measured the mix — it is now derived from the upkeep arithmetic. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RxdJFbLq1rBKsUeticGV1g
550 lines
20 KiB
JavaScript
550 lines
20 KiB
JavaScript
// Dispatch: the second tier.
|
|
//
|
|
// Same mechanics, different pressure. The mailroom's problem was money; up here
|
|
// the money is fine and the problem is that other people's days now depend on
|
|
// yours — including the mailroom's, which you used to be.
|
|
//
|
|
// The first two events carry no conditions, no cooldown and no `once`, so this
|
|
// stage has a floor of its own. Trevor's two chains are mutually exclusive
|
|
// branches on whether you put him up for your old job.
|
|
|
|
export const dispatch = [
|
|
{
|
|
id: 'dispatch_first_day',
|
|
stage: 'dispatch',
|
|
weight: 99999,
|
|
once: true,
|
|
description:
|
|
'The Dispatch desk has three phones and a laminated card taped to it, ' +
|
|
'listing what to do when each one rings. The handwriting is Marlene\'s.',
|
|
options: [
|
|
{
|
|
id: 'read_card',
|
|
label: 'Read the card.',
|
|
result: 'It is nineteen years of somebody else\'s hard-won afternoons, in eleven lines.',
|
|
effects: [
|
|
{ path: 'skills.logistics', op: 'add', value: 3 },
|
|
{ path: 'relationships.marlene.likes_you', op: 'add', value: 2 },
|
|
{ path: 'notable', op: 'push', value: 'Found Marlene\'s handwriting taped to the Dispatch desk.' },
|
|
],
|
|
},
|
|
{
|
|
id: 'answer_everything',
|
|
label: 'Answer all three phones and work it out.',
|
|
result: 'By four o\'clock you have worked out what six of the eleven lines meant.',
|
|
effects: [
|
|
{ path: 'skills.logistics', op: 'add', value: 2 },
|
|
{ path: 'skills.negotiation', op: 'add', value: 2 },
|
|
{ path: 'reputation', op: 'add', value: -2 },
|
|
],
|
|
},
|
|
{
|
|
id: 'take_it_slow',
|
|
label: 'Let the phones ring and learn the board first.',
|
|
result: 'Two callers give up. The board, however, you now understand.',
|
|
effects: [
|
|
{ path: 'skills.logistics', op: 'add', value: 4 },
|
|
{ path: 'reputation', op: 'add', value: -3 },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
id: 'routing_board',
|
|
stage: 'dispatch',
|
|
weight: 70,
|
|
description:
|
|
'Two runs are booked against the same van at the same hour. Both floors ' +
|
|
'have written "URGENT" on the docket, one of them twice.',
|
|
options: [
|
|
{
|
|
id: 'triage',
|
|
label: 'Work out which one is actually urgent.',
|
|
result: 'Neither. You send the van to a third job nobody had flagged at all.',
|
|
effects: [
|
|
{ path: 'skills.logistics', op: 'add', value: 3 },
|
|
{ path: 'reputation', op: 'add', value: 3 },
|
|
],
|
|
},
|
|
{
|
|
id: 'split_van',
|
|
label: 'Split the run and make both floors wait half as long.',
|
|
result: 'Both floors complain about the half they waited. Neither escalates it.',
|
|
effects: [
|
|
{ path: 'skills.logistics', op: 'add', value: 1 },
|
|
{ path: 'reputation', op: 'add', value: 1 },
|
|
],
|
|
},
|
|
{
|
|
id: 'first_come',
|
|
label: 'Whoever wrote URGENT twice can go second.',
|
|
result: 'They notice. They are the sort of floor that notices.',
|
|
effects: [
|
|
{ path: 'reputation', op: 'add', value: -2 },
|
|
{ path: 'skills.logistics', op: 'add', value: 1 },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
id: 'late_freight',
|
|
stage: 'dispatch',
|
|
weight: 55,
|
|
description:
|
|
'A freight job has come in past the cutoff. Taking it means somebody stays, ' +
|
|
'and the somebody is either you or a person you now have the standing to ask.',
|
|
options: [
|
|
{
|
|
id: 'stay_yourself',
|
|
label: 'Stay and do it yourself.',
|
|
result: 'It takes ninety minutes. Nobody sees it, which is most of the job now.',
|
|
effects: [
|
|
{ path: 'money', op: 'add', value: 90 },
|
|
{ path: 'skills.logistics', op: 'add', value: 1 },
|
|
{ path: 'reputation', op: 'add', value: 2 },
|
|
],
|
|
},
|
|
{
|
|
id: 'ask_the_floor',
|
|
label: 'Ask the mailroom to cover it.',
|
|
requires: [{ path: 'skills.negotiation', op: '>=', value: 25 }],
|
|
result:
|
|
'They cover it. You remember precisely how this felt from the other end, ' +
|
|
'and ask anyway.',
|
|
effects: [
|
|
{ path: 'skills.negotiation', op: 'add', value: 2 },
|
|
{ path: 'reputation', op: 'add', value: -1 },
|
|
{ path: 'relationships.trevor.likes_you', op: 'add', value: -4 },
|
|
{ path: 'relationships.trevor.fears_you', op: 'add', value: 3 },
|
|
],
|
|
},
|
|
{
|
|
id: 'bounce_it',
|
|
label: 'Send it back as past cutoff.',
|
|
result: 'The cutoff exists. You have simply never seen anyone use it before.',
|
|
effects: [
|
|
{ path: 'reputation', op: 'add', value: -3 },
|
|
{ path: 'skills.negotiation', op: 'add', value: 1 },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
id: 'mailroom_calls',
|
|
stage: 'dispatch',
|
|
weight: 60,
|
|
cooldown: 4,
|
|
description:
|
|
'The mailroom is short-handed and the bins are backing up. From up here it ' +
|
|
'is a number on a board. You know exactly what it is down there.',
|
|
options: [
|
|
{
|
|
id: 'go_down',
|
|
label: 'Go down and sort bins for an hour.',
|
|
result:
|
|
'You are a coordinator sorting bins. Two people find this funny and one ' +
|
|
'finds it reassuring.',
|
|
effects: [
|
|
{ path: 'skills.logistics', op: 'add', value: 2 },
|
|
{ path: 'reputation', op: 'add', value: 3 },
|
|
{ path: 'relationships.trevor.likes_you', op: 'add', value: 5 },
|
|
{ path: 'relationships.marlene.likes_you', op: 'add', value: 4 },
|
|
],
|
|
},
|
|
{
|
|
id: 'send_help',
|
|
label: 'Pull someone off a run to help them.',
|
|
result: 'The run is late. The bins are not. You will hear about the run.',
|
|
effects: [
|
|
{ path: 'skills.logistics', op: 'add', value: 1 },
|
|
{ path: 'reputation', op: 'add', value: -1 },
|
|
{ path: 'relationships.trevor.wants_to_help_you', op: 'add', value: 4 },
|
|
],
|
|
},
|
|
{
|
|
id: 'leave_them',
|
|
label: 'It is a number on a board.',
|
|
result: 'The number goes down by itself, eventually, the way it always did.',
|
|
effects: [
|
|
{ path: 'relationships.trevor.likes_you', op: 'add', value: -5 },
|
|
{ path: 'relationships.marlene.likes_you', op: 'add', value: -3 },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
id: 'trevor_promoted',
|
|
stage: 'dispatch',
|
|
weight: 55,
|
|
cooldown: 5,
|
|
requires: [{ path: 'flags.recommended_trevor', op: '==', value: true }],
|
|
description:
|
|
'Trevor runs the mailroom now and has opinions about how it was run before. ' +
|
|
'Some of the opinions are about you. All of them are correct.',
|
|
options: [
|
|
{
|
|
id: 'concede',
|
|
label: 'Tell him he is right.',
|
|
result: 'He is so unprepared for this that he agrees with you about something else.',
|
|
effects: [
|
|
{ path: 'relationships.trevor.likes_you', op: 'add', value: 6 },
|
|
{ path: 'relationships.trevor.wants_to_help_you', op: 'add', value: 4 },
|
|
{ path: 'skills.negotiation', op: 'add', value: 1 },
|
|
],
|
|
},
|
|
{
|
|
id: 'back_him',
|
|
label: 'Back him upstairs when it matters.',
|
|
requires: [{ path: 'reputation', op: '>=', value: 55 }],
|
|
result: 'His changes go through. He knows exactly why they went through.',
|
|
effects: [
|
|
{ path: 'relationships.trevor.wants_to_help_you', op: 'add', value: 10 },
|
|
{ path: 'reputation', op: 'add', value: 2 },
|
|
{ path: 'notable', op: 'push', value: 'Backed Trevor\'s changes to the mailroom.' },
|
|
],
|
|
},
|
|
{
|
|
id: 'pull_rank',
|
|
label: 'Remind him whose desk the board is on.',
|
|
result: 'It works. It works the way a door works when you take it off its hinges.',
|
|
effects: [
|
|
{ path: 'relationships.trevor.fears_you', op: 'add', value: 8 },
|
|
{ path: 'relationships.trevor.likes_you', op: 'add', value: -8 },
|
|
{ path: 'reputation', op: 'add', value: -2 },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
id: 'trevor_passed_over',
|
|
stage: 'dispatch',
|
|
weight: 55,
|
|
cooldown: 5,
|
|
requires: [{ path: 'flags.recommended_trevor', op: '==', value: false }],
|
|
description:
|
|
'Trevor is still in the mailroom and has started addressing you by your ' +
|
|
'full title. He does it in front of people. He does it kindly, which is worse.',
|
|
options: [
|
|
{
|
|
id: 'address_it',
|
|
label: 'Say the thing out loud.',
|
|
requires: [{ path: 'skills.negotiation', op: '>=', value: 25 }],
|
|
result:
|
|
'He denies it, then stops doing it. Both of you agree never to refer ' +
|
|
'to the conversation again.',
|
|
effects: [
|
|
{ path: 'skills.negotiation', op: 'add', value: 3 },
|
|
{ path: 'relationships.trevor.likes_you', op: 'add', value: 6 },
|
|
{ path: 'relationships.trevor.fears_you', op: 'add', value: 2 },
|
|
],
|
|
},
|
|
{
|
|
id: 'find_him_something',
|
|
label: 'Find him something worth doing.',
|
|
result:
|
|
'You give him the freight schedule, which is a real job. He is careful ' +
|
|
'with it, and the title stops.',
|
|
effects: [
|
|
{ path: 'relationships.trevor.likes_you', op: 'add', value: 8 },
|
|
{ path: 'relationships.trevor.wants_to_help_you', op: 'add', value: 6 },
|
|
{ path: 'reputation', op: 'add', value: 2 },
|
|
{ path: 'notable', op: 'push', value: 'Found Trevor something worth doing.' },
|
|
],
|
|
},
|
|
{
|
|
id: 'let_it_run',
|
|
label: 'Let him have it.',
|
|
result: 'He has it. It does not appear to be making him any happier.',
|
|
effects: [
|
|
{ path: 'relationships.trevor.likes_you', op: 'add', value: -3 },
|
|
{ path: 'reputation', op: 'add', value: -1 },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
id: 'marlene_upstairs',
|
|
stage: 'dispatch',
|
|
weight: 45,
|
|
cooldown: 6,
|
|
description:
|
|
'Marlene comes up with a docket she could have sent. She looks at the three ' +
|
|
'phones for slightly too long before she says anything.',
|
|
options: [
|
|
{
|
|
id: 'ask_her',
|
|
label: 'Ask whether she ever wanted this desk.',
|
|
result:
|
|
'She says nobody offered, which is not the same as no. Then she asks ' +
|
|
'whether the third-floor bins have gone up.',
|
|
effects: [
|
|
{ path: 'relationships.marlene.likes_you', op: 'add', value: 6 },
|
|
{ path: 'relationships.marlene.wants_to_help_you', op: 'add', value: 4 },
|
|
{ path: 'notable', op: 'push', value: 'Asked Marlene whether she ever wanted the Dispatch desk.' },
|
|
],
|
|
},
|
|
{
|
|
id: 'take_the_docket',
|
|
label: 'Take the docket and get on with it.',
|
|
result: 'She goes back down. The card is still taped to the desk.',
|
|
effects: [{ path: 'skills.logistics', op: 'add', value: 1 }],
|
|
},
|
|
{
|
|
id: 'put_her_up',
|
|
label: 'Put her name up for the next post that opens.',
|
|
requires: [{ path: 'reputation', op: '>=', value: 60 }],
|
|
result:
|
|
'She does not thank you. Two days later there is a second card taped ' +
|
|
'to the desk, with the four lines she had left out.',
|
|
effects: [
|
|
{ path: 'relationships.marlene.likes_you', op: 'add', value: 10 },
|
|
{ path: 'relationships.marlene.wants_to_help_you', op: 'add', value: 10 },
|
|
{ path: 'reputation', op: 'add', value: 3 },
|
|
{ path: 'notable', op: 'push', value: 'Put Marlene up for the next post that opened.' },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
id: 'dispatch_overtime',
|
|
stage: 'dispatch',
|
|
weight: 40,
|
|
cooldown: 6,
|
|
description:
|
|
'The quarterly stocktake needs a coordinator on site for the weekend. It ' +
|
|
'pays coordinator rates, which are new to you.',
|
|
options: [
|
|
{
|
|
id: 'take_it',
|
|
label: 'Take the weekend.',
|
|
result: 'Two days, and the rate is genuinely different. You check the slip twice.',
|
|
effects: [
|
|
{ path: 'money', op: 'add', value: 320 },
|
|
{ path: 'skills.logistics', op: 'add', value: 2 },
|
|
{ path: 'reputation', op: 'add', value: 2 },
|
|
],
|
|
},
|
|
{
|
|
id: 'send_trevor',
|
|
label: 'Offer it to the mailroom instead.',
|
|
result:
|
|
'Trevor takes it. He has never been paid that for a weekend and it ' +
|
|
'shows on Monday.',
|
|
effects: [
|
|
{ path: 'relationships.trevor.likes_you', op: 'add', value: 8 },
|
|
{ path: 'relationships.trevor.wants_to_help_you', op: 'add', value: 5 },
|
|
{ path: 'reputation', op: 'add', value: 2 },
|
|
],
|
|
},
|
|
{
|
|
id: 'pass',
|
|
label: 'Pass.',
|
|
result: 'Somebody from Finance does it and gets it wrong in an interesting way.',
|
|
effects: [],
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
id: 'van_breakdown',
|
|
stage: 'dispatch',
|
|
weight: 55,
|
|
cooldown: 4,
|
|
description:
|
|
'The long-wheelbase van is off the road until Thursday. Everything booked ' +
|
|
'against it is still booked against it, and the board does not know that yet.',
|
|
options: [
|
|
{
|
|
id: 'rebuild_board',
|
|
label: 'Rebuild the day around what you have.',
|
|
result:
|
|
'Four jobs move, one is dropped, and nobody upstairs ever learns the ' +
|
|
'van was off the road.',
|
|
effects: [
|
|
{ path: 'skills.logistics', op: 'add', value: 4 },
|
|
{ path: 'reputation', op: 'add', value: 3 },
|
|
],
|
|
},
|
|
{
|
|
id: 'hire_one',
|
|
label: 'Hire one in for the day.',
|
|
requires: [{ path: 'money', op: '>=', value: 200 }],
|
|
result: 'It costs what it costs. The day runs as though nothing happened.',
|
|
effects: [
|
|
{ path: 'money', op: 'add', value: -180 },
|
|
{ path: 'reputation', op: 'add', value: 2 },
|
|
{ path: 'skills.negotiation', op: 'add', value: 1 },
|
|
],
|
|
},
|
|
{
|
|
id: 'tell_them',
|
|
label: 'Tell every floor their job is late and why.',
|
|
result:
|
|
'Two floors are fine about it. The third writes an email with a ' +
|
|
'subject line that uses the word "again".',
|
|
effects: [
|
|
{ path: 'reputation', op: 'add', value: -2 },
|
|
{ path: 'skills.negotiation', op: 'add', value: 2 },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
id: 'new_starter',
|
|
stage: 'dispatch',
|
|
weight: 50,
|
|
cooldown: 5,
|
|
description:
|
|
'There is somebody new in the mailroom. They have been handed a laminated ' +
|
|
'card with the org chart on it, and their name is not on it either.',
|
|
options: [
|
|
{
|
|
id: 'walk_them_through',
|
|
label: 'Go down and walk them through it.',
|
|
result:
|
|
'You explain the card. Then you explain it again, because that is how ' +
|
|
'it works and you know that now.',
|
|
effects: [
|
|
{ path: 'reputation', op: 'add', value: 3 },
|
|
{ path: 'relationships.marlene.likes_you', op: 'add', value: 4 },
|
|
{ path: 'skills.negotiation', op: 'add', value: 1 },
|
|
{ path: 'notable', op: 'push', value: 'Walked a new starter through the org chart.' },
|
|
],
|
|
},
|
|
{
|
|
id: 'give_advice',
|
|
label: 'Tell them what you wish somebody had told you.',
|
|
requires: [{ path: 'skills.negotiation', op: '>=', value: 30 }],
|
|
result:
|
|
'They write it down, which nobody did for you. Whether it helps is ' +
|
|
'not something you will find out.',
|
|
effects: [
|
|
{ path: 'reputation', op: 'add', value: 2 },
|
|
{ path: 'skills.negotiation', op: 'add', value: 2 },
|
|
{ path: 'notable', op: 'push', value: 'Told a new starter what nobody had told you.' },
|
|
],
|
|
},
|
|
{
|
|
id: 'leave_them_to_it',
|
|
label: 'Leave them to work it out. Everyone else did.',
|
|
result: 'They work it out. It takes them eleven days.',
|
|
effects: [{ path: 'reputation', op: 'add', value: -1 }],
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
id: 'finance_query',
|
|
stage: 'dispatch',
|
|
weight: 45,
|
|
cooldown: 6,
|
|
description:
|
|
'Finance has queried the courier spend. The query is three lines long and ' +
|
|
'took somebody a whole morning to write.',
|
|
options: [
|
|
{
|
|
id: 'answer_properly',
|
|
label: 'Answer it properly, with the numbers.',
|
|
result:
|
|
'The numbers are fine. Finance says so in one line, which took them ' +
|
|
'a whole afternoon.',
|
|
effects: [
|
|
{ path: 'skills.logistics', op: 'add', value: 2 },
|
|
{ path: 'reputation', op: 'add', value: 4 },
|
|
],
|
|
},
|
|
{
|
|
id: 'push_back',
|
|
label: 'Ask them what they think the alternative is.',
|
|
requires: [{ path: 'skills.negotiation', op: '>=', value: 35 }],
|
|
result:
|
|
'There is no alternative. Establishing this in writing turns out to ' +
|
|
'be worth more than the money was.',
|
|
effects: [
|
|
{ path: 'skills.negotiation', op: 'add', value: 3 },
|
|
{ path: 'reputation', op: 'add', value: 5 },
|
|
{ path: 'notable', op: 'push', value: 'Won an argument with Finance in writing.' },
|
|
],
|
|
},
|
|
{
|
|
id: 'cut_the_spend',
|
|
label: 'Cut the spend and let the service slip.',
|
|
result: 'Finance is delighted. Three floors are not, and one of them notices why.',
|
|
effects: [
|
|
{ path: 'money', op: 'add', value: 60 },
|
|
{ path: 'reputation', op: 'add', value: -4 },
|
|
],
|
|
},
|
|
],
|
|
},
|
|
|
|
{
|
|
// The cost of standing, offered rather than imposed. Buying nothing is
|
|
// always playable and always cheaper; it is Dispatch's weekly "looking the
|
|
// part" charge that makes it a real decision instead of a shop.
|
|
id: 'the_car_lot',
|
|
stage: 'dispatch',
|
|
weight: 45,
|
|
cooldown: 6,
|
|
requires: [{ path: 'lifestyle', op: '<', value: 2 }],
|
|
description:
|
|
'Marlene mentions, not quite to you, that the coordinator before last ' +
|
|
'drove something with a roof rack, and that people noticed when he ' +
|
|
'stopped. There is a lot on Ninth with a sign about payments.',
|
|
options: [
|
|
{
|
|
id: 'buy_the_car',
|
|
label: 'Put money down on the car.',
|
|
requires: [
|
|
{ path: 'lifestyle', op: '==', value: 0 },
|
|
{ path: 'money', op: '>=', value: 450 },
|
|
],
|
|
result:
|
|
'It is four years old and the radio only gets one station, and on ' +
|
|
'Monday two people who have never spoken to you ask about it.',
|
|
effects: [
|
|
{ path: 'money', op: 'add', value: -450 },
|
|
{ path: 'lifestyle', op: 'set', value: 1 },
|
|
{ path: 'reputation', op: 'add', value: 3 },
|
|
{ path: 'notable', op: 'push', value: 'Bought a car with a roof rack.' },
|
|
],
|
|
},
|
|
{
|
|
id: 'trade_up',
|
|
label: 'Trade up, and take the lease on the better side of the park.',
|
|
requires: [
|
|
{ path: 'lifestyle', op: '==', value: 1 },
|
|
{ path: 'money', op: '>=', value: 900 },
|
|
],
|
|
result:
|
|
'The address is two stops closer and four hundred a month dearer. ' +
|
|
'Nobody says anything about it, which is the entire point of it.',
|
|
effects: [
|
|
{ path: 'money', op: 'add', value: -900 },
|
|
{ path: 'lifestyle', op: 'set', value: 2 },
|
|
{ path: 'reputation', op: 'add', value: 5 },
|
|
{ path: 'notable', op: 'push', value: 'Moved to the better side of the park.' },
|
|
],
|
|
},
|
|
{
|
|
id: 'keep_the_bus_pass',
|
|
label: 'Keep the bus pass. The bus is fine.',
|
|
result:
|
|
'The bus is fine. You read two chapters a day on it, which is two ' +
|
|
'more than anybody on Ninth manages.',
|
|
effects: [{ path: 'skills.logistics', op: 'add', value: 1 }],
|
|
},
|
|
],
|
|
},
|
|
];
|
|
|
|
export default dispatch;
|