Files
skate-3-rust-engine/tools
Hails a4ec831a02 Audio: host clock on physics steps, review fixes, world / NPC audio hook-in
Review fixes:
- The audio host takes each physics step exactly once (one-step pulses latched, nothing while paused or silenced,
  at most 4 steps per frame), so pushes and other one-frame events are never dropped or doubled. e2e at 60 fps and
  above is byte-identical; 30 / 45 fps change only by the latch and the step pair.
- Removed the emitter PROFILES fallback, the stray trace dump and the audition script; data-gated tests are
  #[ignore = "needs the private install data"] and fail loudly when run without it; per-post log lines behind
  SKATE_AUDIO_TRACE; checked bank parsing, finite output, camera-cut Doppler reset, fewer render allocations.
- The 15 verdict-settled A/B switches are removed; their "on" behaviour is the only one (byte-identical).

World / NPC audio, hookable by engine systems and mods:
- Map-change fix: world and NPC hosts reset when the map's banks are unloaded, so surviving objects sound again.
- Engine surface (skate-game::world_audio): TrafficAudio / PedAudio / NpcSkaterAudio components, horn / alarm /
  speech messages, read-back of who is audible; retail limits (4 cars within 40 m, 15 peds within 50 m with
  footsteps for the nearest 3, one NPC skater within 30 m), measured in the recompilation.
- Mod surface (Lua API 2, `sdk.world_audio.*`); test mod `mods/world-audio-test/` (cars, peds, a ghost skater).
- Per-skater audio state builder (local player output identical); remote players take the NPC skater slot; an
  opt-in non-retail "more audible" setting.
- Docs: doc 15 "Hooking up world audio", doc 11 sections, PR plan.
2026-10-03 16:21:12 -06:00
..

Tools

The top-level scripts here are the repository's own tooling: setup and asset preparation (setup.py, prepare_assets.py, asset_pipeline/, owned_game/), the updater, release and build helpers, and their tests. They are documented where they are used (the main README and the scripts' own help).

The folders below are standalone helper tools for development and research. Each has a README.md with what it does, its inputs, usage, example output and requirements. They read your own copy of the game; none of them contain game code or data. Default work folders are under .local/ (gitignored).

Folder What it is for
regression-checks/ Map validation and collision counts, baked spawns, customiser outputs against your own baselines; a muted crash smoke test per map.
setup-equivalence/ Prove a faster setup path gives identical bytes (district stream loader, native RefPack DLL).
collision-inspect/ Extract a district's collision for analysis: triangles, surfaces at a point, surface ids and flags, surfaceless meshes.
world-stream-inspect/ List / extract .big archives; survey the RW4 arenas of the district simulation streams; dump named trigger volumes.
audio-file-inspect/ Readers for the audio formats: ABKC banks and MOIR projects, SPLC banks, .ems emitter files, .grain data; decode bank samples.
vault-inspect/ Look up fields in the attribute database (converted skater collections) and class layouts in the schema.
audio-e2e/ Scripted scenarios for the headless audio render and analysis of the renders (diffs, levels, voices, bus share).
audio-bench/ Audio performance: hashed e2e bench runs, timing summaries, emitter bank memory.
recomp-trace/ For use with the Skate 3 recomp's research hooks (research-hooks branch): read and analyse trace sessions. Reference only; you build the recomp and set up the paths yourself.
recomp-code-search/ For use with the Skate 3 recomp's research hooks (research-hooks branch): search the recompiled sources and the memory image. Reference only; you build the recomp and set up the paths yourself.

See docs/hails-additions/14-published-tools.md for the background.