tools/build_level_osm.py extrudes OSM buildings (-col), lays road strips, Spawn + RacePath empties; osm_level_args.py computes a building-clear spawn on a named way and race-loop corners from street intersection nodes. game.gd builds Path3D from GLB RacePath empties, sanitizes spawn bases, and places bodies BEFORE add_child. Three real bugs fixed: mall canopies (building=roof) extruded as solid blocks, underground busways rendered at surface, and the km-wide ground trimesh breaking suspension raycasts (now -convcol). Cars get continuous_cd for thin building shells. tests/probe.gd is the physics raycast debugger that found it. Data (c) OpenStreetMap contributors, ODbL. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
98 lines
3.9 KiB
Markdown
98 lines
3.9 KiB
Markdown
# 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.
|
|
- **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/<id>/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 -- "<file>" <car_id> <length_m> [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=<minlon>,<minlat>,<maxlon>,<maxlat>' -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 "<spawn way name>" "<loop street 1,2,3,4>")
|
|
Blender -b -P tools/build_level_osm.py -- area.json <level_id> <origin_lat> <origin_lon> $ARGS
|
|
```
|
|
|
|
Don't reconstruct from Street View imagery (ToS + melted collision). Use photos as
|
|
reference to hand-detail hero landmarks on the OSM base.
|
|
|
|
## Add a level
|
|
|
|
Make a folder `levels/<id>/` 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/<id>/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.
|