Dialog Build-Script
This commit is contained in:
@@ -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`).
|
||||
Executable
+83
@@ -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 ]
|
||||
Reference in New Issue
Block a user