# Burnout Infinity: Shitbox Burnout 3-style arcade racer, Aussie shitboxes, Woolies carparks. Godot 4.6 + Blender, native Apple Silicon. ## Run ``` /Applications/Godot.app/Contents/MacOS/Godot --path . ``` Controls: WASD/arrows drive, Shift drift, Space boost, R reset (or retry after Crash Mode), Esc menu. ## Modes - **Cruise** — free roam with traffic. - **Crash Mode** — 60 seconds, rack up damage dollars ramming traffic and parked cars. - **Crash Junctions** — pick a "CRASH JCT" entry in the level list: launch into scripted cross-traffic convoys at a real intersection, then Aftertouch-steer your wreck (arrows) and detonate the Crashbreaker (space). Damage tally + bronze/silver/gold. Events live in `levels//junctions.json`; generate more from real intersections with `tools/osm_junction.py "Name|Street A|Street B"`. - **Race** — 3 laps vs 3 rubber-banded rivals on the level's `RacePath`. The boost loop is Burnout 3's: earn boost by drifting, near-missing traffic, and smashing things. Wrecking a rival near you = TAKEDOWN — refills the meter and grows it (up to 4x). Hard crashes shed body panels and trigger Impact Time slow-mo. ## Cars A car is a folder: `cars//stats.tres` + optional `car.glb`. Models are built procedurally — specs live in [tools/build_cars.py](tools/build_cars.py), one dict per car (silhouette profile, dimensions, paint). Rebuild all GLBs with: ``` /Applications/Blender.app/Contents/MacOS/Blender -b -P tools/build_cars.py ``` Model convention (any GLB works, hand-modelled or generated): - Nose faces **+Y** in Blender (imports as Godot -Z forward). - Node origin 0.75 m above ground level (the controller's ride height). - Objects named `det_*` are detachable — the game rips them off on impact (doors, mirrors, bumpers, bonnet, boot). - Current fleet: Datto 120Y, Gemmy TX, Kingswood HQ, VL Terbo, XF Fungoon, Excel Hilton. Piss-take names on purpose: real model names and badges are trademarks. To improve a silhouette: supply a side-on photo + front three-quarter photo, tweak the profile points in the spec, rebuild, screenshot. **Stats are low-key reversed**: the shitboxier the car was in real life, the better it performs here. The Excel X3 is the fastest car in the game; the muscle cars are all bark. Downloaded models (from `shitboxes/`, gitignored + .gdignore'd) convert via: ``` /Applications/Blender.app/Contents/MacOS/Blender -b -P tools/import_shitbox.py -- "" [yaw_deg] ``` Imported cars don't shed det_* panels until someone cuts their doors out in Blender. ## Real-world levels from OpenStreetMap Real street grids, our art style, clean collision, ODbL-licensed. Fetch a bbox from the OSM API, convert, build (queen_st_mall was made exactly like this): ``` curl -A 'BurnoutShitbox/1.0' 'https://api.openstreetmap.org/api/0.6/map?bbox=,,,' -o area.xml python3 tools/osm_xml_to_json.py area.xml area.json # see git history / osm_level_args.py ARGS=$(python3 tools/osm_level_args.py area.json "" "") Blender -b -P tools/build_level_osm.py -- area.json $ARGS ``` Don't reconstruct from Street View imagery (ToS + melted collision). Use photos as reference to hand-detail hero landmarks on the OSM base. Levels so far: woolies_carpark, queen_st_mall, southbank, albert_parklands, story_bridge (procedural steel truss along Bradfield Highway), kangaroo_point. Textures in assets/textures/ are FLUX-generated (Cloudflare Workers AI) -- regenerate or add with tools/flux_texture.sh "" assets/textures/.jpg (creds read from .env, never printed). The builder box-projects UVs; facades pick glass/brick/concrete/heritage by height and id hash. ## Add a level Make a folder `levels//` containing `level.glb` (or `level.tscn`). Blender convention: - Solid objects: suffix the name with `-col` (Godot generates collision on import). - An Empty named `Spawn` where the car starts. - A curve/path named `RacePath` (loop) enables Race mode and traffic. - Export glTF Binary to `levels//level.glb`. It appears in the menu. ## Tests ``` /Applications/Godot.app/Contents/MacOS/Godot --headless --path . --import /Applications/Godot.app/Contents/MacOS/Godot --headless --path . --script tests/smoke.gd ``` Visual check (opens a window, saves a PNG): ``` /Applications/Godot.app/Contents/MacOS/Godot --path . --script tests/screenshot.gd -- car=datto_120y mode=crash frames=280 out=shot.png ``` ## Design doc `docs/BurnoutInfinityShitbox.pdf` — research report on the original game. Still to come: crash deformation (control-hull vertex displacement, equations in the PDF), oncoming-lane boost, Road Rage mode, sound, real level GLBs from Blender.