# 05 — Research: Script-Engine für Mod-Stufe (c) Type: research Status: resolved Blocked by: — ## Question Welche Script-Engine trägt modderseitiges Verhalten in rustkeep — Rhai, Lua via `mlua`, oder WASM? Fakten sammeln, keine Entscheidung treffen. Zu klären: - Einbindung: Braucht es eine C-Toolchain unter Windows? Wie groß ist der Build-Overhead? - Typ-Brücke: Wie schmerzhaft ist es, Rust-Structs (Stats, Item, Game-State) für Scripts zugänglich zu machen? - Sandbox: Kann ein bösartiges Mod-Script Dateien lesen oder Prozesse starten? Was lässt sich abschalten? - Fehlerbehandlung: Bekommt man brauchbare Fehlermeldungen mit Zeilennummer aus dem Script zurück? - Hot-Reload: Lassen sich Scripts zur Laufzeit neu laden? - Zielgruppe: Wie viele Hobby-Modder kennen die Sprache schon? Lua hat Vorsprung, Rhai ist Rust-nativ. - Reifegrad: Wartungsstand, Release-Frequenz, Größe des Ökosystems, Beispiele aus echten Spielen. Ergebnis: Vergleichstabelle plus Empfehlung mit Begründung; die Entscheidung fällt der Mensch später. ## Answer Vollständiger Bericht: [`research/05-script-engine.md`](../research/05-script-engine.md) (209 Zeilen, geprüft am 2026-08-11). **Empfehlung: Rhai** — begründet, nicht entschieden. - **Fehlermeldungen**: Rhai liefert Zeile *und* Spalte plus Call-Chain. Passt direkt zur `Result`-Fehlerstrategie aus Ticket 04. - **Typ-Brücke**: `#[derive(CustomType)]`, nur `Clone` nötig — gegen `impl UserData` pro Feld bei mlua. - **Hot-Reload**: AST-Tausch bei überlebendem `Scope`. - **Build**: kein `cc`, kein `libc` im Baum. Gemessen 44 Dependencies und 45,5 s gegen 166/304 Deps und 262 s/356 s bei den WASM-Kandidaten. - **Sandbox, der schärfste Einzelbefund**: Ein Lua-Script hat auf dieser Maschine unter `Lua::new()` **und** unter `StdLib::ALL_SAFE` per `io.open` eine echte Datei gelesen. `ALL_SAFE` ist `(1<<30)-1` und meint *speichersicher*, nicht *fähigkeitsbeschränkt*. Rhai hat Datei-, Netz- und Prozesszugriff gar nicht erst in der Standard-Engine. Beide brauchen Härtung, bei Rhai kostet ein vergessener Handgriff weniger. Rhais Defaults sind aber auch nicht harmlos: `FileModuleResolver` lädt `./*.rhai` von der Platte, `eval()` ist an, CPU- und Memory-Limits sind aus. - **Gegenseite, ehrlich**: Lua gewinnt bei der Vertrautheit deutlich (Factorio, GMod, WoW, Teardown, Noita, Don't Starve, Luanti, Dota 2). Ist das Ziel „möglichst viele fremde Mods" statt „gut moddbar für einen kleinen Kreis", kippt die Empfehlung. - **Rhai-Risiken**: Bus-Faktor 1; Unsoundness-Issue #894 offen seit 2024; Pflicht-Dependency `smartstring` seit 2026-08-10 unmaintained (RUSTSEC-2026-0249); VM-Rewrite im Gang. - **WASM scheidet für 1.0 aus** — nicht technisch (beste Sandbox), sondern wegen Compile-Pflicht für Modder, Fehlermeldungen ohne Quellzeile und Build-Overhead. Falls später doch: `wasmi`, nicht wasmtime. - **Nicht verifizierbar und so gekennzeichnet**: kein ausgeliefertes Spiel mit Rhai-Modding, kein Rust-Spiel mit mlua, kein kommerzielles Spiel mit WASM-Modding auffindbar. **Folge für die Map**: Reden Scripts ausschließlich über das Effekt-Vokabular, ist die Engine-Wahl weit umkehrbarer als sie aussieht. Die Entscheidung selbst ist zu Ticket 13 graduiert und hängt an 01.