#!/usr/bin/env bash # Compila o LBreakoutHD do fredygames.com: o Breakout de Michael Speck (LGames; GPL-3.0-or-later; tema # Classic do proprio autor ou de dominio publico, tema Standard com imagens de dominio publico, fontes # Source Sans Pro sob a SIL OFL) em WebAssembly, com o Emscripten 6.0.10 e as portas SDL2 2.32.10, # SDL2_image 2.6.0 (libpng 1.6.58, libjpeg 9f, zlib 1.3.2), SDL2_mixer 2.8.0 (so WAV) e SDL2_ttf # 2.20.2 (FreeType 2.14.3, HarfBuzz 3.2.0) dele. Este script, o patch, a lista removed.txt e o # make-menuback.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-lbreakouthd.sh # # Fonte: o tarball da versao 1.2.4 (lbreakouthd-1.2.4.tar.gz, publicado pelo autor no SourceForge), # conferido pelo SHA-256 e guardado em artifacts/cache/lbreakouthd/, ou o # lbreakouthd-1.2.4-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-menuback.py ao lado # dele. Os dois geram os mesmos bytes. Tambem precisa do Python de artifacts/tools/venv (Pillow # 12.3.0, com FreeType 2.14.3), ou de outro em $PYTHON, para o fundo do menu. # # removed.txt (sai do build e do fonte hospedado): # - 44 dos 137 conjuntos de fases enviados por jogadores: os que desenham ou citam personagens, # jogos, marcas ou pessoas reais de terceiros, simbolos politicos ou extremistas, ou que tem # titulos grosseiros ou sobre drogas (FatalDoomsday2 sai junto com o FatalDoomsday porque o # "remove" do Bundler tira por prefixo); # - a moldura do tema Standard (frame.png) e o fundo do menu (menuback.jpg), feitos a partir de uma # foto da Unsplash: sem a moldura o jogo monta a moldura padrao de tijolos, e o fundo do menu e # refeito por make-menuback.py so com material do proprio tema (back0.jpg, de dominio publico, # tijolos, raquete, bola e a fonte Source Sans Pro). # # lbreakouthd-fredygames.patch: # - tira os arquivos de removed.txt dos Makefile.am/Makefile.in (para o "make install" do fonte # hospedado continuar funcionando); # - so com __EMSCRIPTEN__: sem tela cheia, os modos de video viram 1080p e 720p (a pagina escala o # canvas); fredygames_save(), que a pagina chama quando a aba some ou fecha, grava as opcoes, os # recordes e, com um jogo em andamento, o jogo salvo (o jogo so grava opcoes e recordes ao sair); # os lacos que descartam o movimento do mouse a cada quadro guardam o ultimo (no navegador os # eventos chegam justamente enquanto o laco cede a vez, e o menu nunca via o ponteiro). # # Opcoes: sem gettext (ENABLE_NLS desligado: so ingles); dados do jogo (levels/, themes/) em # /lbreakouthd, num lbreakouthd.data que o proprio Emscripten carrega (--preload-file); opcoes, # recordes, jogo salvo e conjuntos do editor em /home/web_user/.lbreakouthd, 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/lbreakouthd-1.2.4/lbreakouthd.{js,wasm,data}, que o bundle.yaml do jogo # confere pelo SHA-256. set -euo pipefail VERSION=1.2.4 SRC_SHA256=4732c3852ba0030fecca65689591ac582c86af46b1a21b274640ffc6cd8fc826 # lbreakouthd-1.2.4-pruned.tar.gz (gerado pelo FredGames.Bundler a partir do original, deterministico). PRUNED_SHA256=51bc6c26c1b93e389d04aa2291d76051a0d34f71340a8d76428cf5f3b5507847 EMSCRIPTEN=6.0.10 # Resultado de make-menuback.py (outra Pillow/FreeType pode gerar outros bytes). MENUBACK_SHA256=f116938182525020484f6868774b2db5be3e2aa51c36aaab89167c5787d923db here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/lbreakouthd-$VERSION" cache="$root/artifacts/cache/lbreakouthd" tarball="lbreakouthd-$VERSION.tar.gz" pruned="lbreakouthd-$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 lbreakouthd/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/lbreakouthd/$1" ]; then echo "$here/lbreakouthd/$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/lbreakouthd/$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 LBreakoutHD $VERSION ($src_sha)." >&2 exit 1 fi rm -rf "$out" mkdir -p "$out/obj" tar xzf "$src_tar" -C "$out" s="lbreakouthd-$VERSION" while read -r path; do [ -n "$path" ] && rm -rf "${out:?}/$s/$path" done < "$(aux removed.txt)" patch -d "$out/$s" -p1 --no-backup-if-mismatch < "$(aux lbreakouthd-fredygames.patch)" "$python" -I "$(aux make-menuback.py)" "$out/$s/src/themes/Standard" "$out/$s/src/themes/Standard/menuback.jpg" echo "$MENUBACK_SHA256 $out/$s/src/themes/Standard/menuback.jpg" | shasum -a 256 -c - >&2 # O config.h que o configure geraria, so com o que o codigo usa. cat > "$out/$s/config.h" <