ShitboxInfinity/levels/queen_st_mall/junctions.json
m3ultra 0c13c82eac Pursuit, drag and derby modes; crash-damage paint; junction fixes
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>
2026-07-28 23:07:41 +10:00

398 lines
6.0 KiB
JSON

[
{
"name": "Albert x Adelaide",
"spawn": {
"x": 18.671705882497893,
"z": -22.919507778110138,
"dx": -0.6633868531476461,
"dz": -0.7482766086621067
},
"streams": [
{
"pts": [
[
-58.84614846630014,
-114.42417420924829
],
[
-53.880474905008,
-108.39185473942744
],
[
-51.24051503498836,
-105.52578654474546
],
[
-20.352984240690695,
-70.76962163514554
]
],
"speed": 12.0,
"interval": 1.5
},
{
"pts": [
[
-86.70325250389301,
-94.08771386994844
],
[
-77.60701968874399,
-101.92094169090129
],
[
-72.06522503228508,
-106.94786296530025
],
[
-68.79209061830386,
-109.50838129624599
],
[
-62.692661313561906,
-114.75385541597699
],
[
-56.45081914916183,
-120.13849830634709
],
[
-53.14418135326541,
-122.9809049049611
],
[
-38.75486932340002,
-135.5677577748611
],
[
-8.138880164463979,
-163.05430391717795
],
[
7.537426213222782,
-176.88629254786764
]
],
"speed": 12.0,
"interval": 1.5
},
{
"pts": [
[
-24.38938905950134,
-67.18250076477023
],
[
-55.272013374374126,
-101.93315225504524
],
[
-57.98533525129133,
-104.88327646076375
],
[
-63.01508813331892,
-110.99198219061685
]
],
"speed": 11.0,
"interval": 1.8
},
{
"pts": [
[
11.110167779562063,
-172.83715465195058
],
[
-4.543064055336218,
-159.02564328250827
],
[
-35.16387720923361,
-131.5347966250365
],
[
-49.59536988091847,
-118.91077749494814
],
[
-52.92601130212681,
-116.04756569366813
],
[
-59.168575286057155,
-110.66230098388816
],
[
-65.33626025215173,
-105.35901550369637
],
[
-68.5423745958537,
-102.85524463438601
],
[
-74.0429581637501,
-97.86416150877923
],
[
-83.17948939242227,
-89.9958813300908
]
],
"speed": 11.0,
"interval": 1.8
},
{
"pts": [
[
-63.049013950748005,
-111.03404120330288
],
[
-67.67311197746825,
-116.88556835863362
],
[
-69.33640432781439,
-119.01651536179543
],
[
-72.74965354025018,
-122.55658461736515
],
[
-98.24408864239251,
-142.51997682349207
],
[
-106.03262882232805,
-149.46281622691504
],
[
-127.2548410984026,
-167.5083127878196
]
],
"speed": 12.0,
"interval": 1.5
},
{
"pts": [
[
-123.7567869560363,
-171.62214521234466
],
[
-102.50831375382124,
-153.55417337313145
],
[
-94.84937670776534,
-146.71949237661244
],
[
-69.3394816295263,
-126.74355578269574
],
[
-65.32529933336386,
-122.63190423762802
],
[
-63.432906391639634,
-120.22931724123647
],
[
-58.81222264887106,
-114.38211519656227
]
],
"speed": 11.0,
"interval": 1.8
}
],
"targets": [
15000,
35000,
60000
]
},
{
"name": "Edward x Elizabeth",
"spawn": {
"x": 173.87950117253465,
"z": -177.50987452854054,
"dx": 0.688388502507091,
"dz": 0.7253421741606128
},
"streams": [
{
"pts": [
[
228.7426016851313,
-123.80938841141814
],
[
250.48785179439338,
-101.12418691157934
],
[
253.19184475779528,
-98.13216139604938
],
[
258.48528328991137,
-92.28343983096748
]
],
"speed": 12.0,
"interval": 1.5
},
{
"pts": [
[
184.8196819904455,
-31.59973983603264
],
[
200.9901724381037,
-45.56696118289086
],
[
206.29822476676847,
-50.115127103271014
],
[
208.01277161716473,
-51.59585061763732
],
[
243.56749157860247,
-82.55471207644285
],
[
246.1313684904348,
-84.84463727526342
],
[
254.68470539632878,
-92.48524564052305
]
],
"speed": 12.0,
"interval": 1.5
},
{
"pts": [
[
254.4815819963581,
-88.65985376851496
],
[
249.1869798707451,
-94.50986140343801
],
[
246.5771986992584,
-97.40037268829819
],
[
224.8443191668579,
-120.07262598818004
]
],
"speed": 11.0,
"interval": 1.8
},
{
"pts": [
[
258.28215988994066,
-88.4580479589594
],
[
249.72869976275985,
-80.81732952477397
],
[
247.11707918748664,
-78.48526152300741
],
[
211.55809324014456,
-47.52268298180012
],
[
209.81572383420533,
-46.017908496633005
],
[
204.51598169911696,
-41.47689161686228
],
[
188.34948976520272,
-27.51312056415722
]
],
"speed": 11.0,
"interval": 1.8
},
{
"pts": [
[
258.4805413787254,
-92.28866542876725
],
[
262.2737122591504,
-88.11954201221562
],
[
266.8273793037693,
-83.1100839184909
],
[
270.87333374760516,
-78.65784777138674
],
[
298.08928934155523,
-47.30427629341134
]
],
"speed": 12.0,
"interval": 1.5
},
{
"pts": [
[
254.70925209424783,
-92.50690682734246
],
[
259.70303711688206,
-96.8600914480509
],
[
263.66545095997486,
-100.3447248693
],
[
288.61557906385735,
-122.1176793727558
]
],
"speed": 12.0,
"interval": 1.5
}
],
"targets": [
15000,
35000,
60000
]
}
]