#!/usr/bin/env bash # Compila o Rogue 5.4.4 do fredygames.com: o Rogue original (Michael Toy, Ken Arnold e Glenn Wichman, 1980-1999, # licenca BSD de 3 clausulas) em WebAssembly com o Emscripten 6.0.10, sobre a camada de terminal de # curses-web/ (curses de um terminal desenhado num canvas; ver curses-web/README.md). Este NAO e o "rogue # clone" do NetBSD/OpenBSD, que tem outra licenca. # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # src/FredGames.Bundler/Builds/build-rogue.sh # # Fonte: o commit f4653c2 de github.com/Davidslv/rogue (arquivo do Rogue 5.4.4 do site dos autores, o # rogue5.4.4-src.tar.gz de rogue.rogueforge.net, byte a byte igual em todos os arquivos de codigo), conferido # pelo SHA-256 e guardado em artifacts/cache/rogue/. rogue/rogue-fredygames.patch (so ativo com # __EMSCRIPTEN__): o jogo salvo e a tabela de recordes ficam em /rogue-saves (a pagina guarda a pasta no # IndexedDB), o jogador se chama "adventurer", o jogo salvo e retomado sozinho na proxima visita (salvar encerra # o jogo, como no original) e o "[Press return to continue]" final espera a tecla pela pagina em vez do stdin. # rogue/config.h faz o papel do ./configure. O jogo chama ponteiros de funcao com outras assinaturas (C # K&R), por isso -sEMULATE_FUNCTION_POINTER_CASTS=1. # # Saida: artifacts/build/rogue-5.4.4/rogue.{js,wasm}, que o bundle.yaml do jogo confere pelo SHA-256. set -euo pipefail COMMIT=f4653c2a2ee6981a73abe9dfda055134285e1e79 SRC_SHA256=051aef6d61affb3b6120f1bf7059eeab9d60db461b989a08fb60ec150cd1dfd1 VERSION=5.4.4 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/rogue-$VERSION" cache="$root/artifacts/cache/rogue" tarball="$cache/rogue-$COMMIT.tar.gz" . "$here/curses-web/flags.sh" 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/Davidslv/rogue/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" S="$out/work/src" mkdir -p "$S" tar xzf "$tarball" -C "$S" --strip-components=1 patch -d "$S" -p1 --no-backup-if-mismatch < "$here/rogue/rogue-fredygames.patch" >&2 cp "$here/rogue/config.h" "$S/config.h" objs=() for f in "$S"/*.c "$CW_DIR/curses.c"; do o="$out/work/obj/$(basename "$f").o" objs+=("$o") emcc "${CW_CFLAGS[@]}" -DHAVE_CONFIG_H -ffile-prefix-map="$out/work/=" -ffile-prefix-map="$CW_DIR/=curses-web/" -I"$S" -c "$f" -o "$o" done emcc "${objs[@]}" "${CW_LDFLAGS[@]}" -sEMULATE_FUNCTION_POINTER_CASTS=1 -o "$out/rogue.js" rm -rf "$out/work" shasum -a 256 "$out/rogue.js" "$out/rogue.wasm"