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>
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>