Files
llamamod/tools/lama-mod
T

98 lines
3.3 KiB
Bash
Executable File

#!/bin/sh
# Turn mods for "Ein Königreich für ein Lama" on and off.
#
# lama-mod an|on enable the mods in ~/.wine-lama/mods/*/
# lama-mod aus|off original state (L: = unmodified CD data)
# lama-mod status
# lama-mod debug an enable the debug view (collision/invisible objects)
# lama-mod debug aus disable the debug view (other mods stay as they are)
#
# A mod is a folder whose files are laid out like on the CD under
# Setup/Eng/Cd (e.g. wads/T1L9M001.wad, T191.COR, movies/191INTRO.DAT).
# Activation uses an overlay of symlinks: original files stay untouched,
# mod files are added or replace files of the same name.
# Mods with a file ".aus" ("off") in their folder are skipped (this is how
# "lama-mod debug an|aus" toggles the "debug" mod independently of the others).
# Order: alphabetical, later mods win (testlevel > debug).
set -e
export WINEPREFIX="${WINEPREFIX:-${LAMA_WINEPREFIX:-$HOME/.wine-lama}}"
MODS="$WINEPREFIX/mods"
OVL="$WINEPREFIX/cd-overlay"
DBG="$MODS/debug"
if [ -d /opt/ein-koenigreich-fuer-ein-lama/cd ]; then
BASE=/opt/ein-koenigreich-fuer-ein-lama/cd
else
BASE="$WINEPREFIX/iso-dk/Setup/Eng/Cd"
fi
overlay_an() {
rm -rf "$OVL"
mkdir -p "$OVL"
(cd "$BASE" && find . -type d) | while IFS= read -r d; do mkdir -p "$OVL/$d"; done
(cd "$BASE" && find . -type f) | while IFS= read -r f; do ln -s "$BASE/$f" "$OVL/$f"; done
for m in "$MODS"/*/; do
[ -d "$m" ] || continue
if [ -e "$m/.aus" ]; then
echo "Mod: $(basename "$m") (disabled)"
continue
fi
echo "Mod: $(basename "$m")"
(cd "$m" && find . -path ./src -prune -o -name .aus -prune -o \( -type f -o -type l \) -print) | while IFS= read -r f; do
# replace an existing file of the same name (case-insensitive)
dir=$(dirname "$f"); name=$(basename "$f")
mkdir -p "$OVL/$dir"
find "$OVL/$dir" -maxdepth 1 -iname "$name" -exec rm -f {} +
ln -s "$m/$f" "$OVL/$f"
[ -n "$LEISE" ] || echo " + $f"
done
done
ln -sfn "$OVL" "$WINEPREFIX/dosdevices/l:"
echo "Mods active (L: -> $OVL)"
}
case "${1:-status}" in
an|on)
overlay_an
;;
aus|off)
ln -sfn "$BASE" "$WINEPREFIX/dosdevices/l:"
rm -rf "$OVL"
echo "Original state (L: -> $BASE)"
;;
debug)
if [ ! -d "$DBG/wads" ]; then
echo "Debug mod missing ($DBG/wads)." >&2; exit 1
fi
case "${2:-status}" in
an|on)
rm -f "$DBG/.aus"
LEISE=1 overlay_an
echo "Debug view ON ($(ls "$DBG/wads" | wc -l) levels). Takes effect the next time a level is loaded."
;;
aus|off)
touch "$DBG/.aus"
if [ "$(readlink "$WINEPREFIX/dosdevices/l:")" = "$OVL" ]; then
LEISE=1 overlay_an
fi
echo "Debug view OFF."
;;
status)
if [ -e "$DBG/.aus" ]; then echo "Debug view: off"; else echo "Debug view: on (if mods are active)"; fi
;;
*)
sed -n '2,9p' "$0"; exit 1 ;;
esac
;;
status)
echo "L: -> $(readlink "$WINEPREFIX/dosdevices/l:")"
for m in "$MODS"/*/; do
[ -d "$m" ] || continue
if [ -e "$m/.aus" ]; then s=" (disabled)"; else s=""; fi
echo "installed mod: $(basename "$m")$s"
done
;;
*)
sed -n '2,9p' "$0"; exit 1 ;;
esac