#!/usr/bin/env bash # Compila o LMarbles do fredygames.com: o quebra-cabeca no estilo do Atomix de Michael Speck (LGames; # GPL-2.0-or-later; codigo, sons, fases e os demais graficos do proprio autor) em WebAssembly, com o # Emscripten 6.0.10 e as portas SDL2 2.32.10 e SDL2_mixer 2.8.0 (so WAV) dele. Este script, o patch, a # lista removed.txt e o make-images.py 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-lmarbles.sh # # Fonte: o tarball da versao 1.2 (lmarbles-1.2.tar.gz, publicado pelo autor no SourceForge; a 1.2 ja # usa SDL2), conferido pelo SHA-256 e guardado em artifacts/cache/lmarbles/, ou o # lmarbles-1.2-pruned.tar.gz que o site hospeda (o mesmo, sem o que esta em removed.txt). Na pasta de # fontes do site, o script acha o tarball, o patch, a lista e o make-images.py ao lado dele. Os dois # geram os mesmos bytes. Tambem precisa do Python de artifacts/tools/venv (Pillow 12.3.0), ou de outro # em $PYTHON, para as imagens. # # removed.txt (sai do build e do fonte hospedado): o fundo do menu (gfx/title.bmp, foto de marmore), o # painel lateral (gfx/board.bmp, foto de pedra) e os fundos das tres familias de fases (gfx/stone, # gfx/metal e gfx/wood: fotos da Terra, de uma protuberancia solar e de Venus, aparentemente da NASA e # do SOHO). Sao fotos sem nenhum credito no pacote; o make-images.py desenha substitutas do mesmo # tamanho so com ruido procedural. # # lmarbles-fredygames.patch (so ativo com __EMSCRIPTEN__): # - a janela e sempre 640x480, o tamanho em que o jogo desenha (a pagina escala o canvas); a opcao # Fullscreen sai do menu e a tecla F nao muda nada; # - fredygames_save(), que a pagina chama quando a aba some ou fecha: grava as opcoes e o perfil (o # jogo grava o perfil ao vencer uma fase, mas as opcoes so ao sair). # # Opcoes: sem gettext (ENABLE_NLS desligado: so ingles); dados do jogo (gfx/, sounds/, levels/) em # /lmarbles, num lmarbles.data que o proprio Emscripten carrega (--preload-file); opcoes e perfil em # /home/web_user/.lmarbles, que a pagina monta no IndexedDB. -sASYNCIFY: os lacos do jogo nao retornam e # o SDL_Delay cede a vez ao navegador. # # Saida: artifacts/build/lmarbles-1.2/lmarbles.{js,wasm,data}, que o bundle.yaml do jogo confere pelo # SHA-256. set -euo pipefail VERSION=1.2 SRC_SHA256=9a03852bb22f22c90257af5c49c3571bdfaee182a5c6ec81ece21008d38798b0 # lmarbles-1.2-pruned.tar.gz (gerado pelo FredGames.Bundler a partir do original, deterministico). PRUNED_SHA256=39a670e8965682e7df87881d57c7bbbcaf08acea336582c2ca235c5c3cf407a9 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/lmarbles-$VERSION" cache="$root/artifacts/cache/lmarbles" tarball="lmarbles-$VERSION.tar.gz" pruned="lmarbles-$VERSION-pruned.tar.gz" python="${PYTHON:-$root/artifacts/tools/venv/bin/python}" 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 # Arquivo auxiliar: em lmarbles/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/lmarbles/$1" ]; then echo "$here/lmarbles/$1"; else echo "$here/$1"; fi } if [ -f "$here/$pruned" ]; then src_tar="$here/$pruned" elif [ -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://downloads.sourceforge.net/project/lgames/lmarbles/$tarball" mv "$src_tar.part" "$src_tar" fi fi src_sha="$(shasum -a 256 "$src_tar" | cut -d' ' -f1)" if [ "$src_sha" != "$SRC_SHA256" ] && [ "$src_sha" != "$PRUNED_SHA256" ]; then echo "$src_tar nao e o tarball original nem o pruned do LMarbles $VERSION ($src_sha)." >&2 exit 1 fi rm -rf "$out" mkdir -p "$out" tar xzf "$src_tar" -C "$out" s="lmarbles-$VERSION" while read -r path; do [ -n "$path" ] && rm -f "${out:?}/$s/$path" done < "$(aux removed.txt)" patch -d "$out/$s" -p1 --no-backup-if-mismatch < "$(aux lmarbles-fredygames.patch)" # Imagens substitutas (outra Pillow pode gerar outros bytes). "$python" -I "$(aux make-images.py)" "$out/$s/src/gfx" shasum -a 256 -c - >&2 < "$out/$s/config.h" <