#!/usr/bin/env bash # Compila o Berusky do fredygames.com: o quebra-cabeca de joaninhas e caixas da AnakreoN (codigo, # graficos e fases sob a GPL-2.0-or-later, conforme os cabecalhos do codigo e os COPYING de cada pasta # de data/) em WebAssembly, com o Emscripten 6.0.10 e as portas SDL2 2.32.10 e SDL2_image 2.6.0 # (libpng 1.6.58, zlib 1.3.2) dele. Este script, o patch e o shim ao lado dele 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-berusky.sh # # Fonte: o tarball da tag v1.7.2 do stransky/berusky no GitHub (berusky-1.7.2.tar.gz), conferido pelo # SHA-256 e guardado em artifacts/cache/berusky/ (o site hospeda o mesmo arquivo). Na pasta de fontes # do site, o script acha o tarball, o patch e o shim ao lado dele. # # O jogo usa a SDL 1.2, que o Emscripten nao tem: sdl12shim.h/.c implementam sobre a SDL2 so o que ele # chama (modo de video, flags de superficie, DisplayFormat, SetAlpha, estado do teclado, repeticao de # teclas). Os e do jogo apontam para o shim. O config.h, que o configure # geraria, e escrito aqui com o essencial (nome, versao, pasta de dados). Sem gettext: os textos ficam # no ingles original. O jogo nao tem som (o codigo de audio ja vem desligado pelo autor). # # berusky-fredygames.patch (so ativo com __EMSCRIPTEN__, menos o berusky.ini): # - main.cpp nao usa a GTK (so lia a linha de comando); # - input.cpp le o estado do teclado da SDL2, que e indexado por scancode, e ignora o # SDL_ACTIVEEVENT, que a SDL2 nao tem; # - o item "editor" do menu some (o editor de fases roda como outro programa); # - fredygames_save(), que a pagina chama quando a aba some ou fecha: o jogo so grava o ultimo # perfil usado ao sair (o progresso de cada perfil ele grava ao fim de cada fase); # - data/berusky.ini comeca no modo de alta resolucao (1280x960) sem perguntar. # # Dados: data/GameData, data/Graphics e data/Levels vao num berusky.data que o proprio Emscripten # carrega (--preload-file), em /usr/share/berusky, com o berusky.ini global ao lado. O perfil e as # opcoes ficam em ~/.berusky (/home/web_user/.berusky), que a pagina monta no IndexedDB. # # Saida: artifacts/build/berusky-1.7.2/berusky.{js,wasm,data}, que o bundle.yaml do jogo confere pelo # SHA-256. set -euo pipefail VERSION=1.7.2 SRC_SHA256=fdec608edf444772838b9c92a5b2b6f0542ffd97bc3a6779c882762c7f9c08d4 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/berusky-$VERSION" cache="$root/artifacts/cache/berusky" tarball="berusky-$VERSION.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 # Arquivo auxiliar: em berusky/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/berusky/$1" ]; then echo "$here/berusky/$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/stransky/berusky/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" tar xzf "$src_tar" -C "$out" s="berusky-$VERSION" patch -d "$out/$s" -p1 --no-backup-if-mismatch < "$(aux berusky-fredygames.patch)" >&2 # Includes: o shim, os do jogo apontando para ele e o config.h. mkdir -p "$out/include/SDL" cp "$(aux sdl12shim.h)" "$(aux sdl12shim.c)" "$out/include/" printf '#include "sdl12shim.h"\n' > "$out/include/SDL/SDL.h" printf '#include "sdl12shim.h"\n' > "$out/include/SDL/SDL_image.h" cat > "$out/include/config.h" <