#!/usr/bin/env bash # Compila o Phantasia 3.3.2 do fredygames.com (o jogo de fantasia de Edward A. Estes, AT&T, 1986, "explicitly not # copyrighted", na versao do bsd-games de Linux de Joey Hess e Joseph Myers) 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 script, o patch e a camada fazem parte do codigo-fonte publicado junto do jogo. # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # src/FredGames.Bundler/Builds/build-phantasia.sh # # Fonte: o tarball do commit 56b8944 de github.com/vattam/BSDGames (o bsd-games com as mudancas para Linux), conferido # pelo SHA-256 e guardado em artifacts/cache/phantasia/; so a pasta phantasia/ entra no jogo. Na pasta de fontes do site, o # script acha o tarball e o patch ao lado dele. # # O pathnames.h vem do pathnames.h.in do jogo: os dados do jogo (monsters.asc) ficam em /phantasia/ (preload) e os arquivos # do reino (personagens, placar, mensagens) em /phantasia-data/, que a pagina guarda no navegador (IndexedDB). O # programa "setup" que o Makefile roda no computador de quem compila nao e preciso: o proprio jogo faz o que ele faz, a cada # visita (a base binaria de monstros, na memoria, e os arquivos do reino, vazios se faltarem). # # phantasia-fredygames.patch (so ativo com __EMSCRIPTEN__): # - main.c: o nome de usuario e "player"; o jogo nao exige um tty; Enter e nova linha (nl()); a base de monstros e os # arquivos do reino sao feitos como o setup faz; um personagem que nao saiu normalmente da ultima vez (aba fechada) nao # morre, porque so ha um jogador; # - io.c: as teclas vem do getch() do curses (e nao do getchar() do stdin); # - fight.c, interplayer.c, gamesupport.c, misc.c (todos os builds): a mecanica "virgin" (a pessoa resgatada que ajuda a # subjugar o unicornio) virou "captive" ("Will you escort them home safely ?"), com a mesma regra; # - misc.c: o arquivo de personagens e fechado e aberto de novo a cada gravacao, que e quando a pagina o guarda no # navegador, e o error() nao usa o printw() como ponteiro de funcao (na camada de curses, e uma macro). # # Saida: artifacts/build/phantasia-3.3.2/phantasia.{js,wasm,data}, que o bundle.yaml do jogo confere pelo SHA-256. set -euo pipefail export LC_ALL=C TZ=UTC VERSION=3.3.2 COMMIT=56b8944332186891cd5c0094bd3991e3c5f5a799 SRC_SHA256=af737b3ccc45de41614efd85e01991bf7526078959fafd82a55b582ea4f32803 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/phantasia-$VERSION" cache="$root/artifacts/cache/phantasia" tarball="bsdgames-56b8944.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 aux() { if [ -f "$here/phantasia/$1" ]; then echo "$here/phantasia/$1"; else echo "$here/$1"; fi } if [ -f "$here/$tarball" ]; then src_tar="$here/$tarball" else src_tar="$cache/$tarball" if [ ! -f "$src_tar" ]; then mkdir -p "$cache" curl -fsSL -o "$src_tar.part" "https://github.com/vattam/BSDGames/archive/$COMMIT.tar.gz" mv "$src_tar.part" "$src_tar" fi fi echo "$SRC_SHA256 $src_tar" | shasum -a 256 -c - >&2 rm -rf "$out" mkdir -p "$out/work/obj" "$out/work/gen" S="$out/work/src" mkdir -p "$S" tar xzf "$src_tar" -C "$S" --strip-components=1 "BSDGames-$COMMIT/phantasia" patch -d "$S" -p1 --no-backup-if-mismatch < "$(aux phantasia-fredygames.patch)" >&2 P="$S/phantasia" sed -e 's|@gamesdir@|/phantasia|; s|@phantasia_dir@|/phantasia-data|; s|"/phantasia-data/monsters"|"/phantasia/monsters"|' \ "$P/pathnames.h.in" > "$out/work/gen/pathnames.h" grep -q '"/phantasia/monsters"' "$out/work/gen/pathnames.h" || sed -i.bak 's|"/phantasia-data/monsters"|"/phantasia/monsters"|' "$out/work/gen/pathnames.h" grep -q '"/phantasia/monsters"' "$out/work/gen/pathnames.h" for f in fight gamesupport interplayer io main misc phantglobs; do emcc "${CW_CFLAGS[@]}" -std=gnu89 -I"$out/work/gen" -I"$P" -ffile-prefix-map="$out/work/=" \ -c "$P/$f.c" -o "$out/work/obj/$f.o" done emcc "${CW_CFLAGS[@]}" -ffile-prefix-map="$CW_DIR/=curses-web/" -c "$CW_DIR/curses.c" -o "$out/work/obj/curses.o" mkdir -p "$out/work/data" cp "$P/monsters.asc" "$out/work/data/monsters.asc" ( cd "$out/work" emcc obj/*.o "${CW_LDFLAGS[@]}" -lm --preload-file data/monsters.asc@/phantasia/monsters.asc -o ../phantasia.js ) rm -rf "$out/work" shasum -a 256 "$out/phantasia.js" "$out/phantasia.wasm" "$out/phantasia.data"