Audio: WAV + tinyaudio, Ambient-Emitter mit Distance ramps; artist.md

engine/wav.rs (Decoder) und render/audio.rs (Mixer, 8 SFX-Voices +
Loop-Voice je Emitter) aus irl3d eingebettet; Emitter-Logik headless in
engine/audio.rs. Empties mit sound/radius-Property senden positional,
play_sound-Signale laufen als SFX über Session::take_sounds.
Platzhalter-Sounds + Emitter in der Testszene; artist.md fasst die
Content-Regeln für die Autorin zusammen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-16 20:08:13 +02:00
parent 56d92cdb46
commit 31e1942870
16 changed files with 796 additions and 21 deletions
+4 -3
View File
@@ -15,7 +15,8 @@
//! `inc <name> [<delta>]` KV-Integer inkrementieren (Default +1)
//! `clear <name>` KV-Eintrag entfernen
//! `hide_object <name>` → Action::HideObject (deferred)
//! `play_sound <file>` → Action::PlaySound (deferred)
//! `play_sound <name>` → Action::PlaySound (deferred): SFX aus
//! `assets/sounds/{name}.wav`
//! `mode <play|free|menu>` → Action::SetMode (deferred): Anzeige-/
//! Eingabemodus wechseln
//!
@@ -182,7 +183,7 @@ mod tests {
let mut signals = Signals::new();
signals.insert("pickup".into(), vec![
"inc items".into(),
"play_sound pickup.wav".into(),
"play_sound pickup".into(),
"hide_object $self".into(),
]);
let mut game = Game::new(signals);
@@ -192,7 +193,7 @@ mod tests {
assert_eq!(game.kv["items"].coerce_to_int().unwrap(), 1);
assert_eq!(game.actions, vec![
Action::PlaySound("pickup.wav".into()),
Action::PlaySound("pickup".into()),
Action::HideObject("Mushroom.005".into()),
]);
}