Character pipeline (tools/): - sketchfab_import.py: search/download via Sketchfab Download API with license/attribution tracking (SKETCHFAB_API_TOKEN) - autorig.py: headless Blender auto-rig — fits a Mixamo-named skeleton to unrigged humanoids, binds automatic weights - merge_animations.py: merges the shared Mixamo-skeleton animation library onto any rigged character, strips root motion, canonical names - pipeline.py: one command chains download -> rig -> animate -> register In-game skin system: - SkinManager autoload reads skins.json (auto-written by the pipeline) - SkinnedPlayerModel rewritten: canonical clips with fallback chains, blend times, speed-scaled locomotion, weapon bone attachment - First-person: full animated body for the owner, head hidden via SkeletonModifier3D; third-person: full model for other players - Skin selector in main menu; skin id synced in multiplayer - Fixed GLBLoader crash (GLTFDocument.get_animation_count doesn't exist) Multiplayer sync overhaul: - Movement is now client-authoritative: the owning peer simulates locally (no input round-trip), server keeps health/kills/death - Remote players interpolate synced_position/velocity with extrapolation and snap-on-teleport - Knockback/impulses routed to the simulating peer Audio: - AudioManager autoload: SFX/Weapons/Footsteps/UI/Music buses, pooled 3D players, variation + pitch randomization, auto-registration from assets/sounds Docs: 3D_ASSET_PIPELINE.md rewritten end-to-end, new ASSET_SOURCES.md (non-procedural animation/map/sound sources) and SOUND_DESIGN.md. Verified with debug/spawn_smoke_test.gd (headless: 24/24 checks pass). Co-Authored-By: Claude Fable 5 <[email protected]>
2.9 KiB
2.9 KiB
Sound Design Plan
The current sounds are procedurally generated sine/noise blends
(generate_sounds.py) — functional, but robotic. This doc is the path to
real sound design with zero budget.
What's in place now
AudioManager (autoload, globals/audio_manager.gd) provides the plumbing
good sound design needs:
- Bus layout:
Master ← SFX ← {Weapons, Footsteps, UI},Master ← Music— created automatically at boot, so volume sliders and effects (EQ, compression, reverb zones) can target categories. - Variation playback: drop
footstep_01.wav,footstep_02.wav,footstep_03.wavintoassets/sounds/andAudioManager.play_3d("footstep", pos)picks one at random. - Pitch randomization: every playback is pitched ±6% by default — the single cheapest trick to stop repeated sounds sounding fake.
- Pooled 3D players:
play_3d()is safe to call every frame; no node churn, no cut-off management.
# anywhere in gameplay code:
AudioManager.play_3d("ak47_fire", muzzle.global_position)
AudioManager.play_ui("hit_confirm")
Replacing the procedural sounds (priority order)
Sound is ~50% of "game feel" in an FPS. Replace in this order:
- Weapon fire (heard constantly): layered = body (low thump) + crack
(mid transient) + tail (room reflection). Sonniss GDC packs have complete
layered gunshots. One file per weapon is fine to start; add
_01.._03variations later. - Hit confirm + kill confirm: short, bright, satisfying (this is the "touchdown" pillar in the design doc).
- Footsteps: 4+ variations minimum, quieter than you think, on the
Footstepsbus so they can be ducked while firing. - Movement verbs: slide (cloth+concrete scrape), dash (air whoosh), wall-run loop, jump/land (land intensity scaled by fall speed).
- Ambience: a quiet room tone per map kills the "dead air" feeling.
- UI: menu hover/click/equip from a Kenney UI pack.
Where to get files: see ASSET_SOURCES.md — Sonniss GDC bundles first, Kenney CC0 packs second, Freesound (CC0 filter) for gaps.
Conventions
- Files:
assets/sounds/<event>[_NN].wav— 44.1 kHz, 16-bit, mono for 3D positional sounds, stereo only for UI/music. - Ids are auto-registered from filenames at boot (
ak47_fire.wav→"ak47_fire"). Names containingfire/reloadroute to the Weapons bus,footstepto Footsteps, everything else to SFX (seeBUS_HINTSin audio_manager.gd). - Keep source loudness consistent: normalize weapon shots to about -6 dBFS peak, footsteps/foley around -18 dBFS.
Later polish (cheap wins, in order)
- Distance low-pass on the Weapons bus (far gunfire sounds muffled).
- A short duck (sidechain) on Footsteps/ambience when local weapon fires.
- Reverb
AudioEffectReverbper-map on SFX for indoor spaces. - Surface-dependent footsteps: raycast down, map material → sound id
(
footstep_metal,footstep_concrete).