#!/usr/bin/env bash # Compila o Don Ceferino Hazana do fredygames.com: o jogo de Hugo Ruscitti (programacao) e Walter # Velazquez (graficos e historia), com musica de Javier Da Silva, todo ele sob a GPL-2.0-or-later (o # README e os LICENSE-KIND.FILES de cada pasta de data/), 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) e SDL2_mixer 2.8.0 # (libmodplug, para a musica em XM) dele. Este script, o patch e a camada de compatibilidade # (ceferino/compat) 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-ceferino.sh # # Fonte: o tarball da revisao 37 do repositorio do jogo (o site dos autores, losersjuegos.com.ar, saiu do # ar; o arquivo e o que o Debian guarda como ceferino_0.97.8+svn37.orig.tar.gz), conferido pelo SHA-256 # e guardado em artifacts/cache/ceferino/. Na pasta de fontes do site, o script acha tudo ao lado dele. # # O jogo e escrito para o SDL 1.2. A camada de compatibilidade, escrita para este build # (compat/cfsdl12.h e .c, e os cabecalhos SDL/SDL.h, SDL/SDL_image.h e SDL/SDL_mixer.h, que incluem o do # SDL2 e a camada): a tela de 16 bits que cada SDL_Flip envia ao canvas, o teclado indexado pelos codigos # do SDL 1.2 e as funcoes de superficie do SDL 1.2. # ceferino-fredygames.patch (so ativo com __EMSCRIPTEN__): # - mundo.cc: o jogo pausa quando a pagina perde o foco (o SDL2 avisa por outro evento); # - menu.cc: sem o item "options", que so mandava rodar o programa ceferinosetup. # O jogo fica em ingles: as traducoes (gettext) nao entram. Os dados de data/ vao num ceferino.data que # o proprio Emscripten carrega (--preload-file) em /usr/share/games/ceferino; os recordes ficam na pasta # HOME, que a pagina aponta para /home/web_user/ceferino. # # Saida: artifacts/build/ceferino-0.97.8+svn37/ceferino.{js,wasm,data}, que o bundle.yaml do jogo # confere pelo SHA-256. set -euo pipefail VERSION=0.97.8+svn37 SRC_SHA256=b52ccce6051e78d8c368d76335d027442162e6bac44709ef06627a8fa8cb2fc6 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/ceferino-$VERSION" cache="$root/artifacts/cache/ceferino" tarball="ceferino_$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 # Arquivo auxiliar: em ceferino/, ceferino/compat/ ou ceferino/compat/SDL/ (repositorio) ou ao lado do # script (pasta de fontes do site, onde tudo fica numa pasta so). aux() { local f for f in "$here/ceferino/$1" "$here/ceferino/compat/$1" "$here/ceferino/compat/SDL/$1" "$here/$1"; do if [ -f "$f" ]; then echo "$f"; return; fi done echo "Nao achei $1." >&2 exit 1 } if [ -f "$here/$tarball" ]; then game_tar="$here/$tarball" else game_tar="$cache/$tarball" if [ ! -f "$game_tar" ]; then mkdir -p "$cache" curl -fsSL -o "$game_tar.part" "https://deb.debian.org/debian/pool/main/c/ceferino/$tarball" mv "$game_tar.part" "$game_tar" fi fi echo "$SRC_SHA256 $game_tar" | shasum -a 256 -c - >&2 rm -rf "$out" mkdir -p "$out/work/compat/SDL" "$out/work/obj" tar xzf "$game_tar" -C "$out/work" G="$out/work/ceferino-$VERSION" C="$out/work/compat" patch -d "$G" -p1 --binary --no-backup-if-mismatch < "$(aux ceferino-fredygames.patch)" >&2 cp "$(aux cfsdl12.h)" "$(aux cfsdl12.c)" "$C/" for f in SDL.h SDL_image.h SDL_mixer.h; do cp "$(aux "$f")" "$C/SDL/$f"; done PORTS=(-sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS='["png","jpg"]' -sUSE_SDL_MIXER=2 -sSDL2_MIXER_FORMATS='["mod"]') FLAGS=(-O2 -w -fexceptions -ffile-prefix-map="$out/work/=" "${PORTS[@]}" -I"$C" -DDATADIR='"/usr/share/games/ceferino"' -DVERSION='"0.97.9"' -DLOCALEDIR='"/usr/share/locale"') # Arquivos: os do programa ceferino no src/Makefile.am (sem o editor e o ceferinosetup) e a camada. objs=() jobs=0 add() { # arquivo local f="$1" rel o rel="${f#"$out/work/"}" o="$out/work/obj/${rel//\//_}.o" objs+=("$o") case "$f" in *.c) emcc "${FLAGS[@]}" -c "$f" -o "$o" & ;; *) em++ "${FLAGS[@]}" -c "$f" -o "$o" & ;; esac jobs=$((jobs + 1)) if [ "$jobs" -ge 8 ]; then wait; jobs=0; fi } for f in $(sed -n '/^ceferino_SOURCES = /,/^$/p' "$G/src/Makefile.am" | grep -oE '[a-z_0-9]+\.cc'); do add "$G/src/$f" done add "$C/cfsdl12.c" 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: o carregador do ceferino.data guarda o nome # que a pasta tem aqui. mkdir -p "$out/data" cp -R "$G/data/." "$out/data/" find "$out/data" -name Makefile.am -delete ( cd "$out" em++ -O2 -fexceptions "${objs[@]}" "${PORTS[@]}" -lidbfs.js -sASYNCIFY -sALLOW_MEMORY_GROWTH=1 \ -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ -sEXPORTED_RUNTIME_METHODS=FS,ENV,addRunDependency,removeRunDependency \ --preload-file data@/usr/share/games/ceferino \ -o ceferino.js ) rm -rf "$out/data" "$out/work" shasum -a 256 "$out/ceferino.js" "$out/ceferino.wasm" "$out/ceferino.data"