Overhaul: something you can do about the ceiling

The ceiling was the only number in the game that moved one way, with no
counterplay at any price. In practice that reads less as a design
pillar than as a punishment you cannot answer - you watch the car get
permanently worse and there is nothing to *do* about it.

Press C at any base to strip and rebuild, worst subsystem first. It
buys ceiling and deliberately nothing else: an overhaul raises what the
car could be, and ordinary repair still has to fill it in. Early on
every part goes to repairs and there is never a surplus, so this is
invisible; it only becomes the thing to spend on once the ceiling is
what is actually holding you back.

The rate is the design, not the impossibility. 0.12 of ceiling per
part, against a full point of condition per part for a repair, so
undoing one crash's permanent cost runs about seven missions. Decline
is now something you can fight rather than only absorb.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
dejvino
2026-08-09 07:52:27 +02:00
co-authored by Claude Opus 5
parent 764ea12a3f
commit d9cdca70d5
7 changed files with 231 additions and 9 deletions
+13 -2
View File
@@ -42,6 +42,17 @@ function describe(offer: Offer): string {
return `${LEVEL_WORDS[worst]}${stalest === null ? '' : ` · last word ${ago(stalest)}`}`;
}
/**
* The workshop line, on every panel a base can show.
*
* Repairs happen by themselves on hand-in; this is the other thing a base is
* for, and it is the only counterplay to a ceiling that otherwise only ever
* falls. It has to be visible wherever you are standing at one, or nobody
* discovers it exists.
*/
const OVERHAUL_FOOTER =
' · <span class="key">[C]</span> overhaul — spend parts on what she is capable of';
export function createBoard() {
const el = document.createElement('div');
el.id = 'board';
@@ -87,7 +98,7 @@ export function createBoard() {
</li>`,
)
.join('')}</ol>
<footer>press 1–${offers.length} to accept</footer>`;
<footer>press 1–${offers.length} to accept${OVERHAUL_FOOTER}</footer>`;
},
/**
@@ -106,7 +117,7 @@ export function createBoard() {
<div class="meta">Nobody here will take it off your hands, and nobody
here will hold the board open while you decide.</div>
</li></ol>
<footer><span class="key">[X]</span> give it up — we lose ground for it</footer>`;
<footer><span class="key">[X]</span> give it up — we lose ground for it${OVERHAUL_FOOTER}</footer>`;
},
hide() {
+2 -2
View File
@@ -170,8 +170,8 @@ export function createHud(seed: number, debug = false) {
`[debug] seed ${seed}`,
]
: []),
`WASD drive · space handbrake · R respawn · X drop job at a base` +
` · M sound ${model.muted ? 'off' : 'on'}`,
'WASD drive · space handbrake · R respawn',
`at a base: X drop job · C overhaul` + ` · M sound ${model.muted ? 'off' : 'on'}`,
'hold R to reset the campaign',
];
if (model.resetProgress > 0.06) {