From 802f2bd34b0bf09c5c6768df3eeaaf7094353ef5 Mon Sep 17 00:00:00 2001 From: irrlicht Date: Sat, 13 Jun 2026 02:46:56 +0200 Subject: [PATCH] Automatisches Ink-Build on Engine build --- assets/interactions/person.ink | 2 +- assets/interactions/person.ink.json | 2 +- build.rs | 59 +++++++++++++++++++++++++++++ tools/README.md | 3 ++ 4 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 build.rs diff --git a/assets/interactions/person.ink b/assets/interactions/person.ink index c35c7df..99fd383 100644 --- a/assets/interactions/person.ink +++ b/assets/interactions/person.ink @@ -28,7 +28,7 @@ VAR quest_mushroom_done = false - else: # color whisper - Hallo! Ich bräuchte 10 Pilze für ein Rezept. Hättest du Lust, welche zu sammeln? + TEST1 Hallo! Ich bräuchte 10 Pilze für ein Rezept. Hättest du Lust, welche zu sammeln? * [Klar, ich helfe.] ~ quest_mushroom_active = true # color whisper diff --git a/assets/interactions/person.ink.json b/assets/interactions/person.ink.json index 2e832d9..c32d158 100644 --- a/assets/interactions/person.ink.json +++ b/assets/interactions/person.ink.json @@ -1 +1 @@ -{"inkVersion":21,"root":[[["ev",{"VAR?":"quest_mushroom_done"},"/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Danke nochmal für die Pilze. Das Rezept ist fast fertig.","\n",{"->":"ende"},{"->":"0.4"},null]}],["ev",{"VAR?":"quest_mushroom_active"},{"VAR?":"mushrooms_collected"},10,">=","&&","/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Du hast ","ev",{"VAR?":"mushrooms_collected"},"out","/ev","^ Pilze dabei — mehr als genug!","\n","ev","str","^Hier, nimm sie.","/str","/ev",{"*":".^.c-0","flg":20},"ev","str","^Lass mich noch ein paar behalten.","/str","/ev",{"*":".^.c-1","flg":20},{"->":"0.4"},{"c-0":["\n","ev",true,"/ev",{"VAR=":"quest_mushroom_done","re":true},"#","^color whisper","/#","^Wunderbar, vielen Dank! Das wird ein gutes Süppchen.","\n",{"->":"ende"},{"#f":5}],"c-1":["\n","#","^color whisper","/#","^Wie du willst. Komm wieder, wenn du sie loswerden möchtest.","\n",{"->":"ende"},{"#f":5}]}]}],["ev",{"VAR?":"quest_mushroom_active"},"/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Du hast schon ","ev",{"VAR?":"mushrooms_collected"},"out","/ev","^ von 10 Pilzen. Mach ruhig weiter.","\n",{"->":"ende"},{"->":"0.4"},null]}],[{"->":".^.b"},{"b":["\n","#","^color whisper","/#","^Hallo! Ich bräuchte 10 Pilze für ein Rezept. Hättest du Lust, welche zu sammeln?","\n","ev","str","^Klar, ich helfe.","/str","/ev",{"*":".^.c-0","flg":20},"ev","str","^Vielleicht später.","/str","/ev",{"*":".^.c-1","flg":20},{"->":"0.4"},{"c-0":["\n","ev",true,"/ev",{"VAR=":"quest_mushroom_active","re":true},"#","^color whisper","/#","^Danke! Ich warte hier.","\n",{"->":"ende"},{"#f":5}],"c-1":["\n","#","^color whisper","/#","^Schade. Komm gerne nochmal vorbei.","\n",{"->":"ende"},{"#f":5}]}]}],"nop","\n",["done",{"#n":"g-0"}],null],"done",{"ende":[["ev","str","^Bis dann","/str","/ev",{"*":".^.c-0","flg":20},{"c-0":["\n","#","^person_farewell","/#","end",{"#f":5}]}],null],"global decl":["ev",0,{"VAR=":"mushrooms_collected"},false,{"VAR=":"quest_mushroom_active"},false,{"VAR=":"quest_mushroom_done"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file +{"inkVersion":21,"root":[[["ev",{"VAR?":"quest_mushroom_done"},"/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Danke nochmal für die Pilze. Das Rezept ist fast fertig.","\n",{"->":"ende"},{"->":"0.4"},null]}],["ev",{"VAR?":"quest_mushroom_active"},{"VAR?":"mushrooms_collected"},10,">=","&&","/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Du hast ","ev",{"VAR?":"mushrooms_collected"},"out","/ev","^ Pilze dabei — mehr als genug!","\n","ev","str","^Hier, nimm sie.","/str","/ev",{"*":".^.c-0","flg":20},"ev","str","^Lass mich noch ein paar behalten.","/str","/ev",{"*":".^.c-1","flg":20},{"->":"0.4"},{"c-0":["\n","ev",true,"/ev",{"VAR=":"quest_mushroom_done","re":true},"#","^color whisper","/#","^Wunderbar, vielen Dank! Das wird ein gutes Süppchen.","\n",{"->":"ende"},{"#f":5}],"c-1":["\n","#","^color whisper","/#","^Wie du willst. Komm wieder, wenn du sie loswerden möchtest.","\n",{"->":"ende"},{"#f":5}]}]}],["ev",{"VAR?":"quest_mushroom_active"},"/ev",{"->":".^.b","c":true},{"b":["\n","#","^color whisper","/#","^Du hast schon ","ev",{"VAR?":"mushrooms_collected"},"out","/ev","^ von 10 Pilzen. Mach ruhig weiter.","\n",{"->":"ende"},{"->":"0.4"},null]}],[{"->":".^.b"},{"b":["\n","#","^color whisper","/#","^TEST1 Hallo! Ich bräuchte 10 Pilze für ein Rezept. Hättest du Lust, welche zu sammeln?","\n","ev","str","^Klar, ich helfe.","/str","/ev",{"*":".^.c-0","flg":20},"ev","str","^Vielleicht später.","/str","/ev",{"*":".^.c-1","flg":20},{"->":"0.4"},{"c-0":["\n","ev",true,"/ev",{"VAR=":"quest_mushroom_active","re":true},"#","^color whisper","/#","^Danke! Ich warte hier.","\n",{"->":"ende"},{"#f":5}],"c-1":["\n","#","^color whisper","/#","^Schade. Komm gerne nochmal vorbei.","\n",{"->":"ende"},{"#f":5}]}]}],"nop","\n",["done",{"#n":"g-0"}],null],"done",{"ende":[["ev","str","^Bis dann","/str","/ev",{"*":".^.c-0","flg":20},{"c-0":["\n","#","^person_farewell","/#","end",{"#f":5}]}],null],"global decl":["ev",0,{"VAR=":"mushrooms_collected"},false,{"VAR=":"quest_mushroom_active"},false,{"VAR=":"quest_mushroom_done"},"/ev","end",null]}],"listDefs":{}} \ No newline at end of file diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..c66fae2 --- /dev/null +++ b/build.rs @@ -0,0 +1,59 @@ +//! Build-Hook: kompiliert geänderte Ink-Dialoge automatisch beim Cargo-Build. +//! +//! Reines „Wann"-Stück — das eigentliche Bauen macht `tools/build-dialogues.sh` +//! (und bleibt von Hand aufrufbar). Hier melden wir Cargo nur, wann es uns +//! erneut ausführen soll, und stoßen das Skript an. +//! +//! Cargo führt build.rs ausschließlich dann erneut aus, wenn eine der unten +//! via `rerun-if-changed` gemeldeten Dateien sich ändert. Unveränderte +//! Rebuilds kosten also nichts; nur nach einer `.ink`-Änderung läuft +//! inklecate (inkrementell nur für die betroffene Datei). + +use std::path::Path; +use std::process::Command; + +fn main() { + let root = env!("CARGO_MANIFEST_DIR"); + let script = Path::new(root).join("tools/build-dialogues.sh"); + let ink_dir = Path::new(root).join("assets/interactions"); + + // Wann soll Cargo build.rs erneut ausführen? + println!("cargo:rerun-if-changed=tools/build-dialogues.sh"); + println!("cargo:rerun-if-changed=tools/inklecate"); + // Verzeichnis-mtime fängt neu hinzugekommene/gelöschte .ink-Dateien. + println!("cargo:rerun-if-changed=assets/interactions"); + // Inhaltsänderungen einzelner .ink-Dateien einzeln melden. + if let Ok(entries) = std::fs::read_dir(&ink_dir) { + for entry in entries.flatten() { + let p = entry.path(); + if p.extension().and_then(|s| s.to_str()) == Some("ink") { + println!("cargo:rerun-if-changed={}", p.display()); + } + } + } + + // Skript ausführen. Ausgabe einsammeln, damit ein Dialog-Fehler sichtbar + // wird (Cargo blendet Build-Script-stdout sonst aus). + match Command::new("bash").arg(&script).output() { + Ok(out) if out.status.success() => { /* still bei Erfolg */ } + Ok(out) => { + let stdout = String::from_utf8_lossy(&out.stdout); + let stderr = String::from_utf8_lossy(&out.stderr); + for line in stdout.lines().chain(stderr.lines()) { + println!("cargo:warning={line}"); + } + panic!( + "Dialog-Build fehlgeschlagen — siehe Warnungen oben. \ + Einzeln debuggen: ./tools/build-dialogues.sh" + ); + } + Err(e) => { + // bash/Skript nicht startbar (z.B. fremdes OS): den Build nicht + // blockieren, nur warnen — die committeten .ink.json reichen. + println!( + "cargo:warning=Dialog-Build übersprungen ({e}). \ + Bei Bedarf von Hand: ./tools/build-dialogues.sh" + ); + } + } +} diff --git a/tools/README.md b/tools/README.md index bd6586c..837223b 100644 --- a/tools/README.md +++ b/tools/README.md @@ -17,6 +17,9 @@ schreiben, Skript laufen lassen, fertig. Die `.ink.json` landen direkt neben den `.ink` und werden mit ins Repo eingecheckt, damit ein frischer Clone ohne Toolchain spielbar ist. +**Automatisch beim Build:** `cargo build`/`cargo run` ruft dieses Skript +über `build.rs` selbst auf, sobald sich eine `.ink` geändert hat. + ### inklecate Das Skript sucht den Ink-Compiler in dieser Reihenfolge: