Dev tooling
Everything under tools/ is dev-only: it isn’t in release builds, and tools that drive the game need a dev build
(BLUR_DEV=ON) and a display. Debug environment variables are listed in
Debug and test flags.
| Path | What it does |
|---|---|
tools/recomp/ |
Ghidra discovery scripts, the P-code to C++ emitter, runtime headers (pipeline) |
tools/recomp/build/gen_tests.sh |
recompile our own guest test exes into the committed tests/recomp/gen.cpp |
tools/modes/mdrive.py |
boot the game and drive a mode from a plan in tools/modes/plans (virtual keyboard and XInput pads, screenshots) |
tools/host/race.sh |
drive the real game to a race with injected keys and dump backbuffers |
tools/host/hostprof.py |
resolve a BLUR_HOSTPROF profile dump against blurhost |
tools/host/gen_*.py |
generate host/D3D9 tables and status docs under docs/inventory |
tools/replay/ |
native replayer for apitrace D3D9 traces on d3d9metal (replay <trace> --bench --headless) |
tools/trace/ |
trace and shader-dump helpers for investigating the original game |
tools/trackcards/ |
extract race loading cards for Discord Rich Presence art |
tools/app/ |
app icon extraction and installer manifest generation |
tools/ci/ |
release build, signing, R2 storage and recomp-input scripts (CI and releases) |
tools/fj.sh |
Forgejo REST API wrapper used for the issue tracker |
Driving the game
Section titled “Driving the game”mdrive.py <plan> [out_dir] [max_seconds] matches screens against [lua] load <chunk> log lines (BLUR_LUA_DUMP) and
sends keys through BLUR_KEYFILE and pads through BLUR_PADFILE. Only one game can use the display at a time, so runs are
serialised.
Performance
Section titled “Performance”Measure fps with nothing else running. BLUR_FPS=1 logs presents per second and renderer stats; BLUR_HOSTPROF plus
hostprof.py shows where host time goes.
Race scenarios
Section titled “Race scenarios”Runnable race scenarios will live in scripts/. The directory doesn’t exist yet; they’re documented here once they do.