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>
The heat meter, the district's standing, the road id and the name of
the band you are in exist to tune curves, and every one of them works
against the thing it measures. Phase 3's gate is telling occupied
ground from liberated without being told, and there was a line on
screen naming it. Phase 1's gate is avoiding a road for its history,
with a numeric heat bar underneath it. Neither can be judged while
reading the answer.
Without ?debug the HUD is now speed, condition, parts and runs, the
mission, and whether your cover is intact. The world has to say the
rest: the light, the fog, who is standing in the street, and what is
physically sitting in the road.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
state.active was only ever cleared by completing a job. A target can
end up behind concrete there is no way round, and the only exit was
holding R for five seconds - which does not drop the job, it destroys
every mile of wear, every road the enemy learned and the whole map you
built.
Park at any base with a job you have not started bringing home and the
board offers to take it off you for X. It costs 12m of front line, half
what dying costs: deciding a route is not worth it is a judgement the
game should let you make, and it cannot be free or the board becomes a
reroll button. Not offered on the return leg, since that arrival is a
hand-in and it is about to pay you.
Dropped jobs are counted apart from completed ones. They are not runs.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
A car could be driven to zero in every subsystem and would keep going
forever at a wheezing thirty km/h. Nothing was at stake, so nothing was
worth protecting, so there was never a reason to take the quiet road.
"Decline, not reset" only reads as a stake if the decline can run out.
When the chassis is gone, so are you: somebody pulls you out, you come
round at the nearest base, the job in hand is written off with the car,
and the ground your work had won is handed back - 25m, through the same
path a finished mission uses, so the war moves for one reason only.
The replacement is a real car, patched to its ceilings so it can be
driven off the forecourt, and every ceiling is 8% down on the one you
wrote off. That is the ratchet applied at the one moment repairs cannot
reach. It stops at a floor: without one, enough deaths issue a car that
is written off the instant you are handed it, and the only way out of
the campaign is wiping it. A miserable car you can still drive is the
interesting version of that ending.
None of it is announced. The front moving against you is something you
find out by driving back out there.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Cover is now a state you can lose. Suspicion builds while enemy eyes are on you,
squared with proximity so one patrol beside the car outweighs a crowd across the
street, and blocked by buildings like everything else. It cannot build at all
behind your own lines. Ramming, being shot at and running somebody over skip the
meter and land in full.
At the top of it you are hunted: nearby enemies drop what they were doing and
come, and keep joining as you drive past fresh patrols, since a chase you could
outrun by passing more of them would be no chase. Being hunted is also now the
only reason the enemy shoots at you — a target is a state, not a property of the
road you happen to be on.
Two ways out. Break line of sight for fourteen seconds, with any glimpse
resetting the clock; hunters drive to where they last saw you rather than where
you are, so turning a corner and changing direction is the move. Or let your own
side occupy them — hunters are patrols, not fanatics, and enough peeling off
ends the chase outright. Escaping leaves suspicion at 0.6 rather than zero: they
know there is a car worth looking for.
Tuning a test caught: the post-escape value sat a hair above the "suspicious"
threshold, so the afterglow expired within a second and the rule may as well not
have existed. Decay slowed to match, so cover is earned back by being dull
rather than by turning one corner.
Verified end to end in the running game: loitering beside a patrol in occupied
ground filled the meter and pulled three hunters, fleeing out of sight cleared it
after exactly fourteen seconds, and a visible player was closed on from 61m to
12m while taking hits.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Area heat. Road heat alone rewarded a strange kind of play: work one part of
town hard but take a different street every time, and nothing ever got hot. A
second, coarser pool now accrues from being inside a district at all — on-road
or off — and bleeds into every road running through it, including ones never
driven. Deliberately capped below the barricade threshold: a hot district gets
roads patrolled, but concrete still takes somebody actually using that road. It
also decays slower than road heat, because one patrol re-secures a road while a
district's reputation lingers.
Surfaces. Off the route the car now makes about 40% of its road top speed, loses
grip and scrubs momentum in a fifth of the distance, so the road hierarchy is
something you feel rather than something the map merely claims. A first tuning
made off-road a 12 km/h crawl, which removed the choice instead of pricing it —
going round a checkpoint cross-country has to stay a legitimate move.
Speed. Heat scales with how fast you were going, not just how far, and stops
rewarding ever-higher speed past a point so the answer is never one exact number
on the clock. With the road classes, that makes the routing decision real: the
trunk fast and noticed, or the lanes slow and ignored.
Save format goes to v2 for the district pool; older saves are refused rather
than half-restored. Also fixes a population test that hardcoded densities since
tuned, and README claims about patrols and AI that Phase 6 made untrue.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
No audio files. The build stays self-contained, so the engine is detuned
oscillators, tyres and gunfire are shaped noise, ambience is a filtered drone.
The constraint pays: sound generated from the sim can carry the sim's state
instead of decorating it.
The engine has gears, so the note climbs and drops rather than tracking the
speedometer forever. A worn engine sounds wrong rather than merely slow —
roughness rises and the top of the rev range falls away as condition drops, so
decline is audible as well as felt. Bald tyres squeal sooner than good ones, off
the lateral slip the physics actually reports. Gunfire falls off with the square
of distance and pans as the car turns, so a firefight is a direction. Territory
has a tone: the drone drops and thickens past the line, matching the palette.
Split so it can be tested: audio/mix.ts holds every decision as plain numbers and
is covered; audio/audio.ts is only wiring, which cannot run outside a browser.
A test caught panning being mirrored — +X is the car's left in this world, so the
sine needed negating.
Also adds hold-R-for-five-seconds to wipe the campaign, with a filling meter so
it cannot happen by accident, and M to mute. Tapping R still just respawns.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Nothing on a road simply appears any more. A road that turns notorious gets a
patrol dispatched to it: it starts at a junction a few hundred metres away,
drives there, sweeps the road for about a minute, and while it works the road it
brings the heat down — then leaves. Checkpoints are built rather than placed. At
turret level an engineer is sent, the tower rises over forty seconds of someone
standing on site, and a gunner mans it once it stands, up on top so he clears his
own barricade. Let the road cool and the whole thing is abandoned. heat.ts now
only pours concrete; everything living has to arrive.
Civilian traffic routes across the network with somewhere to be, people wander on
foot, and both scatter when shooting starts.
Skirmishes break out between the two armies on contested and occupied ground
regardless of where the player is. Rounds are real objects in flight rather than
instant hits between combatants — that is the point of the feature. If shots
resolved instantly, driving through a battle would cost nothing and "the only
road to the target runs through a firefight" would not be a decision. Strays hit
bystanders, civilians and the player alike; buildings stop them, so cover means
something; hits go through the same wear model as a crash, so being shot costs
ceiling too.
The enemy does not shoot at an undercover driver by default. They open up only
past the line and only on a road they have already checkpointed.
Reload was being counted in stepUnits while firing lived in stepCombat, so combat
stepped on its own never reloaded. A test caught it; ownership now sits with the
module that fires.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Mission types. Four of them, differing in pacing and risk rather than in the
noun on the board: a quick supply drop, a retrieval whose danger is all on the
return leg, a long stationary intel transmission in the open, and a cheap survey
whose payoff is the map. Retrieval carries cargo that impacts damage, and pays
for what arrives rather than what you set off with, which makes the drive home a
different problem from the drive out.
Radio. Chatter framing the player as an undercover driver being talked at by
people busy elsewhere. Every line is triggered by something actually happening
in the sim — crossing a border, a road you personally made notorious, a car past
saving, or the front genuinely drifting. The enemy-has-other-priorities line
fires off measured drift, so the brief's ambient-drift-is-the-mechanism idea is
said out loud without ever showing a number. Topics carry cooldowns and never
repeat a sentence back to back; a test caught that they could.
Field work. Past the line, with nothing in hand, a wounded stranger or a contact
or a strippable wreck occasionally turns up. Deliberately not on a board: no
route preview, no comparison, no shopping between them. Take the detour in front
of you or drive on. They never appear behind your own lines, where a safe errand
would defeat the point.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Three things, all tangled together enough to land at once.
Regions. A single directional front cuts the map into liberated, contested,
occupied and frontier. Heat accrual behind your own lines is exactly zero, not
merely small — a trickle would eventually fortify your own back garden, and
would mean the safe area quietly punished you for using it. Decay is judged by
whoever holds the road, not whoever holds the ground the car is standing on.
Modelled as one front rather than blobs of territory because the brief wants the
line to move in both directions, and Phase 4 can then just slide the offsets.
Territory is signalled by tone, never by the world announcing itself: crossing a
border eases the fog, light and palette between four looks. Phase 3's gate is
telling occupied from liberated without being told, so the HUD line naming the
band is debug scaffolding like the heat numbers.
Minimap. There was no way to tell where a target was. The map is drawn from
Intel, not from the world: the road network's shape is always faintly visible,
but only roads actually seen carry remembered heat, only ground actually driven
through is filled in, and the front line is dashed in only where both sides of
it have been explored. Adds a coarse fog-of-war grid to Intel, plus an
eight-point compass arrow in the HUD.
Base huts. The building was centred on the junction, so the starting hut sat
directly over the car and hid it. Huts now stand off the junction, in whichever
direction is furthest from tarmac, and are solid.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Four allied bases, placed by greedy farthest-point so no choke point can strand
the player, with the first at the spawn junction so the loop is available at
once. Missions hand in at any base, not the issuing one.
The board offers known and new targets side by side and describes each route in
words. Crucially it never reads heat directly — it reads sim/intel.ts, a record
of what the player has actually observed and when. Notes age while roads keep
escalating unwatched, so a known route is knowable, stale, and never a promise.
Recon missions survey everything within 130m, which is how a new target becomes
a known one without driving every road there.
New targets pay 1.8x. That multiplier is the phase's tuning dial: too low and
nobody takes the unknown, too high and nobody takes the known.
Payment is parts, which repair the car. To keep "decline, not reset" intact,
each subsystem gains a ceiling that falls permanently with damage — repairs
restore up to what the car is still capable of, never to what it was. Without an
economy the board's rewards had no stakes; with one, the risky job is what keeps
the car running a while longer.
Adds Dijkstra over the road graph, taking a cost function so a "safest route"
preview is a small change later.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Driving alongside a road accrued no heat at all, so the dominant strategy was
to never actually use one. Heat is now credited to any road within 12m of the
centreline, tarmac or verge.
The cutoff is hard rather than tapered: a taper leaves a gradient to optimise
along, where sitting at 80% of the catchment costs 20% of the heat. A cliff
edge means you either use the route or genuinely leave it.
12m is a balance, not a guess. It puts ~7.5m of verge past the kerb — two car
widths, so hugging the shoulder gains nothing — while leaving 57% of the map
off-route. At 20m two thirds of the map counts as on-route, heat becomes
unavoidable everywhere, and choosing a different route stops meaning anything.
Barricades now span the full corridor for the same reason. Stopping at the kerb
left them free to round on the verge at speed.
Junction heat is still deferred; a point near a junction is credited to the
nearest segment.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Roads are a jittered 7x7 grid with ~a quarter of the edges thinned out, kept
connected. The loops are the point: "take a different road" is not a decision
without alternative routes.
Every metre driven adds heat to that segment; all roads shed it slowly. Crossing
a threshold escalates Clear -> Patrol -> Barricade -> Turret, each of which puts
real obstructions on the tarmac. Hysteresis stops a road on a boundary from
rebuilding its barricade every few seconds.
Level changes are deferred while the car is on the segment. Building a barricade
around the player would spawn a static collider inside the chassis, and the
player is meant to discover escalation by returning to a road, not by watching
it assemble behind them.
Checkpoint positions are seeded from the segment id, so a stretch of road always
fortifies in the same place — recognising it is part of learning the map.
Scenery now avoids the tarmac and the car spawns at a junction.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Vite + TypeScript + three.js + Rapier raycast vehicle, fixed 60 Hz step.
Flat plate, seeded obstacle scatter, chase camera, debug HUD. Car condition
(engine/tires/chassis) degrades permanently and is derived into handling
numbers, so decline is felt through the wheel rather than read off a meter.
src/sim/ is kept free of three.js and Rapier imports — the later heat, region
and front-line systems all live there, and staying engine-free is what makes
them unit-testable without a browser.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>