Files
rustkeep/.scratch/rustkeep-1.0/issues/05-research-script-engine.md

3.2 KiB

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