#!/bin/sh
# Mods für "Ein Königreich für ein Lama" ein- und ausschalten.
#
#   lama-mod an          Mods aus ~/.wine-lama/mods/*/ aktivieren
#   lama-mod aus         Originalzustand (L: = unveränderte CD-Daten)
#   lama-mod status
#   lama-mod debug an    Debug-Ansicht (Kollision/unsichtbare Objekte) zuschalten
#   lama-mod debug aus   Debug-Ansicht abschalten (andere Mods bleiben, wie sie sind)
#
# Eine Mod ist ein Ordner, dessen Dateien so liegen wie auf der CD unter
# Setup/Eng/Cd (z. B. wads/T1L9M001.wad, T191.COR, movies/191INTRO.DAT).
# Aktiviert wird über ein Overlay aus Symlinks: Originaldateien bleiben
# unangetastet, Mod-Dateien kommen dazu bzw. ersetzen gleichnamige.
# Mods mit einer Datei ".aus" im Ordner werden übersprungen (so schaltet
# "lama-mod debug an|aus" die Mod "debug" unabhängig von den anderen).
# Reihenfolge: alphabetisch, spätere Mods gewinnen (testlevel > debug).
set -e
export WINEPREFIX="${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") (abgeschaltet)"
            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
            # vorhandene Datei gleichen Namens (Groß-/Kleinschreibung egal) ersetzen
            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 aktiv (L: -> $OVL)"
}

case "${1:-status}" in
an|on)
    overlay_an
    ;;
aus|off)
    ln -sfn "$BASE" "$WINEPREFIX/dosdevices/l:"
    rm -rf "$OVL"
    echo "Originalzustand (L: -> $BASE)"
    ;;
debug)
    if [ ! -d "$DBG/wads" ]; then
        echo "Debug-Mod fehlt ($DBG/wads)." >&2; exit 1
    fi
    case "${2:-status}" in
    an|on)
        rm -f "$DBG/.aus"
        LEISE=1 overlay_an
        echo "Debug-Ansicht AN ($(ls "$DBG/wads" | wc -l) Level). Wirkt beim nächsten Laden eines Levels."
        ;;
    aus|off)
        touch "$DBG/.aus"
        if [ "$(readlink "$WINEPREFIX/dosdevices/l:")" = "$OVL" ]; then
            LEISE=1 overlay_an
        fi
        echo "Debug-Ansicht AUS."
        ;;
    status)
        if [ -e "$DBG/.aus" ]; then echo "Debug-Ansicht: aus"; else echo "Debug-Ansicht: an (wenn Mods aktiv)"; 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=" (abgeschaltet)"; else s=""; fi
        echo "installierte Mod: $(basename "$m")$s"
    done
    ;;
*)
    sed -n '2,9p' "$0"; exit 1 ;;
esac
