//! Headless-Kern: alles, was läuft, ohne dass ein Frontend existiert. //! //! Schicht-Regel: `engine` kennt keine Frontends. Nach außen kommuniziert //! der Kern nur über Rückgabewerte (`StoryState`, Tags) und die //! [`game::Action`]-Queue — niemals über Aufrufe in Frontend-Module. //! Frontends (CLI-REPL jetzt, Renderer später) sind Geschwister-Module, //! die `engine` konsumieren; die Richtung kehrt sich nie um. //! //! Interner Abhängigkeitsgraph (azyklisch, Pfeil = „benutzt"): //! //! kv ← ink ← game ← story_ctrl ← signals //! ↑ ↑ //! kv assets //! //! Bitte azyklisch halten: neue Querverbindungen lieber über Rückgabewerte //! an den Aufrufer lösen (so wie story_ctrl Tags zurückgibt, statt selbst //! signals::dispatch zu rufen). //! //! `gltf`, `tga` und `wav` sind reine Decoder (Bytes → owned Daten, hängen //! an nichts) — die geteilte Heimat für Format-Dekodierung, die jedes //! Frontend per Pull konsumiert. `gltf` ist DER 3D-Pfad (Blender-first: //! Sichtgeometrie, Collider/Trigger via Custom Properties, Empties aus //! einem Export) und produziert das neutrale `model::Model`. `audio` ist //! die headless Emitter-Logik (Distance ramps) zum Frontend-Treiber //! render::audio. //! //! `player` ist die First-Person-Physik, aus der der Renderer seine View //! ableitet; `collision` (hängt an `model`) liefert ihr die Welt für den //! Swept-AABB-Trace in `player::step`. Beide bleiben headless. pub mod assets; pub mod audio; pub mod collision; pub mod game; pub mod gltf; pub mod ink; pub mod kv; pub mod model; pub mod player; pub mod signals; pub mod story_ctrl; pub mod tga; pub mod trigger; pub mod wav;