#!/usr/bin/env bash # Compila o Omega 0.90-pa9 do fredygames.com (o roguelike de Laurence R. Brothers, de 1987-98, sob a GNU Library # General Public License versao 2; omega-rpg do Debian) 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-omega.sh # # Fonte: o omega-rpg_0.90-pa9.orig.tar.gz do Debian, conferido pelo SHA-256 e guardado em artifacts/cache/omega/. # Na pasta de fontes do site, o script acha o tarball e o patch ao lado dele. # # O Makefile do jogo gera, no computador de quem compila, duas coisas que vao no jogo: o maps.dat (as mapas # .map das cidades e masmorras fixas, cifrados pelo tools/crypt do proprio jogo, que sai igual a cada execucao) # e o clrgen.c/.h (a tabela de pares de cores, pelo genclr, a partir do preprocessador). Aqui os dois sao feitos do # mesmo jeito, com o cc do sistema; so o jogo vai para o WebAssembly. O date.c que o Makefile gera com a hora da # compilacao (tools/makedate) vem fixo no patch (build reprodutivel). # # omega-fredygames.patch (so ativo com __EMSCRIPTEN__, salvo onde dito): # - defs.h, glob.h, omega.c, file.c, mon.c: os dados do jogo ficam em /omega/lib/ (preload) e a tabela de # recordes, o log e o jogo salvo, em /omega-saves/, que a pagina guarda no navegador (IndexedDB); o jogo salvo # e retomado sozinho na visita seguinte (salvar encerra o jogo, como no original); # - char.c: o nome do personagem e "Adventurer" (o navegador nao tem nome de usuario); # - char.c e site2.c (todos os builds): a pergunta sobre a preferencia sexual do personagem sai e a Casa do # Eclipse e um clube de jogos e conversa (as falas de insinuacao dela e dos seduzidores nao aparecem); # - date.c: a data da build fixa. # Sai de fora o lib/omegatiles.xpm (os tiles da versao grafica, que a versao de texto nao usa) e os arquivos # .backup. O jogo chama ponteiros de funcao com outras assinaturas (C antigo), por isso # -sEMULATE_FUNCTION_POINTER_CASTS=1. # # Saida: artifacts/build/omega-0.90-pa9/omega.{js,wasm,data}, que o bundle.yaml do jogo confere pelo SHA-256. set -euo pipefail export LC_ALL=C TZ=UTC VERSION=0.90-pa9 SRC_SHA256=1c91efa6939a9ca550cd0fad910fcc94c735893f33f6f80974632a65cca6fc42 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/omega-$VERSION" cache="$root/artifacts/cache/omega" tarball="omega-rpg_$VERSION.orig.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/omega/$1" ]; then echo "$here/omega/$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://deb.debian.org/debian/pool/main/o/omega-rpg/$tarball" 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" S="$out/work/src" mkdir -p "$S" tar xzf "$src_tar" -C "$S" --strip-components=1 rm -rf "$S/CVS" "$S/lib/CVS" "$S/tools/CVS" "$S/docs/CVS" patch -d "$S" -p1 --no-backup-if-mismatch < "$(aux omega-fredygames.patch)" >&2 # Ferramentas do jogo, no computador de quem compila: maps.dat e clrgen.c/.h ( cd "$S/tools" cc -w -std=gnu89 -O2 crypt.c bwt.c -o crypt cd libsrc ../crypt maps.dat $(sed -n '/^MAPS/,/^$/p' Makefile | tr -d '\\' | sed 's/^MAPS *= *//' | tr -s ' \n' ' ') cp maps.dat ../../lib/maps.dat cd "$S" cc -w -std=gnu89 -O2 genclr.c -o genclr # como o Makefile do jogo: o preprocessador sobre todos os .c e .h (os que nao compilam so dao erro, ignorado) { cc -E -DBSD -DOMEGA_CLRGEN -I"$CW_DIR" $(ls *.[ch] | grep -v '^clrgen\.') 2>/dev/null || true; } | ./genclr clrgen.c clrgen.h ) # O jogo objs=() for o in omega abyss aux1 aux2 aux3 bank char city command1 command2 command3 country date effect1 effect2 \ effect3 etc env file gen1 gen2 guild1 guild2 house init inv item itemf1 itemf2 itemf3 lev map mmelee mmove mon \ move movef mspec mstrike mtalk newrand priest pdump save scr site1 site2 spell stats time trap util village clrgen; do objs+=("$out/work/obj/$o.o") emcc "${CW_CFLAGS[@]}" -std=gnu89 -DBSD -ffile-prefix-map="$out/work/=" -I"$S" -c "$S/$o.c" -o "$out/work/obj/$o.o" done emcc "${CW_CFLAGS[@]}" -ffile-prefix-map="$CW_DIR/=curses-web/" -c "$CW_DIR/curses.c" -o "$out/work/obj/curses.o" # Dados: lib/ sem os tiles e os .backup mkdir -p "$out/work/data/lib" (cd "$S/lib" && for f in $(ls); do case "$f" in omegatiles.xpm|*.backup|Makefile) ;; *) [ -f "$f" ] && cp "$f" "$out/work/data/lib/$f";; esac done) ( cd "$out/work" emcc obj/*.o "${CW_LDFLAGS[@]}" -sEMULATE_FUNCTION_POINTER_CASTS=1 --preload-file data/lib@/omega/lib -o ../omega.js ) rm -rf "$out/work" shasum -a 256 "$out/omega.js" "$out/omega.wasm" "$out/omega.data"