44 Commits
Author SHA1 Message Date
Hails e725d3cc2b Merge branch 'audio/moddability-2' into audio/world-followups
# Conflicts:
#	crates/skate-audio/src/world/mod.rs
#	crates/skate-game/src/game_audio/mod.rs
#	crates/skate-game/src/modding/world_audio.rs
#	crates/skate-mods/src/vm.rs
#	crates/skate-mods/src/world_audio.rs
#	mods/world-audio-test/main.lua
#	sdk/skate.lua
2026-10-04 22:42:45 -06:00
Hails 378ce835bf Dev test mod: a different sound per autotest step, a compact top-left HUD
The audible autotest used one beep for eight steps, so steps couldn't be told apart.
Each step now has its own self-made sound (synthesize.py): bell (map Baby_Cry_1), chime
(F6 post, Buoy_Bell patch 88), wood block (F8), triangle (F10), low horn (F11 landing),
click (pop rule), whistle (Digit5), shaker (Digit6), boing (honk rule). HUD: one compact
box top-left, every line fits one row, live countdown; camera return after step 3.
2026-10-04 17:47:01 -06:00
Hails d8794cbc1f Audio: the parked car alarm trigger (retail's StayingParked rule)
- Retail (the recomp, reference only): the vehicle collision callback sets the alarm only
  while the car is parked (StayingParked) and the contact vector exceeds 0.1
  (livingworld vehicle characteristics); any collider; every contact restarts the alarm and
  parked timers; StopAlarming after 8 s; no pull-out while alarming; no impact sound.
- Engine: VehicleParked, VehicleImpact { vehicle, by, impact }, CarAlarmRule
  (AlarmTuning from the setup export world_tuning.vehicle_alarm), VehicleAlarmStarted;
  the alarm holds horn state 6 for whole console frames past the time.
- Mods: world_audio event 'impact', traffic option parked, sdk.world_audio.alarm_rule,
  read(key).alarm. The world-audio test mod's parked taxi alarms on contact.
- No-mod e2e bench byte-identical (84 / 84); tests; doc 15, traffic spec.
2026-10-04 17:29:05 -06:00
Hails 3bd9b2c8d6 Dev test mod: Digit3 taxis on separate rings (no six-car beating)
Six identical taxis at one rpm and level, each detuned once by C04's own Random op,
beat at 4-8 Hz (the "lawn mower" heard in the audible autotest). Each taxi now drives its
own ring (radius 3+3i m, 2+2i m/s), headless engine-band modulation at single-taxi level.
2026-10-04 16:49:10 -06:00
Hails c4c98243e1 Dev test mod: autotest mode (timed steps, read-back checks, audible / muted HUD)
mods/audio-content-test runs every action on a timer once the map's native audio runs
(settings autotest, autotest_step, autotest_gap, autotest_muted) and logs one
AUTOTEST <check> ok|fail line per read-back check; one bottom-left HUD box with the step,
what to listen for and a red MUTED TEST header on muted runs. Doc 16 M8b.
2026-10-04 16:36:37 -06:00
Hails fda3382e9e Audio modding 2: mod cars and peds get their own MixMap instance by default
- sdk.world_audio.spawn(key, 'traffic'|'ped', ...) without slots gets its own instance on
  the private MixMap, as mod emitters do; slots = 'shared' (alias 'retail') opts into
  retail's pools. Capability world_audio 4. Engine-published objects are unchanged.
- Full private pool (16 cars + 16 peds, all mods): the nearest play, the rest in reach wait
  silently; never refused, never in retail's pools. read(key).waiting / .slots,
  info().own, a one-time log line.
- Dev mods: audio-content-test uses the default; world-audio-test asks for 'shared'
  (retail's limits) with an "Own instances" setting.
- No mod active: e2e bench byte-identical (84 / 84); suites pass (known failures only).
2026-10-04 15:15:18 -06:00
Hails 39debf506d Audio modding 2: hot swap, hot reload, MixMap inputs, own instances, Csis projects, seed
Completes the "Later" list (doc 16 section M):
- Hot swap: an audio mod turning on / off is swapped into the running audio in place.
  Banks keep their runtime id and constructor order, held posts are re-bound with their
  payload; Splice trees, wheel streams, projects, tuning and speech swap too. Only a
  MixMap or grain-bed change (or a swap error) still restarts the sound.
  sdk.audio.info().swaps / last_change.
- Hot reload: editing audio.json or the files it names swaps the overlay while the
  script keeps running.
- MixMap inputs: sdk.audio.set_mixmap_input / mixmap_inputs drive retail's own
  controllers (validated, owned, 16 per mod / 64 total, released values restored).
- Own instances: world_audio spawn {slots='own'} plays mod cars / peds on a private
  MixMap (16 + 16), retail pools untouched.
- Csis projects: audio.json add.projects ships a mod's own classes, functions and
  globals; name clashes are refused; installed / removed without a restart.
- Seed: sdk.audio.seed / SKATE_AUDIO_SEED seeds all audio generators.
- Rules: play.frame = 'owner' puts offsets in the owner's axes; rule sounds follow
  moving published emitters.
- Capabilities: audio 4, audio_content 3, audio_events 3, world_audio 3.
- Dev test mod: Digit1-6, a second HUD line, its own self-made dev.csi.
- No mod active: e2e bench byte-identical 84 / 84 after every step.
2026-10-04 14:38:56 -06:00
Hails b321f77799 Audio modding 2: the decided defaults (own emitter slots, native routing, positional rules)
- Mod emitters get their own instances by default (ModEmitterSlots::Extra); "shared" stays
  selectable, SKATE_AUDIO_MOD_EMITTER_SLOTS overrides either way.
- Mod WAVs route through the native mixer by default when the native audio runs and a voice
  is free, else the Bevy path; native = true / false forces one. Positional native sounds
  default to a 40 m squared reach.
- Replace / layer rule sounds are positional: `at` = owner (default, followed each frame,
  optional offset), world (fixed position) or centre; optional falloff; default reach is the
  owner's retail one (emitter record, cars 40 m, peds 50 m, skaters 30 m).
- Dev test mod, Skyline and audio-example use the defaults; SDK docs and doc 16 updated
  (section L questions written as decisions).
- No mod active: e2e bench byte-identical, 84 / 84; new tests for each default.
2026-10-04 11:21:27 -06:00
Hails b1af7ab819 Merge branch 'audio/moddability' into audio/moddability-2
# Conflicts:
#	docs/hails-additions/16-audio-modding.md
#	mods/audio-content-test/mod.json
2026-10-04 10:13:18 -06:00
Hails fc38e09039 Audio modding 2: native mod voices, live tuning, mod emitters and zones, sound rules
- Mod WAVs can play through the game's own mixer (per-mod mixer banks, retail emitter
  words, a private MixMap), beside the existing Bevy path (mod_voices.rs).
- Tuning can change while the game runs: sdk.audio.set_tuning / tuning / tuned, applied
  between passes, exact restore on nil or mod disable (tuning.rs, audio_tuning.rs).
- Mods add world emitters and reverb zones through the published WorldEmitter /
  ReverbZoneVolume components (world_audio kinds).
- Sound rules: mods mute, replace or layer the game's own sounds by identity, from
  audio.json `rules` or sdk.audio.rule (mod_rules.rs, audio_rules.rs); empty or
  rules-only overlays no longer restart the sound.
- Capabilities: audio 3, audio_tuning 1, audio_events 2, audio_content 2, world_audio 2.
- Dev test mod: F8 native voices, F9 tuning, F10 emitter + reverb zone, F11 a mute rule.
- Headless e2e bench byte-identical to the #36 head after every step; doc 16 section L.
2026-10-04 10:04:07 -06:00
Hails 8403400fe3 Audio modding: review gaps closed, empty Lua tables read as lists
- Mod crossfade banks play: crossfade layouts come from the bank's program or from
  `add.crossfade_layouts` (crossfade.rs, crossfade_layouts.rs); dev test mod fade sample.
- Speech clips and takes are checked at merge time and by check_mod.
- Empty Lua tables (`{}`) were parsed as maps and rejected by list fields; one helper
  (lua_list.rs) now reads them as empty lists in every list field of every mod command.
- Traffic lights answered in the world-audio spec (Skate 3 has none).
- Doc 16 and PULL-REQUESTS.md updated.
2026-10-04 10:03:45 -06:00
Hails e985ed56c8 Merge gameplay/audio (3ed0652) into audio/moddability
Brings optimisation pass 2, the tools split (#37) and the world gaps
(tazer, ped body falls, speech echo / voice details, main-cast speech,
NPC loose-board slide) under the audio modding layer:
- main-cast speech takes go through the content overlay (archive
  "maincast"), like the living world's;
- ped speech (phone ring), body-fall and foot-plant Splice starts and the
  NPC skaters' starts are recorded through the observe-only event wrapper;
  tazer posts get a slot name; new tags "tazer" and "body_fall"; main-cast
  line starts are speech rows with class "maincast";
- the new world tuning (ped_objects, speech_voice) is overlay-reachable
  through tuning.world like the rest of the world tuning.
2026-10-03 21:46:43 -06:00
Hails 7ef35c45b0 Audio: world gaps closed (tazer, ped falls, speech details, echo, main-cast speech, NPC board slide)
Tazer and PedBodyFall ported from the retail mechanism and checked against the recordings; ped speech gets its PEAK filter, the voice float, the speech inputs, the phone and photographer lines, first-free-stream choice and the queue clock; the speech echo send (pre-gain send -> high pass -> distance delay -> low pass -> environment bus); the main-cast speech channel for pros, NPC skaters' own speech and message pairs, with its opt-in setup decode; the NPC skater's board slide. Engine and mod surfaces extended (reactions, tazer, body fall, phone / photo events); retail values are setup-data defaults. Local player output byte-identical.
2026-10-03 21:17:18 -06:00
Hails f7de66731e Audio modding R6: modding guide, sdk example and dev test mod 2026-10-03 20:13:05 -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 477e9de3f7 Docs and dev tooling: water write-up, PR H prepared, teleport mod
- 09-water.md: physics, camera, splash and look after in-play testing
- 10-sky-shader-test.md, README index
- PULL-REQUESTS.md: PR H prepared against upstream 60efdef
- water-test-teleport: F7 Aletown canal, F5 position readout, the
  "Teleported" text clears after 5 s
2026-10-01 12:27:23 -06:00
Hails 363d245bf3 Docs and dev tooling: PR plan update, water test teleport mod
- PULL-REQUESTS.md: pending edits to the upstream PR plan
- mods/water-test-teleport: dev-only mod for testing water (F2/F3/F4
  drop into University fountain, University reservoir, DownTown fountain;
  Shift+F2/F3/F4 stand beside them). Not intended for upstream.
2026-10-01 02:44:19 -06:00
Ethanw05 60efdef866 Bundle only Skyline in the installed mods and fresh releases 2026-09-29 20:25:49 -06:00
Ethanw05 dfd3e543c0 Add generic mesh and collider deformation with custom difficulty controls 2026-09-29 20:19:36 -06:00
Ethanw05 ddc30284b4 Generalize mod APIs, improve multiplayer and optimize mod rendering
Add generalized engine access and challenge mods, repair SKATE turn handling, and improve collision prediction and physics transitions. Reduce mod snapshot and material update overhead, preserve authored GLB materials with lighting and shadows, and improve CPU profiling.
2026-09-14 04:02:20 -06:00
Ethanw05 84142e78dc Extend modding API and menus; fix scoring, gestures, and bail controls 2026-09-13 19:37:45 -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 4a58b0b676 Fix Skyline car replication after multiplayer connect.
Respawn the chassis when a session starts so solid-bridge replication publishes a fresh body, and show local publish counts in replication status.

Co-authored-by: Cursor <[email protected]>
2026-09-12 01:47:34 -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 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 a0ff38c685 Track Skyline mod models and tighten gitignore exclusions.
Un-ignore bundled Skyline GLBs, ignore local docs and the BUILD-RELEASE.bat wrapper while keeping scripts/Build-Release.ps1 in tree.

Co-authored-by: Cursor <[email protected]>
2026-09-11 12:27:36 -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
Ethanw05 332e634275 Improve vehicle handling, collision response and airborne control 2026-09-08 19:36:18 -06:00
chazmm 5b04f35904 Bundle Native Trainer and complete Mario Kart mod packages 2026-09-08 23:35:26 +01:00
chazmm 24ac089874 Replicate SDK mod state and add multiplayer vehicle collision proxies 2026-09-08 23:29:13 +01:00
chazmm b262dfdcfe Load ZIP mod packages and publish agent authoring guides and packaging tools 2026-09-08 22:42:01 +01:00
chazmm 3611047d32 Load kart mods directly from the project-root mods folder 2026-09-08 22:25:10 +01:00
chazmm a97c9157e6 Add ramp-friendly vehicle collision, throttle engine audio and Mixamo SDK guide 2026-09-08 22:21:17 +01:00
chazmm 2ef93b2739 Integrate fitted kart rider clips with steering and smooth native pose handoffs 2026-09-08 21:59:56 +01:00
chazmm 52adfee597 Fix driver-relative kart steering and show controller controls 2026-09-08 20:25:38 +01:00
chazmm ece86968e1 Add configurable controller reset bind to kart mod 2026-09-08 20:21:00 +01:00
chazmm 61fc9f4418 Add Rapier vehicle SDK and configurable Mario Kart mod 2026-09-08 20:14:54 +01:00
chazmm 2078468443 Fix hold fakie by gating automatic stance-switch transitions 2026-09-08 19:41:20 +01:00
chazmm 9fa682a0c4 Add resizable trainer windows and optional fakie turn hold 2026-09-08 19:32:11 +01:00
chazmm f73dc0f5d2 Expand native trainer showcase and discover mods beside the executable 2026-09-08 19:05:17 +01:00
chazmm b809fc0701 Replace examples with native trainer and expose enabled settings beside pause menu 2026-09-08 18:46:21 +01:00
chazmm 772257cc9c Add isolated Lua mod runtime, settings menu and owned engine commands 2026-09-08 18:29:55 +01:00