Commit Graph
101 Commits
Author SHA1 Message Date
Hails df96ef46e2 Tools: move the non-audio helpers to their own PR (#37)
regression-checks, setup-equivalence, collision-inspect, world-stream-inspect, vault-inspect and recomp-code-search now live on tooling/published-tools (#37); the audio tools stay here. Index, doc 14 and the PR plan point there.
2026-10-03 20:29:52 -06:00
Hails 4c043959c0 Audio: optimisation pass 2 (allocation-free render, faster voices)
- AUDIO_TIMING logs voices / instances / grains per block (tools/audio-bench summary prints them).
- The render path is allocation-free in real play: subscriber lists and constructor lists read in place, call
  parameters on the stack, instance memory and client lists from pools (render allocations per block 0.17-0.63 ->
  <= 0.001; full world 1.825 -> 0.004); render_alloc tests cover walks, posts, calls, globals and a retail world host.
- Voices: direct PCM reads when a block provably stays inside the sample; shared scratch planes in the mixer
  (full world render p50 -11 to -14 %).
- MixMap keeps its held-input list between ticks; Jitter processes without a per-frame Vec.
- Every change byte-identical in all 84 e2e outputs; two attempted changes dropped (no real gain).
2026-10-03 20:19:23 -06:00
Hails 7f120de0b8 Audio: world / NPC sources complete, ped speech, specs published
- Ped speech plays: speech manager -> library -> the living world's two streams, with queue / interrupts and the
  near / far lines by distance; levels and filters from the retail mechanism (filters equal to the recomp's, gain
  median within 0.5 %). Silent and logged when the opt-in speech decode is absent.
- NPC skater: wheels and clothing on its own instance and a bail grunt; tricks, treatment and footsteps stay off for
  NPCs as in retail.
- Per-model ped data (shoe class, voice, far threshold) and traffic engine records per model exported by setup;
  traffic relative-speed input and front / rear sound points; world hosts process before the mixer tick.
- Test mod: opt-in (off by default), higher world-object limits (48 per mod, 128 total), a per-second summary log.
- Specs published in docs/hails-additions/audio-specs/; code comments point at them; test data paths behind env vars
  (no .local defaults).
2026-10-03 18:34:48 -06:00
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
Hails df012ec5dd Docs and tools: riding collision posts settled, couch testing, recomp bail / collision analysis
- tools/recomp-trace: bail_impacts.py (per-bail ragdoll impacts and sound posts) and collision_posts.py (collision-sound posts by poster and owner, with the local-rider flag); README entries.
- Doc 11: listening verdicts, the riding body-collision posts are NPC skaters' (local only on big-drop landings and bumps).
- Doc 13: playing the recomp from the couch and closing it (settings overlay, LB+RB+Back hold).
- Doc 14: the added tools.
2026-10-03 14:30:17 -06:00
Hails bebdf0cc9b Audio: bail speed curve, |Δv·n|, console-cadence posters, NPC grain bed
- Body region impacts are scaled by retail's centre-of-mass speed curve (x1 at rest up to x5 from ~0.95 m/s,
  read from the vault; no clamp after the multiply), so bails reach the tier-1 / tier-2 body and concrete hits.
  Setup exports the curve; older installs get the identical default. SKATE_AEMS_BODY_CURVE=0 = old.
- Region impacts take |Δv·n| as retail does (matches 12,054 of 12,054 recomp region lines).
- The body and deck posters' cooldowns count console frames (0.5 s / 0.2 s at any frame rate).
  SKATE_AEMS_BODY_CONSOLE=0 / SKATE_AEMS_DECK_CONSOLE=0 = old.
- Second grain bed for the NPC skater (retail's per-instance SkateBoard update; inert until the engine has
  NPC skaters). The local player's renders are byte-identical.
- The state log records the COM speed; the e2e harness replays it.
- Docs: doc 11 (bail density: the missing speed curve, not the ragdoll; the hooks' local test), PR plan,
  docs index; the published recomp trace reader knows the new line kinds.
2026-10-03 11:37:32 -06:00
Hails 418dcecd41 Audio: interim cue tables retired, native water splash, published tools
- The interim cue tables and their opt-outs are gone; the native runtime is the only audio path. Old
  settings/audio.json files still load ("interim" / "native" ignored). Missing native data logs an error
  instead of falling back.
- Water splash from retail's mechanism (SFXObj_OffBoard start / update): Skate_Collisions 1187 / 1197 once
  per water stay, 1198 when the board is in water.
- The random interim riding bed is removed; riding collision and cloth sounds compared with the recomp
  (doc 11). Native output otherwise byte-identical (13 scenarios + 5 sessions).
- Published tools under tools/ (one folder per tool with a README; the recomp ones labelled for use with the
  research hooks), doc 14 and PR plan bucket L.
- Docs: doc 11 (retirement, bail density measured against the recomp, collision posts), doc 13 (usage guide).
2026-10-03 10:20:08 -06:00
Hails a6d9512f99 Audio: native by default, console cadence, optimisations, review fixes, world foundations
- Native AEMS runtime is the default (`SKATE_AEMS=0` or `"interim": true` for the interim tables, kept).
- MixMap, eEQChain clear and Jitter on the console's 30 Hz cadence, frame-rate independent.
- Optimisation pass (render p50 210 -> 130 us, 0 allocations per block, byte-identical) and hardware FMA
  dispatch in the new skate-audio-fma crate (p50 -> ~55 us, byte-identical; skate-audio stays forbid(unsafe)).
- World emitter banks decoded ahead on a worker thread (no game-thread decode spikes).
- Session-review fixes: push sounds at the foot plant, push-foot plant/lift, bail body impacts, grind on/off.
- Foundations, inert until the engine has the systems: traffic and ped sounds, ped speech rules, NPC skaters'
  board sounds.
- Docs: doc 11 sections, doc 13 (the recompilation research hooks, reference only), PR plan.
2026-10-03 09:08:06 -06:00
Hails 2fcbcc3002 New audio who dis
Native port of Skate 3's retail audio runtime (AEMS) behind SKATE_AEMS=1, plus the world audio work:
- skate-audio crate: formats, patch-program evaluator, voice graph, mixer, MixMap, granular rolling bed and its
  bus chain, Splice contacts, the buses (env reverb network, eEQChain, flanger returns, collision and footstep
  submixes, reverb zones) and the player components (rolling layers, seams on the console's 30 fps cadence,
  grinds, skids, squeaks, tricks, treatment, footsteps, clothing, hands on deck, wind, wheels, collision manager).
- game_audio host: native runtime, player audio state from our physics, world emitters from the maps' .ems files,
  random distant one-shots, zone ambience, state log, e2e render harness, timing.
- Setup: audio export of the banks, grains, MixMap, vault tuning and reverb zones.
- skate-core: per-wheel / per-part audio surfaces and seam patterns (additive).
- Docs: docs/hails-additions/11-audio.md and the PR plan.
2026-10-02 22:58:17 -06:00
Hails 5e9e4dd784 Audio: retail world emitters from the maps' .ems files
Replaces our own water placement (water.rs: water collision grouped into
bodies, a random 1-2.5 s piece every 0.7-1.3 s that piled up 2-3 deep, which
the user heard as overlapping water at the University plaza).

Setup (audio manifest v4):
- audio_formats: .ems reader (72-byte records) and name_id, Bob Jenkins'
  lookup8 64-bit hash with the seed the sound ids use;
- audio_export: every .ems file with each sound's attributes from the disc's
  skatercollections emitter class 0xF0CEF367088EFFF8 (volume, bank, patch
  selector, volume type, falloff), resolved through parents; decodes every
  bank the sfx_*/skateschool emitters place (100 banks; all 486 sound
  emitters resolve to a bank on the disc).

Game (game_audio/emitters.rs, behaviour taken from TU3):
- sphere or ellipsoid (semi-axes = extents along forward/up/side), inner core
  at full level, level = volume x falloff ((1-d)^2, 1-d or flat);
- at most 5 emitters, in discovery order, released when the listener leaves;
- each water bank plays its program's measured pattern (two-voice relay of
  shuffled one-shots or one loop, with its level/pitch movement) until the
  AEMS evaluator is ported.

Verified muted in game: University plaza starts water_fountain and the
channel fountains_waterlaps_left; Aletown canal fountains_waterlaps_left.
2026-10-02 09:11:28 -06:00
Hails 818f109c27 Merge gameplay/water (synced with main 7ae67f2) into gameplay/audio 2026-10-02 08:16:27 -06:00
Hails 969485e5c5 Merge main (7ae67f2, synced with upstream) into gameplay/water
Brings in upstream #26 (indexed collection lookups, our PR E), #17, #18 and
upstream's own extract-xiso fix via our main. The two conflicts are the
extract-xiso call sites, where both sides made the same fix: take upstream's
lines (it also keeps the extract log outside the temporary directory).
2026-10-02 08:10:03 -06:00
Ethanw05 7ae67f269c fix: place extract-xiso options before ISO in core setup 2026-10-02 05:40:26 -06:00
Ethanw05 713fe70b61 fix: correct ISO extraction arguments and preserve failure log 2026-10-02 05:40:20 -06:00
Hails 32af010bce Docs and dev tooling: audio write-up, PR plan row J, audition page
- docs/hails-additions/11-audio.md (current design, formats incl. the
  SPLC patch tree, cue table, how it was tuned, prior work upstream
  #1/#4 and why their runtime is not adopted), README row 11,
  PULL-REQUESTS row J.
- tools/audio_audition.py: dev page to audition decoded samples (local
  .local/ output only).
- trace-downtown-lag.json: dev-only perf-trace output from TRACE_PLAY.bat
  (header only, no capture); committed because everything pending is
  committed, not needed by the build.
2026-10-01 17:38:06 -06:00
Hails 11ff8cd9c2 Setup: extract and decode the disc's game audio (new audio group)
- audio_formats.py: EA SNR (EA-XMA) stream scanner with block-chain
  validation, SPLC bank streams and patch tree (records, layers,
  containers; verified on all 20 banks), .grain files (speed-sweep
  recordings), loopable speed bands, gain-free 5->2 downmix.
- audio_export.py: decodes only what the engine plays (22 ambience
  beds, 14 grains x 6 speed bands, wheel spins, 23 sample banks) to
  PCM16 WAV in assets/private/audio with audio_manifest.json (v3,
  incl. SPLC patch trees). Decoder: pinned vgmstream r2117
  (SHA-256 checked) via the existing dependency() helper.
- Registered as optional asset group `audio` (versions, receipts,
  asset_exports, install); a failure records audio-availability.json
  and the game runs silent. Other groups' fingerprints unchanged.
- .gitignore: retail audio extensions and *.wav (Skyline mod WAVs
  excepted). Tests updated for the new group.
2026-10-01 17:37:30 -06:00
Hails 55776dc373 Water: shallow solid / deep floats, camera, splash, water look
- Water is solid only where geometry lies within 0.5 m under it; deep
  water makes no contacts and is detected from position (physics/water.rs).
  Body buoyancy only over deep water; the board floats with water drag.
  On-foot support follows the same rule.
- Water camera (high, behind, looking down) with an edge vignette through
  retail_exposure -> retail_tone, driven by the water bail state.
- Entry splash from the game's water particle sprite; setup extracts the
  particle sprites from miscboot.big (environment group, particles.py).
- Family 33 look matched to RPCS3 footage: 4x ripple scale, blurred and
  tinted reflection, anti-tiling with swells, calmer small bodies
  (water_bodies.rs areas), waves at 0.75x (FrameStateData.pca_slow).
- Ignored water_drop trace test; SKATE_VERIFY_AT for timed --verify
  captures.
2026-10-01 12:27:23 -06:00
Hails 01674566b6 Setup: fix ocean animation extraction during refresh
- --extract-ocean-pca runs before the crash supervisor, whose report
  window would block setup on a failed (non-zero) extraction
- ocean_pca.convert: install.spawn() pipes are text mode; reading them as
  bytes aborted the environment refresh
- test_ocean_pca runs convert through the real spawn() for success and
  failure

Verified: refresh rebuilt only the environment group (90 s) and wrote
assets/private/ocean-pca.json.
2026-10-01 02:39:47 -06:00
Hails b1d26230a8 Water rendering: extract the ocean animation table from default.xex
Water and ocean shaders need assets/private/ocean-pca.json, which setup
never created, so 52 water/ocean materials rendered static (or black).

- skate_data::xex: XEX2 unpacker (retail AES file key + CBC payload, LZX
  or basic decompression), no new dependencies
- skate_data::ocean_pca: locates cPCAWaterAnimationData's table in any
  build by its code addressing (disc build: 0x82FC3978; TU3: 0x830118D8)
- skate3rust --extract-ocean-pca <default.xex> <out.json>
- Setup environment group runs it (optional content); refreshes that group

In-play check of the rendered water still pending.
See docs/hails-additions/09-water.md.
2026-10-01 01:55:40 -06:00
Hails 8327e94090 Setup performance: skip duplicate stream copies, parallel customiser
- Skip decoding identical streamed asset copies (DownTown streams 107.8 -> 24.8 s)
- Run the character customiser beside the map stage (memory-gated)
- Build.ps1 builds the native RefPack DLL for dev checkouts
- Clothing library texture warm-up and pro roster run in worker processes
  (library 126.5 -> 51.2 s, roster 89.6 -> 15.9 s); shared caches are
  published first-writer-wins to avoid Windows rename races
- pipeline-equivalence.json: combined pairs (committed -> PR F+G)

Outputs proven identical (8,288 customiser files; all maps/spawns).
One-time customiser rebuild. See docs/hails-additions/08-setup-performance.md (PR G).
2026-10-01 00:13:55 -06:00
Hails 18f41a33c5 Tooling: streaming map validator (--validate-maps) wired into setup
One skate3rust process validates TEST_WORLD and every converted map over
stdin/stdout (SKATE_MAP_CHECK lines). Existing checks still fail a map;
new spawn-support / neutral-startup / invisible-collision checks report
warnings. Setup falls back to per-map --check-assets with an older exe.
See docs/hails-additions/06-map-validator.md (PR F).

Note: install.py also carries PR G's customiser-overlap hunks
(available_memory, overlap_customiser, Background); they are interleaved
with the validator wiring in _install and are documented in doc 08.
2026-10-01 00:13:53 -06:00
Hails b495ed696f Asset pipeline: bake authored map spawns and headings
Every map's startup position and default landing zone is its baked
spawn. The old rule (upward triangle nearest the origin) put the skater
over the void on MegaPark and on the roof of Industrial Skate Park and
StartPark, because park origins sit at a corner and retail floors are
sometimes wound downward.

New map_starts.py resolves each district's start from retail data: the
world row's start locator (parks), a chosen fe_locations row for
districts with several (University career start, Industrial Haystings
Park, DownTown Rosalita Skate Park, Maloof street), or the district's
only fe_locations row. Position and heading come from the district's
global_locators records; the heading is now written into the .skate
header. Districts without an authored start fall back to geometry:
compact parks use the new ground_spawn search, city-sized districts keep
the original rule (ground_spawn put Industrial under the streets).

See docs/hails-additions/04-map-spawns.md.
2026-09-30 19:26:57 -06:00
Hails 0a88f7a94e Setup: enable Windows long paths and relaunch when needed
Roster work paths under deep checkouts exceed MAX_PATH (260), leaving
pro skaters unavailable. If LongPathsEnabled is off, setup asks once for
elevation to enable it and relaunches itself, since Windows reads the
setting at process start. Declining keeps the previous behaviour.

See docs/hails-additions/02-long-paths.md.
2026-09-30 19:26:28 -06:00
Hails ea549ab042 Setup: pass extract-xiso options before the image path
extract-xiso stops parsing options at the first image path, so
`-x <iso> -d <dir>` extracted into the working directory and then failed
on "-d" as a second image (exit 1 -> "Conversion failed"). Use
`-x -d <dir> <iso>` in both call sites.

See docs/hails-additions/01-iso-extraction.md.
2026-09-30 19:26:12 -06:00
Ethanw05andCursor e2b85b6489 Fix remote player irradiance and retail renderer updates.
Apply probe SH to online customiser characters after remote bind, restore received sun shadows, and ship Skyline driving, fullscreen, and renderer improvements on the branch.

Co-authored-by: Cursor <[email protected]>
2026-09-12 20:05:27 -06:00
Ethanw05andCursor 9eaabf198e Fix updater branch status messages and Skyline remote VFX init.
Branch channel now reports already-current and missing-release cases clearly instead of a generic 404 error, and remote smoke/skids initialize without requiring local F10 spawn.

Co-authored-by: Cursor <[email protected]>
2026-09-12 01:30:05 -06:00
Ethanw05andCursor 3dd61acc62 Fix branch updater 401 by publishing public branch releases.
CI artifacts require GitHub auth, so skyline-driving-update now publishes downloadable release assets and the updater prefers those over Actions artifacts.

Co-authored-by: Cursor <[email protected]>
2026-09-12 00:48:04 -06:00
Ethanw05andCursor ec09165491 Add dynamic VFX mesh buffers, Skyline drift effects, and branch updater.
Expose append-only mesh buffers for mod skid/smoke rendering, sync rear-wheel VFX over multiplayer, rebuild Skyline audio assets, and let the updater install from any CI branch.

Co-authored-by: Cursor <[email protected]>
2026-09-12 00:40:57 -06:00
Ethanw05andCursor 821f523bb8 Fix MP air launch NaNs, solid modding, and Windows release packaging.
Sanitize non-finite SIMD lanes in offboard air selection, add solid dynamics and mod replication APIs, improve setup refresh without re-extracting assets, and harden Build-Release.ps1 for older PowerShell hosts.

Co-authored-by: Cursor <[email protected]>
2026-09-11 12:24:42 -06:00
Ethanw05 1399555ef2 Add Lua audio, dynamic vehicle cameras, dashboard, and Skyline updates 2026-09-11 04:41:47 -06:00
chazmm cb7968930f Rebuild raw asset caches cleanly during installation refresh 2026-09-10 03:42:03 +01:00
chazmm e23f7ba562 Normalize Windows path aliases when recording setup outputs 2026-09-10 02:45:27 +01:00
chazmm ea7b9a8218 Keep setup playable when optional disc content is missing 2026-09-10 02:36:05 +01:00
chazmm 5ac038df5d Handle missing optional character assets and shorten HUD extraction paths 2026-09-10 02:18:49 +01:00
chazmm 128b40d1e8 Fix default.xex refresh flow and cache verified character preparation stages 2026-09-10 01:24:11 +01:00
chazmm c8219a54cd Merge opt-in tracing and University performance improvements
# Conflicts:
#	Cargo.lock
#	crates/skate-game/Cargo.toml
#	crates/skate-game/src/retail_character.rs
2026-09-09 22:25:54 +01:00
chazmm fd3a549971 Fix importer package verification for manifest-based updates 2026-09-09 21:59:53 +01:00
chazmm b02ae97fde Isolate Windows test builds and verify dependency source provenance 2026-09-09 19:02:13 +01:00
chazmm 1a6e95b188 Merge complete character importer and customiser setup 2026-09-09 05:01:45 +01:00
chazmm 93b4a9ffd2 Make release updates manifest-driven with integrity repair and rollback 2026-09-09 04:36:00 +01:00
chazmm 3e3632e141 Update Steam relay alongside the game executable 2026-09-09 04:27:26 +01:00
chazmm f55c17dc4b Remove checkout dependency from packaged gesture menu preparation 2026-09-09 04:25:35 +01:00
chazmm 8d34dca161 Track shared character preparation dependencies in setup identity 2026-09-09 04:23:24 +01:00
chazmm 8bd052c4cc Prepare complete character content on first run and restore stock and clothing lighting 2026-09-09 04:19:07 +01:00
chazmm 72dfdfa9b2 Bundle character importer in versioned setup payload for complete releases and updates 2026-09-09 03:26:32 +01:00
chazmm a4a82f5705 Give each portable copy its own setup and refresh changed asset groups 2026-09-09 03:00:59 +01:00
chazmm 2a74581ac3 Fix release trace labels and bound high-frequency slice volume 2026-09-09 02:34:02 +01:00
chazmm 3ea9b4aa51 Publish rolling Experimental builds from main and support updater discovery 2026-09-09 02:15:53 +01:00
chazmm 6aa4762285 Speed up owned-disc setup while preserving runtime asset content 2026-09-09 01:52:25 +01:00
chazmm 3427261467 Keep original installer and add only automatic native HUD export 2026-09-09 01:23:31 +01:00