From 7929e7349a5faaa36715e46cb5e2ef9383eb10b4 Mon Sep 17 00:00:00 2001 From: irrlicht Date: Sat, 13 Jun 2026 02:36:35 +0200 Subject: [PATCH] Dialog Build-Script --- .gitignore | 3 ++ tools/README.md | 32 ++++++++++++++++ tools/build-dialogues.sh | 83 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 tools/README.md create mode 100755 tools/build-dialogues.sh diff --git a/.gitignore b/.gitignore index e2aab4f..3974c66 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,6 @@ target/ # Added by cargo /target + +# Mitgelieferter Ink-Compiler (~64 MB self-contained Binary, siehe tools/README.md) +/tools/inklecate diff --git a/tools/README.md b/tools/README.md new file mode 100644 index 0000000..35034f9 --- /dev/null +++ b/tools/README.md @@ -0,0 +1,32 @@ +# tools/ + +Hilfsskripte für die Asset-Pipeline. Sie sind **nicht** Teil der Engine — +die Engine liest nur die fertig gebauten Dateien unter `assets/`. + +## build-dialogues.sh + +Baut alle Ink-Dialoge zu den `.ink.json`, die das Spiel liest. + +```sh +./tools/build-dialogues.sh # nur Geändertes neu bauen +./tools/build-dialogues.sh -f # alles neu bauen +``` + +Workflow für die Autorin: `.ink`-Dateien in `assets/interactions/` +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. + +### inklecate + +Das Skript sucht den Ink-Compiler in dieser Reihenfolge: + +1. `$INKLECATE` (Pfad zum Binary) +2. `tools/inklecate` (mitgeliefert) +3. `inklecate` im `PATH` + +Das mitgelieferte `tools/inklecate` ist ein eigenständiges Linux-Binary +(self-contained .NET, braucht kein Mono). Es ist groß (~64 MB) und steht +darum in `.gitignore` — bei einem frischen Clone einmal aus den +[ink-Releases](https://github.com/inkle/ink/releases) (`inklecate_linux`) +nach `tools/inklecate` kopieren und ausführbar machen (`chmod +x`). diff --git a/tools/build-dialogues.sh b/tools/build-dialogues.sh new file mode 100755 index 0000000..eb83353 --- /dev/null +++ b/tools/build-dialogues.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash +# +# Baut alle Ink-Dialoge zu .ink.json, die das Spiel lesen kann. +# +# Für die Autorin: Schreib deine Dialoge als .ink-Dateien in +# assets/interactions/ +# und führ danach dieses Skript aus: +# ./tools/build-dialogues.sh +# Fertig — das Spiel liest die erzeugten .ink.json. +# +# Standardmäßig wird nur neu gebaut, was sich seit dem letzten Mal +# geändert hat. Mit -f / --force wird alles neu gebaut. + +set -euo pipefail + +# Repo-Wurzel relativ zum Skript bestimmen — egal, von wo aufgerufen. +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +root="$(cd "$script_dir/.." && pwd)" +ink_dir="$root/assets/interactions" + +force=0 +case "${1:-}" in + -f|--force) force=1 ;; + "") ;; + *) echo "Unbekannte Option: $1 (nur -f/--force)" >&2; exit 2 ;; +esac + +# inklecate finden: $INKLECATE → mitgeliefertes tools/inklecate → PATH. +find_inklecate() { + if [ -n "${INKLECATE:-}" ] && [ -x "$INKLECATE" ]; then + echo "$INKLECATE"; return 0 + fi + if [ -x "$script_dir/inklecate" ]; then + echo "$script_dir/inklecate"; return 0 + fi + if command -v inklecate >/dev/null 2>&1; then + command -v inklecate; return 0 + fi + return 1 +} + +if ! inklecate="$(find_inklecate)"; then + cat >&2 <<'EOF' +Fehler: inklecate nicht gefunden. + Lege das Linux-Binary nach tools/inklecate (chmod +x), + setze $INKLECATE auf den Pfad, oder installiere es in den PATH. + Quelle: https://github.com/inkle/ink/releases +EOF + exit 1 +fi + +if [ ! -d "$ink_dir" ]; then + echo "Kein Dialog-Ordner: $ink_dir" >&2 + exit 1 +fi + +built=0 skipped=0 failed=0 +shopt -s nullglob +for src in "$ink_dir"/*.ink; do + out="${src%.ink}.ink.json" + name="$(basename "$src")" + + # Inkrementell: überspringen, wenn Ausgabe existiert und neuer ist. + if [ "$force" -eq 0 ] && [ -f "$out" ] && [ "$out" -nt "$src" ]; then + printf ' aktuell %s\n' "$name" + skipped=$((skipped + 1)) + continue + fi + + # inklecate-Ausgabe einsammeln; nur bei Problemen/Warnungen zeigen. + if log="$("$inklecate" -o "$out" "$src" 2>&1)"; then + printf ' gebaut %s\n' "$name" + built=$((built + 1)) + [ -n "$log" ] && printf '%s\n' "$log" | sed 's/^/ /' + else + printf ' FEHLER %s\n' "$name" + printf '%s\n' "$log" | sed 's/^/ /' + failed=$((failed + 1)) + fi +done + +echo "—— $built gebaut, $skipped aktuell, $failed fehlgeschlagen ——" +[ "$failed" -eq 0 ]