Commit Graph

46 Commits

Author SHA1 Message Date
dejvino
4b1f8c6444 Cover comes from the road's reputation and the car you turned up in
Occupied ground used to blow your cover on its own: park anywhere past
the line, in anything, and somebody would eventually make you. But
nobody is looking for a driver they have no reason to believe exists.
Suspicion now runs off how wary the place actually is - the heat on the
road being used, or on the district when off it - and off how much the
vehicle draws the eye.

Two things had to change for that to mean anything.

Alertness caps how sure anyone can get, not just how fast. Without the
ceiling a quiet car on a cold road is only *slower* to be made, never
safe from it, because everybody saturates eventually and the whole
distinction collapses.

And the decay runs the whole time rather than only when nobody is
watching, which turns an accumulator into a threshold. Below
DECAY-worth of attention you are not slowly being made, you are simply
not being made. An accumulator always reaches the top given long
enough, so "nobody suspects you here" could never have meant anything.

Certainty and what certainty costs are kept apart. A person cannot be
more than sure - so attention caps, and it is what the markers over
their heads show - but somebody sure about an armoured carrier on a
road they have worked all week is a different event from somebody
equally sure about a tractor on a quiet one. Folding those together
made every vehicle identical the moment anyone was certain, which took
the garage's whole decision back out.

Tuned against the stated pacing, and pinned to it. Driving the same
checkpoint repeatedly as the road heats up, the pass you are caught on:
armoured carrier 1st, sports coupe 2nd, lorry 4th, estate 5th,
runabout 7th, tractor 8th. Under continuous watch an armoured carrier
is made in half a second on a notorious road and still under six on one
nobody has touched; a runabout on a cold road is never made at all.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 21:18:54 +02:00
dejvino
5b881312b0 Six vehicles, and suspicion is about belonging rather than being good
Reworked to the requested catalogue: small runabout, tractor, large
estate, lorry, sports coupe, armoured carrier. The runabout is free and
everything else is unlocked.

The important change is not the list, it is the axis. Attention is no
longer tied to capability - it is tied to whether the vehicle *belongs
here*. A lorry is three tonnes, well protected and nobody looks twice,
because lorries exist. A sports coupe is quick and flimsy and everybody
looks, because who drives that, here, now. So the whole civilian half
stays quiet however capable it gets, and you pay for speed and armour
in money and in handling instead. Only two vehicles cost you attention,
and they are the two that do not belong: the flashy one and the one
with a gun mount.

That kills the old "each rung must be more conspicuous than the last"
test, which no longer describes the design. In its place is the
invariant that actually matters and is much stronger: across all
thirty pairs, no vehicle may be at least as good as another on speed,
protection, discretion *and* handling at once. That is what stops a
dominant pick appearing and the loop losing its only decision - a lorry
is safe and unremarkable and pays for it by steering like a barge.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 21:05:03 +02:00
dejvino
6a0c16fcf4 Make the car you picked the car you are driving
deriveHandling now takes the spec as well as the condition, and every
figure is the catalogue's own number scaled by wear - so the table
means what it says rather than describing a single car with a skin on
it. A tractor turns tighter and grips less than an armoured car, and
stays that way as both of them fall apart.

Fragility reaches both damage paths, walls and bullets alike, since
being shot at is precisely the situation armour is bought for. The same
head-on leaves the tractor at 15% chassis and the armoured car at 77%.

Wear scales the car's figures rather than replacing them, and bottoms
out at a third rather than at nothing. A car that stops entirely at 0%
is a fail state wearing a dial, and the whole point of the garage is
that a bad car is a situation rather than an ending.

Mass moves with the spec; the collider deliberately does not. Different
colliders would mean rebuilding the vehicle controller mid-campaign,
and every barricade gap and building alley in the world is sized
against one car. The mesh changes shape and paint, so a tractor reads
as a tractor from the mirror without the world needing re-measuring.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 21:02:32 +02:00
dejvino
ea386bca2a A garage of cars, traded against being noticed
The loop's problem was that it had no decision in it. Condition was
health, capability, currency sink and fail state all at once, so every
event pushed the same way and there was nothing to weigh against
anything else.

This is the axis the loop turns on instead:

  A tractor is slow and made of tin, and nobody looks twice at it.
  An armoured car survives being shot at, and everybody notices it.

Five cars from a field tractor to an armoured car. Money buys them
permanently rather than paying a repair bill, so progress climbs while
any single drive still declines. There is deliberately no best one - a
quiet errand down cold roads wants the thing nobody reports, a run into
a district that already knows your face wants the thing that survives
what happens next.

Kept honest by a pairwise test rather than a glance at the table: every
rung has to be more conspicuous than the one below by at least the
geometric mean of what it gains in toughness and speed. The armoured
car failed it on the first pass - 3.7x tougher for 1.4x the attention,
which is a strictly better car and would have collapsed the choice back
into "drive the newest thing". Repriced to 3.6, because being
undercover in an armoured car ought to be close to a contradiction in
terms.

Catalogue and state only; nothing reads it yet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 20:59:21 +02:00
dejvino
47e9e8bfdb Stop the loop eating itself, ahead of the garage
Diagnosed from a complaint that the car swerves, goes too slow, cannot
outrun anything, and that dying just restarts the same decline. The
constants below are not the real answer - the loop needs restructuring,
and a garage of cars is coming - but each of these is a defect on its
own terms and any redesign still wants them fixed.

steeringPull was the worst of them. It is an uncommanded steering input
that never lets go, and at 0.06 linear it walked the car off a
fifteen-metre trunk, driving dead straight, in under seven seconds at
90% chassis. That is the swerve, and it was also most of the speed
loss, because off the tarmac drive force drops to 55%. It reads from
`chassis`, the subsystem a collision hurts most - so raising crash
damage fivefold, which I did on request without checking what depended
on it, quietly turned one bad corner into a car that cannot be driven
straight. Squared and much smaller, early wear is texture and only a
genuinely bent car fights you for the wheel. Same test: on the road at
90%, and holding for 13 seconds at 80% instead of six.

Dying sent you to the nearest base, and two of the four sit out in
frontier ground - so dying deep put you deeper, in a worse car, with
five ambient patrols for company. Now the nearest base on ground your
own side holds.

Repairs were 100 funds a condition point, so one crash cost 1.4 points,
¤140, four missions - in a car by then too slow to do them well. The
permanent share is what a crash is supposed to cost; being unable to
afford to get back on the road at all is a dead end, not a
consequence. Repairs are 2.5x cheaper and the scar is priced
separately so it stays expensive.

And a floor: a derelict car at a base with an empty pocket gets patched
up for nothing. It buys back no ceiling, so the decline is untouched -
it only removes the state where no sequence of good decisions gets you
out.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 20:56:29 +02:00
dejvino
cf5d55bdf0 Look around with the mouse
Hold the right button and drag to swing the view round the car; let go
and it eases back to the road over a moment, the way you turn your head
back rather than being snapped to it. Measured: 9.6m of orbit on a
short drag, and exactly zero drift from centre once released.

Deliberately not pointer lock. Locking the cursor feels better in a
driving game right up until you want to press one of the debug panel
buttons or read the quest board, both of which are ordinary DOM sitting
over the canvas - a game that swallows the cursor to look left is one
you have to escape out of to use its own interface.

The camera orbits the car rather than turning on the spot, so the car
stays in frame and you can still see what you are about to drive into
while looking away from it.

Read at frame rate rather than from the fixed step, since this is the
one input where lag shows up directly as the view dragging behind the
mouse - through a separate accessor, because `read()` clears the
buffered one-shot keys and calling it from the render loop would
swallow whichever keypress landed that frame.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 17:51:57 +02:00
dejvino
4bec70ba38 Show who is looking at you, and give them time to decide
Two complaints with one cause: cover was too easy to lose, and losing
it came out of nowhere. Suspicion started climbing the instant anybody
had line of sight, so driving *past* a checkpoint cost exactly what
loitering at one did, and the only feedback was a bar filling up with
no indication of who was filling it.

Watchers now settle on you before they start filling anything. Passing
through quickly leaves everyone at a glance; lingering is what costs
you. Measured: attention 0.35 at one second, 0.70 at two, sure at
three, hunted at six - so there is a couple of seconds where somebody
has clocked you and there is still time to be somewhere else.

And that half is now visible. A diamond floats over anybody watching,
growing and reddening as they make their mind up, so the decision -
keep going or get out of sight - has a direction and a rate attached to
it out in the world rather than in the corner of the screen. The HUD
says how many are watching and how settled the keenest of them is.

Once it goes wrong, hunters are drawn on the minimap in solid red with
a line back to the car, and the HUD carries a compass arrow per hunter.
A count tells you to panic; a set of bearings tells you which way to
go, which is the actual decision.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 17:48:23 +02:00
dejvino
18477f0e38 Traffic that rejoins its lane instead of orbiting it
Cars were driving tight circles at certain junctions, one after
another: twenty laps in thirty seconds to net eight metres.

The lane aim point was a fixed distance *along the lane* from where the
car projects onto it, and that breaks down at both ends. Close in, the
point falls inside the tightest circle the car can drive - about six
metres at TURN_RATE - so it cannot be reached, the car swings past and
comes round again, forever. The obvious fix of growing the lookahead
with the error makes the other end worse: the point runs away down the
lane until the direction to it is almost parallel with the lane itself,
the steering correction vanishes, and the car drifts further out every
step. Instrumented one drifting from 28 to 42 metres wide of its own
road while dutifully pointing along it.

Measuring the lookahead from the *car* instead fixes both at once. On
the line it sits ahead and the car tracks straight; off it by less than
the lookahead the point slides back along the lane and the car cuts in;
off by more there is no such point at all, so it aims at the nearest
bit of lane there is and drives at it.

Worst car over thirty seconds: 21 turns before, 2.7 after - and 2.7
across 419 metres of a grid map is just corners. Worst distance off
lane: 42 metres and growing, now 13.6 and closing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 17:43:22 +02:00
dejvino
d8a1f784ae Civilians with some sense of self-preservation
Three things people were not doing.

They wandered into the road and ambled across four lanes at the pace
they cross a courtyard. That quietly made running one over the world's
fault rather than yours: if people walk into traffic by themselves,
hitting one costs the player nothing. They now keep off the tarmac, and
anyone who does need the other side commits and hurries - holding their
heading, because dithering in the middle of a road is the one thing
nobody does. Measured over four minutes: none of thirty standing in a
road, and crossings covered well over half again the ground per second
that strolling does. A small chance of committing is deliberate; pure
avoidance turns every block into a sealed pen.

They only fled the sight of somebody holding a rifle, not the sound of
one going off. Gunfire now raises an alarm that outlasts the noise by
six seconds, because a crowd that froze the instant the last round was
fired reads as a switch rather than as fear. Running from it beats
keeping off the road - that is the moment people stop being careful.

And traffic drove straight into a parked car and shunted it down the
street, which makes every other vehicle read as weather rather than as
a driver. Civilians now yield to the player as well as to each other.
Parked across a road for ninety seconds: closest approach 9.2m, shoved
zero metres. Unless they have just heard shooting, in which case they
do not wait behind you.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 15:49:38 +02:00
dejvino
2ffef66ef8 Field contacts exist in the world, not only on the map
The minimap has always drawn these as a pink dot and the 3D world had
nothing there at all, so the one kind of work you are meant to find by
looking was the one kind you could only find by reading the map - and
driving to the dot put you in an empty street.

There is now a marker in the world, and underneath it the thing itself:
somebody standing where nobody stands, or a burnt-out car worth
stripping. The prop is what you recognise; the marker is so you can
pick it out from scenery at the speed you are going, and the ring on
the ground is the radius you have to stop inside.

Deliberately a fifth the height of a base beacon. These are work you
find rather than work you plan - you cannot compare one against
anything or route to it - and a pillar visible across the map would
quietly turn them into errands.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 15:39:07 +02:00
dejvino
627eca2f3d Everyone was driving on the left
This world is right-handed with Y up, so a car facing +Z has its
right-hand side toward -X. The lane offset used (dirZ, -dirX), which is
+X, which is left. Every vehicle in the game drove on the wrong side of
the road.

It was invisible for the usual reason: traffic still held neat parallel
lines and still passed oncoming cars without touching, just on the
wrong side. And the test agreed, because the test computed its idea of
"right" by copying the sim's vector, so it inherited the same inverted
sign and cheerfully certified the whole map.

Confirmed three ways before changing anything: the geometry, the HUD's
own compass - which reads +X at heading 0 as a left turn - and driving
the car, where holding W and D from heading 0 ends up at negative x.

The test now derives nothing from sim/units.ts. It asks the HUD's
compass which way the lane offset points and requires the answer to be
"right". Two modules that must agree, written independently, is the
only version of this test that can fail; inverting the vector under it
now fails all three cases.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 15:35:47 +02:00
dejvino
b4f8fd6c99 Document the second pass
Adds the harsher crash calibration, the overhaul, the death cam, the
currency, the traffic rules and why each of them is narrower than it
looks, crewed vehicles, allied convoys, and the building-grid bug that
was letting bullets, line of sight and people through three quarters of
every wall.

Two new gates under Next: whether the crash cost reads as punishing or
as a reason to slow down, and whether the overhaul becomes something
you save for.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 08:28:05 +02:00
dejvino
5c2778785c Allied vehicles, with men in them
Your own side had people on foot and nothing on wheels, so home ground
had civilian traffic on it and nothing else moving that was yours. A
road with only civilians on it reads the same behind the lines as past
them.

Convoys route across the network like traffic - which means they
inherit lane discipline and following distance for nothing - but only
between junctions your side holds, and they leave when the line moves
over them. Fewer than the militia on foot, because a truck is scarcer
than a man with a rifle and because friendly traffic that outnumbered
the civilian kind would turn every road into a convoy. Across the map:
convoys 4, 2, 0, 0 and militia 14, 10, 3, 0 against patrols 0, 0, 3, 5.

They are insurgent faction, so they shoot and get shot at, and the
render already crews any armed vehicle - they carry the same visible
gunner the enemy cars got.

Two things this shook out. Lane keeping was building its axis from the
car-to-node direction, which is nearly right mid-leg and degenerates
completely near either end, where the direction swings ninety degrees
over a few metres; on a grid map cars spend most of their time near a
junction. Units now remember the junction they last left and drive the
leg they are actually on. And arrival was still judged on the node
itself while the car deliberately passes three metres to one side of
it, so on trunks dispatched units drove straight past their
destination - no patrol worked a road, no engineer poured any concrete.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 08:26:46 +02:00
dejvino
7004f2bd66 Put a man in the enemy cars, and let him raise his weapon
A patrol car was an empty box that occasionally emitted tracers.

It now carries a visible crewman, standing up out of the roof so he
clears the roofline at any useful distance. He turns toward whatever he
is watching, and the weapon comes up only once they have decided about
you: across his lap and pointing at the floor otherwise, levelled and
out in front when the car is hunting or when there is something of the
other army in range.

That difference is the point of the whole thing. Being recognised was a
meter filling up in the corner of the screen; it is now something you
can see happen across a street. The gun is bigger and lighter than it
ought to be for the same reason the people are - at a driver's eye
height a rifle is three pixels against a dark road - and the pose
change is exaggerated, because a subtle change of angle is a detail
rather than a signal.

Rounds now leave the man rather than the bonnet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 08:18:45 +02:00
dejvino
baa7bba95f Traffic that drives like traffic
Three things, all of which the world was visibly not doing.

Cars drove down the middle of every road in both directions, so two
meeting head-on occupied the same metre of tarmac and passed through
each other. They now hold a line parallel to the centreline, offset
right by a share of the road's own half-width, so a track gets a nudge
and a trunk gets a lane. Offsetting the destination instead was the
obvious fix and the wrong one - it only bends the path at the very end
of a leg, leaving cars straddling the middle of every straight. They
track the lane line at a lookahead instead.

Heading snapped straight to the next junction, so a right-angle turn
was one frame of instant pivot. It is now rate-limited to what a
driver could actually steer.

And nothing avoided anything. Civilian cars lift off for the car in
front - only civilians, and only for cars going roughly the same way,
or a patrol queues politely behind a bus and never reaches the road it
was dispatched to, and two cars meeting on a single track each wait
forever for the other. Following distance does not cover a merge,
where two cars converge on a junction more than ninety degrees apart
right up until they both turn onto the same heading and are already
touching, so overlapping vehicles are pushed apart as well. A give-way
rule would also fix that, and can deadlock; a separation always
resolves.

Closest pair of same-direction cars over four minutes: 0.98m before,
4.3m after.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 08:15:13 +02:00
dejvino
6c1132b133 Parts become money, and the debug panel can hand you some
"0.34 parts" read as a fraction of something unnamed. It is a payment,
so it now looks like one: ¤34. The symbol is Unicode's generic currency
sign - it looks like money and is nobody's actual money, which is right
for a place whose banks are somebody else's problem.

The scale moves with it. FUNDS_PER_CONDITION fixes the exchange rate in
one place, so every balance number stays in the unit it is actually
about and how large the currency reads stays a presentational decision.
A supply run pays ¤34, an overhaul runs ¤200 to undo a crash's
permanent cost, and a full rebuild after a bad one is about a dozen
missions.

The debug panel gets ±¤ next to the existing condition levers, so the
workshop and the board can be exercised without first driving eight
missions to afford looking at them.

Save format bumped: quests.parts is now quests.funds.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 08:06:57 +02:00
dejvino
1019c3aec3 Walls that are actually there
Three separate holes, reported as one bug.

The building lookup grid under-registered. It stepped the world
coordinate by the cell size from x-reach to x+reach, but a building's
reach is about 7m and a cell is 24m, so the loop always took exactly
one step: every building registered one cell and silently vanished from
the other three it straddled. Points in those cells read as open
ground - bullets flew through the wall, line of sight saw through it,
and people stood inside it. Walk cell indices instead.

Nothing checked line of sight before pulling a trigger. Rounds always
died against the building; the decision to fire did not know the
building was there, so units emptied magazines into walls and what you
saw from the car was tracers coming out of solid concrete.

And every kind of free movement wrote straight into x and z, so
pedestrians, militia, fighters and fleeing civilians all walked through
walls. They now share the detour the hunters already used, and spawns
retry rather than dropping someone inside a building on the first
frame.

Six units in ninety were standing inside buildings. Now none are.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 08:02:08 +02:00
dejvino
563ee66dcd Hold on the wreck before moving the player
Cutting straight from the crash to a base three hundred metres away
read as a bug rather than as a death, and the one moment in a campaign
worth actually looking at was the one moment the player was not allowed
to see it.

The run now ends five seconds after the car does. Control goes; the
camera leaves the bumper and climbs away to sixty metres, turning
slowly, until the street, whatever was hit and whoever is standing
around watching are all in frame. The point of the shot is not the car
- by then the car is a fact - it is *where* this happened, which is the
thing you have to drive back out to.

The world keeps running underneath it. A death cam over a frozen world
is a screenshot, not a moment. What stops is the driver: no throttle,
no board, no overhaul, and no quietly finishing the job by virtue of
having stopped moving on top of the target.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 07:57:11 +02:00
dejvino
d9cdca70d5 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>
2026-08-09 07:52:27 +02:00
dejvino
764ea12a3f Make a serious crash nearly the end of the car
The first calibration left an 85 km/h head-on at 65% chassis and
perfectly driveable, which made hitting a building at ninety an
inconvenience rather than a disaster. The reference crash now lands the
chassis at 23%, the tyres at 61% and the engine at 75% - ordered by
what a collision actually ruins.

That makes one crash survivable and two in a row the end of the car,
which is the shape the risk wants: a mistake you drive home from, and a
second mistake you do not.

The per-step cap moves up with it. It exists for the pathological case
- a car wedged between two colliders reporting forces in the billions -
and once it sits below a bad head-on it stops being a backstop and
becomes the number deciding every impact.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 07:48:37 +02:00
dejvino
1a7a4776c1 Document the pass, and correct the notes it made stale
The README is this project's design document, so the reasoning behind
each change belongs in it rather than only in commit messages. Adds
sections on what a crash costs and why the coefficients are anchored to
a measured figure, killed in action, giving up a job, districts and
landmarks, militia, and how a hunter drives.

Also removes three notes that had gone stale - persistence not
existing, wear rates awaiting tuning, and the heat lines wanting to
come out of the HUD - and replaces the "take the debug lines out first"
instruction under Next with three Phase 9 gates, since all of those are
now done.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 07:32:12 +02:00
dejvino
6c7e67cf79 Put the scaffolding behind ?debug, where it cannot answer the question
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>
2026-08-09 07:29:50 +02:00
dejvino
baf534c4c4 Your own people, standing in your own streets
Liberated territory read as empty. No patrols by design, and nobody
else either - so the safest part of the map was also the deadest, and
coming home felt like arriving nowhere rather than arriving somewhere
held. It also left the palette doing all the work of telling the bands
apart, when the population is the more legible signal: who is standing
in the street tells you whose street it is.

Militia mirror AMBIENT_PATROLS the other way up - thick at home,
thinning fast, none past the contested band, because a friendly face on
the frontier would be a safety net the setting is not supposed to have.
Driving across the map now reads 14, 14, 11, 5, 0 against enemies 0, 0,
3, 4, 4.

They are placed by checking who holds the ground they would stand on
rather than the band the player is in - near a border those are
different answers - and they leave when the line moves over them, or
when the player has driven far enough that they are only ambience
following him about.

There is a quieter consequence. Pursuit already called a chase off when
a hunter had insurgents on its doorstep, so running for your own lines
now genuinely works. The rule existed; there was nobody around to
trigger it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 07:27:54 +02:00
dejvino
759399c53c Districts that look like places, and buildings worth steering by
Every building was the same grey box between four and twelve metres
tall. From the air the whole world was one texture; from the driver's
seat every junction looked like the junction before it, and "learn the
map" was not something the map supported.

The world is now cut into districts, and a district agrees with itself:
its buildings share a palette, a rough height and a silhouette and vary
only slightly around them. That agreement is the point - it is what
makes crossing into the next one a visible event, and it is the only
reason the exceptions read at all.

Because the occasional building ignores its district completely: much
taller, lighter, a different shape. Those are the things you actually
navigate by. They clear every ordinary roofline on the map, since a
landmark you cannot see from outside its own district is no use in the
only place you need it.

Colour rides on the instance rather than the material, so a district
costs no extra draw calls. Colliders stay boxes whatever the silhouette
says - both the physics and the line-of-sight grid already assume a
building is solid to its own footprint.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 07:23:58 +02:00
dejvino
3787350d4a A campaign starts knowing its own ground
The map was blank everywhere on a fresh start, including behind your
own lines, which read as amnesia rather than insurgency. You are a
local with a car: the pocket your side holds is the part of the map you
would obviously know, and the war is the part you would not.

It also fixes the board. offersAt splits its offers into targets you
have visited and targets you have not, and with nothing visited every
offer came up "new" - so the known-against-new comparison the whole
mission design turns on was not on screen until you had wandered around
for a while. The first board of a fresh campaign now reads: a known
target at 0.14 parts against new ones at 0.31 and 0.41.

Strictly bounded to liberated ground. Contested ground is not yours to
know, and none of this survives the line moving - the map still only
remembers who held a place when you last stood in it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 07:20:28 +02:00
dejvino
35f5b1c465 Hunters that can actually catch you
A patrol drove at 14 m/s whether it was on its rounds or chasing. A
healthy car does 29. Being hunted therefore meant holding W until the
95m sight radius did the rest: no cornering, no routing, no decision
anywhere in it.

Chasing cars wind up to 21 m/s, which sits deliberately between the
two - faster than anyone averages through a grid of junctions and
buildings, slower than the car's top end on a clear run. A long trunk
straight is an escape and the lanes are not, so the road hierarchy is
under real pressure for the first time: the fast conspicuous road is
the one you want when they are behind you, and it is the one they will
be looking on next time.

They also go round buildings now instead of through them. Line of
sight was already blocked by them and movement was not, which made
"break line of sight and change direction" advice the world did not
honour.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 07:18:39 +02:00
dejvino
9e476087d4 A way out of a mission that is not wiping the campaign
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>
2026-08-09 07:14:21 +02:00
dejvino
2e0373fb27 Killed in action: the decline finally has a floor
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>
2026-08-09 07:12:36 +02:00
dejvino
d19ce2821f Cut baseline wear to something the parts economy can pay for
Tyres shed 8e-5 per metre, so twelve kilometres of clean driving - no
crashes at all - took them from new to ruined. A two-kilometre round
trip paid ~0.3 parts against ~0.24 of condition spent: driving
perfectly barely broke even, and any knock put you permanently behind.
That is not a decision about how hard to push the car, it is a decline
with no way to arrest it.

At a quarter of the old rates the same trip spends about 0.06, so
roughly two clean runs pay for one bad crash. Enough slack to gamble
with, not enough to ignore.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 07:08:30 +02:00
dejvino
84ee726a51 Calibrate crash damage against forces Rapier actually reports
The impact coefficients in applyWear were written against an imagined
scale. Measured on the running game, a head-on into a building at
85 km/h comes back as a single contact event of ~2.5e6 N — 25 units of
"impact" against the old 1e5 reference. Through the old coefficients
that was 123% of the chassis and 37% of its ceiling, gone, in one hit,
in a game whose missions pay about 0.3 parts each. One crash ended the
campaign, and the campaign had no way to end.

Anchor the reference to the measured figure instead, and cap what any
single step can take: a crash is a pile of contacts across several
steps plus whatever the car scrapes on the way to a standstill, and
that sum has no natural bound.

The same 14-second flat-out run into a building now costs chassis
100 -> 65% and its ceiling 100 -> 89%. Expensive, survivable, and
still the worst thing that can happen to the car.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-09 07:07:32 +02:00
dejvino
d10033d79e Phase 8: recognition, pursuit, and losing them
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>
2026-08-08 12:20:47 +02:00
dejvino
5e557dc93a Patrols settle their district too, slowly, and a debug lever for condition
A patrol working a road now takes a little off the district around it as well,
at roughly a tenth of the rate it takes off the road. Deliberately feeble: any
faster and sitting still while patrols came and went would quietly launder your
reputation, and district heat exists precisely to be the part you cannot patrol
away. Passed as a position rather than a district id, so the unit sim still does
not need to know how areas are gridded.

Adds a debug panel under ?debug=1 with buttons to wear the car down or patch it
up. Driving a wrecked car is something you want to try while driving, not while
typing at a console. An earlier version of the console helper took an amount and
ignored it, which would have made it silently useless.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-08 12:11:53 +02:00
dejvino
9eaa05d7ef Districts that remember you, and roads worth staying on
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>
2026-08-08 12:06:59 +02:00
dejvino
9ae00dc978 Sharper steering, solid traffic, and a map that is mostly war
Steering. The falloff with speed was linear, so the car had already lost a third
of its lock by 20km/h — exactly the speed you take a right-angle junction at, on
a map made of right-angle junctions. It is quadratic now, which leaves low
speeds nearly untouched and still calms things down at pace, plus a faster rack
and a little more lock. Pinned with a test that drives an actual quarter turn and
measures its radius. A first attempt asserted that fast corners take longer,
which is simply false: a fast car swings through ninety degrees quicker, just
across far more tarmac. Radius is what a corner costs you.

Contact. Units were points that ignored everything, so there was nothing to hit.
Vehicles now carry kinematic bodies and ramming one is a real collision that
damages them and shoves you. People get no collider on purpose — a capsule means
snagging on pedestrians or launching them — so you drive through them and they go
down, and running over a civilian is counted for later.

Territory. Liberated ground covered more than half the map because the player
started in the middle of it, so most of the world was safe by geometry. The
starting base is now at the friendly edge and the bands are anchored to give
roughly 15/25/27/33 across liberated, contested, occupied and frontier. Measured
in the running game rather than guessed, since the axis runs diagonally across a
square and area is not linear in depth.

Also fixes a fragile test that compared reward rates across whichever targets a
board happened to offer, and so mostly measured route length rather than the
novelty premium it claimed to check.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 21:42:17 +02:00
dejvino
62c67ea649 Phase 7: sound, synthesised from the simulation
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>
2026-08-07 21:31:49 +02:00
dejvino
f4ed3cdc48 Patrols everywhere they should be, and concrete that has to be poured
Three fixes, all from watching it run.

Cars stuck against buildings. routeTo dropped the node a route starts from,
which is fine for a unit standing on it and wrong for anything re-routing from
mid-segment: its first leg became a straight line to a node two hops away,
across buildings and open country. Routes now include their start node so a unit
rejoins the road before setting off.

No patrols anywhere. They only existed as a reaction to the player's own tracks,
so hostile territory was empty until you had personally made a road notorious.
Enemy ground now carries standing patrols by how dangerous it is — none behind
your lines, five on the frontier — spawned onto their roads so the territory has
them the moment you arrive.

This surfaced a second bug: dispatched units were culled at 546m from the player
while dispatch origins reached 600m, so a patrol or engineer could be deleted on
its first step and simply never turn up. Anything with an assignment is now kept
regardless of range; its expiry still bounds it.

Barricades appearing instantly. Crossing a heat threshold placed concrete on the
road with nobody involved. Construction is now staged: an engineer is dispatched
for the barricade, another for the tower, and heatProps is driven by finished
builds rather than by heat levels. It still refuses to close a slab around a car
parked in the gap.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 21:14:19 +02:00
dejvino
4feae2c731 Phase 6: an inhabited world, and a war to drive through
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>
2026-08-07 15:49:11 +02:00
dejvino
405f1b0dfe Make the running game inspectable, and stop the beacons swallowing the view
The pane this build runs in does not composite, so requestAnimationFrame never
fires, the loop stalls, and nothing can be screenshotted from outside. Adds a
`?debug=1` handle that steps the simulation by hand and renders on demand, plus
a dev-only endpoint that takes a POSTed frame and writes it to shots/. Moving
the image as bytes rather than a pasted data URL matters: a truncated base64
string decodes to nothing.

Looking at the result immediately found a real problem. Base beacons were wide
translucent cylinders — legible from a distance, a solid green wall from inside,
and the car parks in the middle of one. Now a slim pillar plus a ring on the
ground that marks where to stop. Also raised the sky and fog brightness, which
was dark enough to read as night.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 15:38:27 +02:00
dejvino
06c7555188 Phase 5: four real jobs, radio, and work found in the field
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>
2026-08-07 13:35:37 +02:00
dejvino
90dc18fd17 Braking, stutter, a real road hierarchy, denser towns, and autosave
Braking. Rapier brake impulses were far too small next to a 1100kg chassis, so
the car would not come to a standstill. Raised, plus a coast brake so lifting
off actually slows you and a hold below walking pace so "stop the car" for a
mission is not a fight. First attempt overshot to 1.9g, which reads as hitting a
wall; tuned to about 0.8g, ~25m from 70km/h, and pinned with tests that assert
both an upper and a lower bound on stopping distance.

Stutter. The render drew the raw latest physics transform, so frames that
consumed two steps or none landed as visible jitter at speed. Now interpolated
between the last two steps by the leftover accumulator. Buildings moved into one
instanced draw call and the minimap dropped to 10Hz, both of which were wasted
work in a frame budget that also has to fit a shadow pass.

Roads. Three classes: single-track lanes, two-lane roads, four-lane trunks that
cross the whole map and are never thinned away. Class drives width, the route
corridor, barricade span, map line weight, surface colour, and two things that
matter more: routing is now by travel time so journeys prefer trunks, and
attention scales with class, so a farm track is slow and unwatched while a trunk
is fast and the first place anyone looks.

Towns. Buildings were small and sparse enough to drive around freely. They are
now laid out on a jittered lattice — rejection sampling cannot pack boxes and
saturated at a third of the target — which takes bypass lanes around a barricade
from 0% obstructed to about two thirds. World scaled to 400m half-extent, 81
junctions, 107 roads.

Autosave. Every 20 seconds, plus an immediate checkpoint on taking and
completing a job. Saves carry the subsystem ceilings, what the player knew
including the parts that are now wrong, and where the war had got to. A save is
validated against seed, format version and array lengths before anything is
applied: half-restoring a campaign is worse than starting a fresh one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 13:28:15 +02:00
dejvino
f5742de595 Phase 4: a front line that moves, and stops the map from telling you
The objective beacon now goes out once the cargo is dropped or the survey is
done. The target is no longer somewhere the player needs to be, and the bases'
own beacons take over for the trip home.

The front moves from two independent sources. Mission completions push it
forward, weighted by what the job was worth, and that contribution decays over
about seven minutes so ground won is not held for free. On top of that the line
drifts on its own in both directions, which the brief is explicit about: ambient
drift is what makes this a war rather than a level, and it is the only mechanism
for the enemy's attention being pulled elsewhere.

Drift is a sum of slow waves, not a random walk. A first attempt at a damped
walk moved 3m in four minutes, because white noise scaled by dt averages itself
out. Waves at incommensurate periods are unpredictable in practice, bounded by
construction, and reproducible from the seed, so a test can assert that a region
changed hands while the player was away. Most of the movement is shared across
boundaries, since a front advances as a whole; independent per-band waves were
squeezing bands into the ordering clamp.

Crucially the map no longer reads live state. Intel now records who held each
cell when the player last stood in it, and the minimap draws that, with the
border inferred from where remembered control changes rather than from the
front's true position. Otherwise the map would quietly hand the player a live
readout of a line that is supposed to move behind their back. Stale roads are
drawn faded, so untrustworthy notes look untrustworthy.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-07 11:42:34 +02:00
dejvino
477195a7d6 Phase 3: regional control, sketch minimap, and fix the base hut
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>
2026-08-07 10:23:23 +02:00
dejvino
73e8ac68f1 Phase 2: bases, quest board, and known-vs-new targets
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>
2026-08-07 10:06:32 +02:00
dejvino
475db8773c Heat: credit the verge to the road, and block the whole corridor
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>
2026-08-07 09:41:52 +02:00
dejvino
506d07be5d Phase 1: road network and heat
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>
2026-08-07 07:47:19 +02:00
dejvino
a66032674d Phase 0: drivable car with persistent wear
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>
2026-08-07 07:39:05 +02:00