#!/usr/bin/env bash # Compila o Angband 4.2.5 do fredygames.com (Ben Harrison, James E. Wilson, Robert A. Koeneke e a equipe do # Angband, sob a GNU GPL versao 2, a opcao do licenciamento duplo que permite uso comercial) em # WebAssembly, com o front-end SDL2 do proprio jogo, o Emscripten 6.0.10 e as portas SDL2 2.32.10, # SDL2_ttf 2.20.2 (com FreeType 2.14.3 e HarfBuzz 3.2.0, que leem as fontes .fon do jogo) e SDL2_image 2.6.0 dele. Este script, o # patch e os arquivos de angband/ 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-angband.sh # # Fonte: o tarball da tag 4.2.5 de github.com/angband/angband, conferido pelo SHA-256 e guardado em # artifacts/cache/angband/. # # Fica de fora da pasta lib/ (o que o jogo nao precisa ou nao podemos distribuir): # - tiles/shockbolt (64x64): licenca de Raymond Gaustadnes so vale com o Angband, sem cobranca e sem uso # comercial; e o list.txt perde as duas linhas dele; # - sounds/ (CC BY-NC-SA, de Dubtrain): nao permite uso comercial; # - user/, os Makefile e, de icons/, tudo menos o att-128.png (o papel de parede padrao do front-end; # o patch tira so o icone da janela, que num canvas nao existe). # Ficam as fontes .fon (GPL), os tiles "Original", de Adam Bolt (qualquer uso), de David Gervais (CC BY 3.0, # com credito) e de Nomad, o gamedata, a ajuda e as telas. # # angband/angband-fredygames.patch: ver o proprio arquivo. # O jogo grava personagens e preferencias em ~/.angband (HOME = /home/web_user), que a pagina monta no IndexedDB. # Os dados vao num angband.data que o proprio Emscripten carrega (--preload-file) em /angband/lib. # # Saida: artifacts/build/angband-4.2.5/angband.{js,wasm,data}, que o bundle.yaml do jogo confere pelo SHA-256. set -euo pipefail VERSION=4.2.5 SRC_SHA256=2a27ce296310c4cbf960e2eb41ef55d383e546f24533446cf224119498a99651 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/angband-$VERSION" cache="$root/artifacts/cache/angband" 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 "$cache/angband-$VERSION.tar.gz" ]; then mkdir -p "$cache" curl -fsSL -o "$cache/angband-$VERSION.tar.gz.part" "https://github.com/angband/angband/archive/refs/tags/$VERSION.tar.gz" mv "$cache/angband-$VERSION.tar.gz.part" "$cache/angband-$VERSION.tar.gz" fi echo "$SRC_SHA256 $cache/angband-$VERSION.tar.gz" | shasum -a 256 -c - >&2 rm -rf "$out" mkdir -p "$out/work/obj" tar xzf "$cache/angband-$VERSION.tar.gz" -C "$out/work" G="$out/work/angband-$VERSION" patch -d "$G" -p1 --binary --no-backup-if-mismatch < "$here/angband/angband-fredygames.patch" >&2 # lib/ sem o que nao entra (ver acima) rm -rf "$G/lib/tiles/shockbolt" "$G/lib/sounds" "$G/lib/user" "$G/lib/fonts/16x16xw.woff" find "$G/lib/icons" -type f ! -name att-128.png -delete find "$G/lib" -name 'Makefile*' -delete PORTS=(-sUSE_SDL=2 -sUSE_SDL_TTF=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS='["png"]') FLAGS=(-O2 -w -std=gnu99 -fexceptions -ffile-prefix-map="$out/work/=" "${PORTS[@]}" -I"$G/src" -DUSE_SDL2 -DUSE_PRIVATE_PATHS -DGAMEDATA_IN_LIB -DBUILD_ID="\"$VERSION\"" -DDEFAULT_CONFIG_PATH='"/angband/lib/"' -DDEFAULT_LIB_PATH='"/angband/lib/"' -DDEFAULT_DATA_PATH='"/angband/lib/"') # A lista do CMakeLists.txt do jogo (o nucleo), sem o borg, mais o main.c e o front-end SDL2. srcs=$(sed -n '/ADD_LIBRARY(OurCoreLib OBJECT/,/^)/p' "$G/CMakeLists.txt" | grep -oE 'src/[A-Za-z0-9_/-]+\.c' | grep -v '^src/borg/') objs=() jobs=0 for f in $srcs src/main.c src/main-sdl2.c; do o="$out/work/obj/${f//\//_}.o" objs+=("$o") emcc "${FLAGS[@]}" -c "$G/$f" -o "$o" & jobs=$((jobs + 1)) if [ "$jobs" -ge 8 ]; then wait; jobs=0; fi done wait for o in "${objs[@]}"; do [ -f "$o" ] || { echo "Falhou: $o" >&2; exit 1; }; done # Liga de dentro da pasta de saida, com caminhos relativos. mkdir -p "$out/lib" cp -R "$G/lib/." "$out/lib/" ( cd "$out" emcc -O2 -fexceptions ${LINK_EXTRA:-} "${objs[@]}" "${PORTS[@]}" -lidbfs.js -sASYNCIFY -sALLOW_MEMORY_GROWTH=1 \ -sINITIAL_MEMORY=67108864 -sSTACK_SIZE=1048576 \ -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ -sEXPORTED_RUNTIME_METHODS=FS,ENV,addRunDependency,removeRunDependency,callMain \ --preload-file lib@/angband/lib \ -o angband.js ) rm -rf "$out/lib" "$out/work" shasum -a 256 "$out/angband.js" "$out/angband.wasm" "$out/angband.data"