#!/usr/bin/env bash # Compila o Biloba 0.9.3 do fredygames.com (o jogo de tabuleiro abstrato para 2 a 4 jogadores de Guillaume # Demougeot, com o codigo de Colin Leroy; GNU GPL versao 2 ou posterior, graficos inclusive) em WebAssembly, # com o Emscripten 6.0.10 e o SDL 1.2 que ele traz. Este script e o patch 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-biloba.sh # # Fonte: o biloba_0.9.3.orig.tar.gz do Debian (o mesmo arquivo do jogo no Debian main), conferido pelo SHA-256 e # guardado em artifacts/cache/biloba/. Na pasta de fontes do site, o script acha o tarball e o patch ao lado # dele. # # biloba-fredygames.patch (arquivos novos: fredy_web.h e fredy_stubs.c): # - fredy_web.h (incluido com -include em todo arquivo): SDL_Delay e SDL_WaitEvent viram esperas do Asyncify # (o SDL 1.2 do Emscripten aborta no primeiro e nao tem o segundo bloqueante); # - fredy_stubs.c: no lugar de net.c, netops.c e server.c (partidas em rede, que o navegador nao faz) e de # sound.c, as funcoes de rede e de som que nao fazem nada. Os dois sons do pacote (eat.wav e type.wav) nao # tem autoria registrada e ficam de fora: o jogo e mudo; # - options.c: o botao "Save last game" tambem fica escondido (nao ha area de trabalho para gravar no navegador); # os botoes de criar/entrar em partida de rede e o de idioma ficam escondidos (so as imagens em # ingles vao no bundle); # - font.c, options.c, widget.c: as limpezas de tela com a cor 0x00000000 viram preto de verdade (no SDL 1.2 # do navegador essa cor tem alfa 0 e nao pinta nada, e o menu ficava por baixo do tabuleiro); # - utils.c: Esc e Ctrl-E so valiam com alguma tecla modificadora apertada junto (o jogo exigia keysym.mod # diferente de zero, o que no Linux so acontece por causa do NumLock); a condicao sobre o modificador sai; # - utils.h/utils.c: a definicao de `screen` num unico arquivo (o mesmo conserto do patch do Debian para o gcc 10); # - main.c: o SDL so inicia o video. # res/en/ (as imagens comuns mais as em ingles, que vencem em caso de nome igual: o jogo procura primeiro na # pasta do idioma e so depois na comum, e a busca que falha enche o console de avisos) vai num biloba.data que o proprio Emscripten carrega (--preload-file), na raiz, que # e a pasta de trabalho do jogo; as imagens sao decodificadas pelo navegador (--use-preload-plugins). # # Saida: artifacts/build/biloba-0.9.3/biloba.{js,wasm,data}, que o bundle.yaml do jogo confere pelo SHA-256. set -euo pipefail export TZ=UTC LC_ALL=C VERSION=0.9.3 SRC_SHA256=a088d91bf1df8e2df643da95b5b55494dca82e5e64f28b2ffa9308bd47e12c61 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/biloba-$VERSION" cache="$root/artifacts/cache/biloba" tarball="biloba_$VERSION.orig.tar.gz" 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/biloba/$1" ]; then echo "$here/biloba/$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/b/biloba/$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/biloba-$VERSION" tar xzf "$src_tar" -C "$out/biloba-$VERSION" --strip-components=1 s="biloba-$VERSION" patch -d "$out/$s" -p1 --no-backup-if-mismatch < "$(aux biloba-fredygames.patch)" >&2 # Compila de dentro da pasta de saida, com caminhos relativos. ( cd "$out" mkdir obj for f in board main utils tile pawn logic player arrow local_input options font llist game computer help msg widget replay fredy_stubs; do emcc -O2 -w -ffile-prefix-map="$out/=" -I"$s/src" -include "$s/src/fredy_web.h" -sUSE_SDL=1 \ -DVERSION='"'$VERSION'"' -c "$s/src/$f.c" -o "obj/$f.o" done mkdir -p res/en cp "$s"/res/common/*.png res/en/ cp "$s"/res/en/*.png res/en/ emcc -O2 $(LC_ALL=C ls obj/*.o) -sUSE_SDL=1 -lm -sASYNCIFY -sALLOW_MEMORY_GROWTH \ -sENVIRONMENT=web -sEXIT_RUNTIME=1 -sEXPORTED_RUNTIME_METHODS=FS --use-preload-plugins \ --preload-file res@/res -o biloba.js rm -rf obj res "$s" ) shasum -a 256 "$out/biloba.js" "$out/biloba.wasm" "$out/biloba.data"