#!/usr/bin/env bash # Compila o Umoria do fredygames.com: o roguelike classico de Robert A. Koeneke (1983) e James E. Wilson, # com a manutencao de David Grabiner e Michael R. Cook (GPL-3.0-ou-posterior) em WebAssembly, com o # Emscripten 6.0.10. O jogo usa curses; umoria/ncurses.h e umoria/emcurses.cpp trazem o pedaco da API que # ele usa (uma tela de 80x24 em memoria que a pagina desenha num canvas e leitura de teclas por uma chamada # JavaScript assincrona, o que pede -sASYNCIFY). # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # src/FredGames.Bundler/Builds/build-umoria.sh # # Fonte: o commit 3bf8abc do repositorio dungeons-of-moria/umoria (versao 5.7.15 mais uma correcao de # compilacao), conferido pelo SHA-256 e guardado em artifacts/cache/umoria/. umoria-fredygames.patch (so # ativo com __EMSCRIPTEN__): os recordes e o jogo salvo ficam em /saves (a pagina guarda a pasta no # IndexedDB) e a leitura de tecla sem espera usa o getch com timeout, no lugar do select() sobre o stdin. # data/splash.txt e data/versions.txt, que o CMake geraria dos modelos .in, saem por sed (a data e a da # versao no CHANGELOG, 2021-06-02). # # Saida: artifacts/build/umoria-5.7.15-3bf8abc/umoria.{js,wasm,data}, que o bundle.yaml confere pelo SHA-256. set -euo pipefail COMMIT=3bf8abc4f76812810e59d738492c7b61fb8f1bb6 SRC_SHA256=5ec7480f789e5c9d435ff149dea0dd620e5b6d34f914deaa9b8ff5c1a2688eba VERSION=5.7.15 VERSION_DATE=2021-06-02 EMSCRIPTEN=6.0.10 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/umoria-$VERSION-${COMMIT:0:7}" cache="$root/artifacts/cache/umoria" tarball="$cache/umoria-$COMMIT.tar.gz" if ! emcc --version 2>/dev/null | head -1 | grep -q " $EMSCRIPTEN "; then echo "Precisa do Emscripten $EMSCRIPTEN no PATH (source /emsdk_env.sh)." >&2 exit 1 fi if [ ! -f "$tarball" ]; then mkdir -p "$cache" curl -fsSL -o "$tarball.part" "https://github.com/dungeons-of-moria/umoria/archive/$COMMIT.tar.gz" mv "$tarball.part" "$tarball" fi echo "$SRC_SHA256 $tarball" | shasum -a 256 -c - >&2 rm -rf "$out" mkdir -p "$out/work/obj" "$out/work/src" "$out/root/data" S="$out/work/src" tar xzf "$tarball" -C "$S" --strip-components=1 grep -q "CURRENT_VERSION_PATCH = ${VERSION##*.};" "$S/src/version.h" grep -q "^## $VERSION ($VERSION_DATE)" "$S/CHANGELOG.md" patch -d "$S" -p1 --no-backup-if-mismatch < "$here/umoria/umoria-fredygames.patch" >&2 mkdir -p "$out/work/shim" cp "$here/umoria/ncurses.h" "$here/umoria/emcurses.cpp" "$out/work/shim/" for f in splash versions; do sed -e "s|\${umoria_version}|$VERSION|g; s|\${current_date}|$VERSION_DATE|g" "$S/data/$f.txt.in" > "$out/root/data/$f.txt" done for f in help help_wizard rl_help rl_help_wizard welcome death_tomb death_royal; do cp "$S/data/$f.txt" "$out/root/data/" done cp "$S/data/scores.dat" "$S/LICENSE" "$S/AUTHORS" "$out/root/" FLAGS=(-O2 -w -ffile-prefix-map="$out/work/=" -I"$out/work/shim") objs=() for f in "$S"/src/*.cpp "$out/work/shim/emcurses.cpp"; do o="$out/work/obj/$(basename "$f").o" objs+=("$o") em++ "${FLAGS[@]}" -c "$f" -o "$o" done # Liga de dentro da pasta dos dados, com caminhos relativos (o carregador do .data guarda o nome daqui). ( cd "$out/root" em++ -O2 "${objs[@]}" -lidbfs.js \ -sASYNCIFY -sASYNCIFY_STACK_SIZE=262144 -sALLOW_MEMORY_GROWTH=1 -sENVIRONMENT=web \ -sEXPORTED_RUNTIME_METHODS=FS \ --preload-file data --preload-file scores.dat --preload-file LICENSE --preload-file AUTHORS \ -o ../umoria.js ) rm -rf "$out/work" "$out/root" shasum -a 256 "$out/umoria.js" "$out/umoria.wasm" "$out/umoria.data"