- 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.
- 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.
- --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.
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.
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.
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.
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.
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]>