#!/usr/bin/env bash
# Reconstruye la demo /demos/freedoom/: motor + datos, los dos libres.
#   - Motor: cloudflare/doom-wasm (Chocolate Doom, GPL-2) en un commit fijo,
#     compilado a WebAssembly con la imagen oficial emscripten/emsdk en una versión fija.
#   - Datos: Freedoom Phase 1 (BSD de 3 cláusulas) del release oficial, con SHA-256.
#   ⛔ Nunca doom1.wad ni ningún WAD de id Software.
# Uso: scripts/demos/build-freedoom.sh   (necesita docker, curl, unzip, git, gzip)
# Salida: public/demos/freedoom/
set -euo pipefail

ENGINE_REPO="https://github.com/cloudflare/doom-wasm"
ENGINE_COMMIT="65e0d3ae2ffa604155eebd96ed40da6567bd08f4"
# El Emscripten de la época del motor (mayo de 2021). Con uno moderno (3.1.74) compila, pero la
# partida local se corrompe: el motor cree que hay cuatro jugadores, muestra frags y avanza un
# tic cada varios segundos esperando a los que faltan.
EMSDK_IMAGE="emscripten/emsdk:2.0.20"

FREEDOOM_VERSION="0.13.0"
FREEDOOM_ZIP_URL="https://github.com/freedoom/freedoom/releases/download/v${FREEDOOM_VERSION}/freedoom-${FREEDOOM_VERSION}.zip"
FREEDOOM_ZIP_SHA256="3f9b264f3e3ce503b4fb7f6bdcb1f419d93c7b546f4df3e874dd878db9688f59"
FREEDOOM1_WAD_SHA256="7323bcc168c5a45ff10749b339960e98314740a734c30d4b9f3337001f9e703d"

ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
OUT="$ROOT/public/demos/freedoom"
WORK="$(mktemp -d)"
trap 'rm -rf "$WORK"' EXIT
mkdir -p "$OUT"

echo "==> Datos: Freedoom $FREEDOOM_VERSION"
curl -fsSL "$FREEDOOM_ZIP_URL" -o "$WORK/freedoom.zip"
echo "$FREEDOOM_ZIP_SHA256  $WORK/freedoom.zip" | sha256sum -c -
unzip -q "$WORK/freedoom.zip" -d "$WORK/freedoom"
WAD="$WORK/freedoom/freedoom-${FREEDOOM_VERSION}/freedoom1.wad"
echo "$FREEDOOM1_WAD_SHA256  $WAD" | sha256sum -c -
# El WAD (28,8 MB) pasa el límite de 25 MiB por asset de Cloudflare: se sirve
# comprimido (gzip -n, reproducible) y el navegador lo descomprime al cargar.
gzip -9 -n -c "$WAD" > "$OUT/freedoom1.wad.gz"
cp "$WORK/freedoom/freedoom-${FREEDOOM_VERSION}/COPYING.txt" "$OUT/COPYING-freedoom.txt"
cp "$WORK/freedoom/freedoom-${FREEDOOM_VERSION}/CREDITS.txt" "$OUT/CREDITS-freedoom.txt"

echo "==> Motor: doom-wasm @ $ENGINE_COMMIT"
git clone -q "$ENGINE_REPO" "$WORK/engine"
git -C "$WORK/engine" checkout -q "$ENGINE_COMMIT"
cp "$WORK/engine/COPYING.md" "$OUT/COPYING-engine-GPL2.md"
# El propio script viaja con los binarios: con el commit del motor, es la fuente correspondiente (GPL 2).
cp "$0" "$OUT/build-freedoom.sh"

# Único cambio al motor: las opciones de emscripten de configure.ac traen SAFE_HEAP,
# que aborta con «alignment fault» en el código de red (D_CheckNetGame) nada más
# arrancar, y mapas de depuración que engordan el .wasm. Se quitan; ni una línea de C
# se toca, así que el fuente publicado en ENGINE_COMMIT es el que corre.
sed -i -e 's/-gsource-map //' -e 's/-s SAFE_HEAP=1 //' -e 's/-s STACK_OVERFLOW_CHECK=1 //' \
	-e 's| --source-map-base /||' "$WORK/engine/configure.ac"
grep -q 'SAFE_HEAP' "$WORK/engine/configure.ac" && { echo "configure.ac aún trae SAFE_HEAP" >&2; exit 1; }

# Chocolate Doom conserva los límites estáticos del renderizador del Doom original; se amplían
# por si un mapa de Freedoom los rebasa, que según el límite aborta la partida o desborda
# `openings` antes de comprobarlo. Es el único cambio al C.
sed -i 's/^#define MAXVISPLANES\t128$/#define MAXVISPLANES\t1024/' "$WORK/engine/src/doom/r_plane.c"
sed -i 's/^#define MAXOPENINGS\tSCREENWIDTH\*64$/#define MAXOPENINGS\tSCREENWIDTH*512/' "$WORK/engine/src/doom/r_plane.c"
sed -i 's/^#define MAXDRAWSEGS\t\t256$/#define MAXDRAWSEGS\t\t2048/' "$WORK/engine/src/doom/r_defs.h"
sed -i 's/^#define MAXVISSPRITES  \t128$/#define MAXVISSPRITES  \t1024/' "$WORK/engine/src/doom/r_things.h"
grep -q 'MAXVISPLANES.1024' "$WORK/engine/src/doom/r_plane.c" && grep -q 'SCREENWIDTH\*512' "$WORK/engine/src/doom/r_plane.c" \
	&& grep -q 'MAXDRAWSEGS.*2048' "$WORK/engine/src/doom/r_defs.h" && grep -q 'MAXVISSPRITES.*1024' "$WORK/engine/src/doom/r_things.h" \
	|| { echo "no se aplicó el parche de límites del renderizador" >&2; exit 1; }

# Compila dentro del contenedor (root, para poder instalar autotools); al final se
# devuelven los archivos al usuario. Los puertos SDL2 de emscripten se descargan
# en esta fase, así que hace falta red.
docker run --rm -v "$WORK/engine:/src" -w /src "$EMSDK_IMAGE" bash -euxc '
  apt-get update -qq && apt-get install -y -qq autoconf automake libtool pkg-config >/dev/null
  emmake make clean || true
  emconfigure autoreconf -fiv
  ac_cv_exeext=".html" emconfigure ./configure --host=none-none-none
  emmake make -j"$(nproc)"
  chown -R '"$(id -u):$(id -g)"' /src
'

cp "$WORK/engine/src/websockets-doom.js" "$WORK/engine/src/websockets-doom.wasm" "$OUT/"
# La configuración es nuestra (scripts/demos/freedoom.cfg), sobre el default.cfg del motor: controles
# clásicos de Doom (flechas, Ctrl dispara, Espacio usa, Alt o , . para pasos laterales, Shift
# corre) en vez del WASD + O/P de Cloudflare, sin ratón (sin captura gira la vista al pasar
# por encima) y sin los 2 s de pantalla negra de startup_delay.
cp "$ROOT/scripts/demos/freedoom.cfg" "$OUT/default.cfg"

echo "==> Listo en $OUT"
ls -l "$OUT"
