#!/usr/bin/env bash # Compila o Hack 1.0.3 do fredygames.com (Jay Fenlason, 1982, com Kenny Woodland, Mike Thome e Jon Payne; # Andries Brouwer, 1984-85) na versao da colecao bsd-games 2.17, em WebAssembly com o Emscripten 6.0.10, sobre # a camada de terminal de curses-web/ (termcap de um terminal ANSI desenhado num canvas; ver # curses-web/README.md). Licenca BSD de 3 clausulas (hack/COPYRIGHT e hack/COPYRIGHT-JF; COPYING da colecao). # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # src/FredGames.Bundler/Builds/build-hack.sh # # Fonte: bsdgames_2.17.orig.tar.gz do Debian (bsdgames/common.sh). hack/hack-fredygames.patch (so ativo no # navegador): sem tty, sem fork (nada de "!" nem ^Z), sem lock files nem link(), o jogo salvo, o "bones" e a # tabela de recordes em /hack-saves (a pagina guarda a pasta no IndexedDB), jogador "adventurer", teclas pela # pagina (hack.web.c) e o delay_output pela espera assincrona. hack.onames.h vem do makedefs do proprio jogo, # compilado no computador de quem constroi (a saida nao depende do compilador). pathnames.h: HACKDIR=/hack. # # Saida: artifacts/build/hack-1.0.3/hack.{js,wasm,data}, que o bundle.yaml do jogo confere pelo SHA-256. set -euo pipefail here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" . "$here/bsdgames/common.sh" bsdgames_init "$here" . "$here/curses-web/flags.sh" out="$root/artifacts/build/hack-1.0.3" rm -rf "$out" mkdir -p "$out/work/obj" "$out/work/src" "$out/root" S="$out/work/src" tar xzf "$tarball" -C "$S" --strip-components=1 bsd-games-$BSDGAMES_VERSION/hack bsd-games-$BSDGAMES_VERSION/COPYING patch -d "$S" -p1 --no-backup-if-mismatch < "$here/hack/hack-fredygames.patch" >&2 H="$S/hack" sed 's|@hack_dir@|/hack|' "$H/pathnames.h.in" > "$H/pathnames.h" cc -w -o "$out/work/makedefs" "$H/makedefs.c" "$out/work/makedefs" "$H/def.objects.h" > "$H/hack.onames.h" objs=() for f in "$H"/*.c; do [ "$(basename "$f")" = makedefs.c ] && continue o="$out/work/obj/$(basename "$f").o" objs+=("$o") emcc "${CW_CFLAGS[@]}" -ffile-prefix-map="$out/work/=" -I"$H" -I"$here/bsdgames" -c "$f" -o "$o" done # a camada de terminal: o Hack tem funcoes proprias chamadas timeout e unctrl emcc "${CW_CFLAGS[@]}" -ffile-prefix-map="$CW_DIR/=curses-web/" -Dtimeout=cw_timeout -Dunctrl=cw_unctrl -c "$CW_DIR/curses.c" -o "$out/work/obj/curses.c.o" emcc "${CW_CFLAGS[@]}" -ffile-prefix-map="$CW_DIR/=curses-web/" -c "$CW_DIR/termcap.c" -o "$out/work/obj/termcap.c.o" emcc "${CW_CFLAGS[@]}" -ffile-prefix-map="$here/=" -c "$here/hack/hack.web.c" -o "$out/work/obj/hack.web.c.o" objs+=("$out/work/obj/curses.c.o" "$out/work/obj/termcap.c.o" "$out/work/obj/hack.web.c.o") for f in data help hh rumors; do cp "$H/$f" "$out/root/$f"; done # Liga de dentro da pasta dos dados, com caminhos relativos (o carregador do .data guarda o nome daqui). ( cd "$out/root" emcc "${objs[@]}" "${CW_LDFLAGS[@]}" -sEMULATE_FUNCTION_POINTER_CASTS=1 \ --preload-file data@/hack/data --preload-file help@/hack/help --preload-file hh@/hack/hh --preload-file rumors@/hack/rumors \ -o ../hack.js 2>&1 | grep -v "^wasm-ld: warning\|^>>>" || true ) rm -rf "$out/work" "$out/root" shasum -a 256 "$out/hack.js" "$out/hack.wasm" "$out/hack.data"