#!/usr/bin/env bash # Compila o Sil-Q 1.5.0 do fredygames.com (o roguelike de Sil, de Sil's autores "half" e "Scatha" e da equipe do # Angband, que e um jogo derivado do Angband 3.0; usado aqui sob a GNU GPL versao 2, a opcao do licenciamento # duplo "GPL ou licenca do Angband") em WebAssembly com o Emscripten 6.0.10, so em texto (ASCII), 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-sil-q.sh # # Fonte: o tarball da tag v1.5.0 de github.com/sil-quirk/sil-q, conferido pelo SHA-256 e guardado em # artifacts/cache/sil-q/. Na pasta de fontes do site, o script acha o tarball e o patch ao lado dele. # # Usa a interface de terminal do proprio jogo (src/main-gcu.c, a do "curses"), com USE_GETCH. Fica de fora da pasta # lib/ tudo o que nao e para esta build de texto: os tiles (lib/xtra/graf, de Adam Bolt e David Gervais, com # licencas proprias), os sons (lib/xtra/sound, "freeware"), as fontes (lib/xtra/font), os manuais em PDF e as pastas de # dados do jogador. Ficam lib/edit (os dados do jogo), lib/pref e lib/xtra/tutorial. # # sil-q-fredygames.patch (so ativo com __EMSCRIPTEN__): # - init2.c: os dados do jogo ficam em /sil/lib/ (preload); os jogos salvos, a tabela de recordes e os arquivos do # jogador ficam em /sil-user/, que a pagina guarda no navegador (IndexedDB); os arquivos "raw" que o jogo gera dos # textos de lib/edit ficam na memoria (/sil-data/) e sao refeitos a cada visita; # - util.c: o nome de usuario padrao e "Player"; config.h: sem o SAFE_SETUID (o navegador nao tem ids de usuario); # - main.c: as setas e Home/End/PgUp/PgDn andam (o teclado numerico do jogo original). # # Saida: artifacts/build/sil-q-1.5.0/sil.{js,wasm,data}, que o bundle.yaml do jogo confere pelo SHA-256. set -euo pipefail export LC_ALL=C TZ=UTC VERSION=1.5.0 SRC_SHA256=d54e352ac5554b69f4b78916700d59f2395cf5d2c941a8ed9b4ee6646bc04319 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/sil-q-$VERSION" cache="$root/artifacts/cache/sil-q" tarball="sil-q-$VERSION.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/sil-q/$1" ]; then echo "$here/sil-q/$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/sil-quirk/sil-q/archive/refs/tags/v$VERSION.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" S="$out/work/src" mkdir -p "$S" tar xzf "$src_tar" -C "$S" --strip-components=1 patch -d "$S" -p1 --no-backup-if-mismatch < "$(aux sil-q-fredygames.patch)" >&2 objs=() for f in z-util z-virt z-form z-rand z-term variable tables util cave object1 object2 monster1 monster2 xtra1 xtra2 \ spells1 spells2 melee1 melee2 save files cmd1 cmd2 cmd3 cmd4 cmd5 cmd6 birth load squelch wizard1 wizard2 obj-info \ generate dungeon init1 init2 randart use-obj main-gcu main; do objs+=("$out/work/obj/$f.o") emcc "${CW_CFLAGS[@]}" -std=gnu99 -DUSE_GCU -DUSE_NCURSES -DUSE_GETCH -DUSE_CURS_SET -DDEFAULT_PATH='"/sil/lib/"' \ -ffile-prefix-map="$out/work/=" -c "$S/src/$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" # Dados: so o que a versao de texto usa mkdir -p "$out/work/data/lib/xtra" cp -R "$S/lib/edit" "$S/lib/pref" "$out/work/data/lib/" cp -R "$S/lib/xtra/tutorial" "$out/work/data/lib/xtra/" ( cd "$out/work" emcc obj/*.o "${CW_LDFLAGS[@]}" -sEMULATE_FUNCTION_POINTER_CASTS=1 --preload-file data/lib@/sil/lib -o ../sil.js ) rm -rf "$out/work" shasum -a 256 "$out/sil.js" "$out/sil.wasm" "$out/sil.data"