Three new modes, all our own code: - Pursuit (Simpsons Hit & Run's meter): smashing in cruise fills heat, at full the police hunt you. Open 250 m for 6 s to escape, get pinned 4 s to be busted. Heat decays, so picking a fight is a choice not a timer. - Drag (NFSU2's): the gearbox IS the event. The builder finds each level's longest genuinely straight run of wide road (442-628 m across the five OSM levels) and drops DragStart/DragEnd, so no level needs hand-authored coords. - Derby: five opponents in the carpark, last one running. Reuses the pursuit AI, each hunting a different car so it's a brawl not a mob. Crash damage now shows: total control-point travel drives paint dulling, roughness and a scratch layer, so scuffs and crumple can never disagree. Junction generator fixes, all found by measurement rather than inspection: - streams[:6] truncated after street A's ways, so junctions where A yielded 3+ usable ways shipped with ZERO cross traffic. Interleaved before capping; every event now has 2-4 crossing streams. - RADIUS 170 -> 95 spread the convoy over a 340 m window, so you threaded the intersection through a 20 m gap. Margaret x Edward was unwinnable: 27 convoy cars alive, zero collisions, $0. - Launch points now walk the street to exactly SPAWN_DIST and pick the busiest shared node, and _clear_spawn() unblocks a buried start. Albert x Adelaide went from $0 (drove 1 m into a building) to $91k. - build_all_junctions.sh records the street pairs, which existed nowhere before. Fixes from an adversarial review (23 confirmed findings), the worst being: - Derby could only ever be LOST: wrecked opponents un-wrecked 2.2 s later via Car._recover, so "last one running" was unreachable and the kill bounty could be farmed to the boost cap off one revived car. They now hold their wreck. - Drag reported WON to a beaten player: the AI's lookahead wrapped on a 2-point path, U-turning before the line so its distance-to-finish grew again. - The scratch layer used BLEND_MODE_MIX, whose mask defaults to white -- it replaced the paint entirely rather than scuffing it. Now MUL. - Drag on a level with no strip left the car at the origin, half-buried, unable to end. Cop spawns used an unflattened basis. Stale "WANTED" HUD text. Test harness: smoke covers all seven modes, and failures now exit instead of hanging -- a failed assert in a headless SceneTree halts the script but leaves the tree spinning, which cost 53 minutes of wall clock to notice. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
346 lines
5.2 KiB
JSON
346 lines
5.2 KiB
JSON
[
|
|
{
|
|
"name": "Melbourne x Merivale",
|
|
"spawn": {
|
|
"x": -598.2786454342968,
|
|
"z": -212.65545062278278,
|
|
"dx": 0.8528773292725991,
|
|
"dz": -0.5221113494388324
|
|
},
|
|
"streams": [
|
|
{
|
|
"pts": [
|
|
[
|
|
-522.2431469994345,
|
|
-263.2916099068527
|
|
],
|
|
[
|
|
-513.2984743659174,
|
|
-268.5646201058227
|
|
],
|
|
[
|
|
-505.76645618454586,
|
|
-272.8477143314658
|
|
],
|
|
[
|
|
-497.90899041561073,
|
|
-277.2629244179048
|
|
]
|
|
],
|
|
"speed": 12.0,
|
|
"interval": 1.5
|
|
},
|
|
{
|
|
"pts": [
|
|
[
|
|
-518.3319604245614,
|
|
-316.20816625786284
|
|
],
|
|
[
|
|
-502.53998920863535,
|
|
-289.11772214349674
|
|
],
|
|
[
|
|
-501.0310720126822,
|
|
-286.5339989119062
|
|
],
|
|
[
|
|
-499.3074920997309,
|
|
-283.76972490400925
|
|
],
|
|
[
|
|
-498.93054530357944,
|
|
-283.2413778417831
|
|
],
|
|
[
|
|
-494.34501447411924,
|
|
-276.414559193545
|
|
]
|
|
],
|
|
"speed": 12.0,
|
|
"interval": 1.5
|
|
},
|
|
{
|
|
"pts": [
|
|
[
|
|
-495.26368453007734,
|
|
-272.55523318206934
|
|
],
|
|
[
|
|
-503.1094123444767,
|
|
-268.14663806831595
|
|
],
|
|
[
|
|
-510.58925218160783,
|
|
-263.8934194939837
|
|
],
|
|
[
|
|
-519.5007896114952,
|
|
-258.6397848932893
|
|
]
|
|
],
|
|
"speed": 11.0,
|
|
"interval": 1.8
|
|
},
|
|
{
|
|
"pts": [
|
|
[
|
|
-498.82766047156883,
|
|
-273.4035984064291
|
|
],
|
|
[
|
|
-503.4072640108861,
|
|
-280.2216113581537
|
|
],
|
|
[
|
|
-503.85991989590116,
|
|
-280.8653486954825
|
|
],
|
|
[
|
|
-505.6522751490968,
|
|
-283.7403486882755
|
|
],
|
|
[
|
|
-507.20498688872703,
|
|
-286.3978330566516
|
|
],
|
|
[
|
|
-522.997174842978,
|
|
-313.4886489421985
|
|
]
|
|
],
|
|
"speed": 11.0,
|
|
"interval": 1.8
|
|
},
|
|
{
|
|
"pts": [
|
|
[
|
|
-497.7097209821479,
|
|
-277.3642792991366
|
|
],
|
|
[
|
|
-489.2653413897242,
|
|
-281.21700470668776
|
|
],
|
|
[
|
|
-470.16395422466655,
|
|
-292.9741741951012
|
|
],
|
|
[
|
|
-453.3973200149641,
|
|
-303.3696498434199
|
|
],
|
|
[
|
|
-438.7171383481014,
|
|
-313.0237718470059
|
|
],
|
|
[
|
|
-428.17568968279613,
|
|
-319.6952218182481
|
|
]
|
|
],
|
|
"speed": 12.0,
|
|
"interval": 1.5
|
|
},
|
|
{
|
|
"pts": [
|
|
[
|
|
-490.9127030755138,
|
|
-271.2416907037699
|
|
],
|
|
[
|
|
-487.07948135301893,
|
|
-265.2321814476218
|
|
],
|
|
[
|
|
-460.79611403958603,
|
|
-221.7057389459239
|
|
],
|
|
[
|
|
-449.78766148749827,
|
|
-203.62165684766288
|
|
]
|
|
],
|
|
"speed": 12.0,
|
|
"interval": 1.5
|
|
}
|
|
],
|
|
"targets": [
|
|
15000,
|
|
35000,
|
|
60000
|
|
]
|
|
},
|
|
{
|
|
"name": "Grey x Glenelg",
|
|
"spawn": {
|
|
"x": -135.06485953132193,
|
|
"z": -97.50127625771249,
|
|
"dx": 0.5279471843098005,
|
|
"dz": 0.8492772047920241
|
|
},
|
|
"streams": [
|
|
{
|
|
"pts": [
|
|
[
|
|
-66.8941396578206,
|
|
18.021454924938546
|
|
],
|
|
[
|
|
-68.93721227192415,
|
|
14.729250272207434
|
|
],
|
|
[
|
|
-74.03417645108553,
|
|
5.788135121643277
|
|
],
|
|
[
|
|
-78.66584427851572,
|
|
-1.692678191469608
|
|
],
|
|
[
|
|
-82.82069253186671,
|
|
-8.344352365976752
|
|
]
|
|
],
|
|
"speed": 12.0,
|
|
"interval": 1.5
|
|
},
|
|
{
|
|
"pts": [
|
|
[
|
|
-33.05020815528413,
|
|
-14.758620186231095
|
|
],
|
|
[
|
|
-35.06751528318885,
|
|
-14.599409411489315
|
|
],
|
|
[
|
|
-37.27001626186296,
|
|
-13.996146050544787
|
|
],
|
|
[
|
|
-43.35852481930847,
|
|
-10.760668273887504
|
|
],
|
|
[
|
|
-53.694918113870564,
|
|
-4.204520462618362
|
|
],
|
|
[
|
|
-56.331462588402815,
|
|
-2.4702458690280507
|
|
],
|
|
[
|
|
-63.091151948462084,
|
|
2.2185465904455017
|
|
]
|
|
],
|
|
"speed": 12.0,
|
|
"interval": 1.5
|
|
},
|
|
{
|
|
"pts": [
|
|
[
|
|
-78.24074203456223,
|
|
-11.205130833848836
|
|
],
|
|
[
|
|
-74.07981104388904,
|
|
-4.543695408341438
|
|
],
|
|
[
|
|
-69.38832494823436,
|
|
3.0356700785490762
|
|
],
|
|
[
|
|
-64.27327518677029,
|
|
12.007542928328153
|
|
],
|
|
[
|
|
-62.30660151137585,
|
|
15.172859875635417
|
|
]
|
|
],
|
|
"speed": 11.0,
|
|
"interval": 1.8
|
|
},
|
|
{
|
|
"pts": [
|
|
[
|
|
-66.1688465571084,
|
|
-2.2185465904455017
|
|
],
|
|
[
|
|
-59.37835881390333,
|
|
-6.9285441308125515
|
|
],
|
|
[
|
|
-56.602733425687326,
|
|
-8.754752337189586
|
|
],
|
|
[
|
|
-46.12004993919494,
|
|
-15.401140126214159
|
|
],
|
|
[
|
|
-39.50773651812935,
|
|
-18.910676349026538
|
|
],
|
|
[
|
|
-36.1005431869604,
|
|
-19.899678588618844
|
|
],
|
|
[
|
|
-33.51553068408273,
|
|
-20.138534213814854
|
|
]
|
|
],
|
|
"speed": 11.0,
|
|
"interval": 1.8
|
|
},
|
|
{
|
|
"pts": [
|
|
[
|
|
-62.42866919418658,
|
|
-1.5633764655737972
|
|
],
|
|
[
|
|
-56.22534149367183,
|
|
7.176315693408943
|
|
],
|
|
[
|
|
-31.608294574960304,
|
|
46.399012606383145
|
|
]
|
|
],
|
|
"speed": 12.0,
|
|
"interval": 1.5
|
|
},
|
|
{
|
|
"pts": [
|
|
[
|
|
-105.44415325837058,
|
|
17.29338138921854
|
|
],
|
|
[
|
|
-124.85549758561747,
|
|
29.02803771609806
|
|
],
|
|
[
|
|
-145.9651989732041,
|
|
41.680234308480806
|
|
]
|
|
],
|
|
"speed": 12.0,
|
|
"interval": 1.5
|
|
}
|
|
],
|
|
"targets": [
|
|
15000,
|
|
35000,
|
|
60000
|
|
]
|
|
}
|
|
] |