#!/usr/bin/env bash # Compila o xsoldier 1.8 do fredygames.com (o shoot 'em up vertical de Yuusuke Hashimoto e Oohara Yuuma, sob a # GNU GPL versao 2 ou posterior) em WebAssembly, pelo caminho SDL 1.2 do proprio jogo (o --with-sdl do # configure), 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-xsoldier.sh # # Fonte: o xsoldier_1.8.orig.tar.gz do Debian (o mesmo arquivo do jogo no Debian main), conferido pelo SHA-256 e # guardado em artifacts/cache/xsoldier/. Na pasta de fontes do site, o script acha o tarball e o patch ao # lado dele. # # xsoldier-fredygames.patch: # - config.h: as definicoes que o configure geraria (com SDL), escritas aqui; # - fredy-x11/: cabecalhos X11 vazios (o jogo os inclui mesmo no caminho SDL, que nao usa nada deles); # - fredy.c (novo): o leitor de XPM (o SDL_image do Emscripten nao le XPM; pixels "None" e pretos, que o # jogo trata como transparentes por uma chave de cor que o SDL do Emscripten ignora, ficam com alfa 0) e # a espera entre quadros (o jogo usa um sinal de timer e pause(), que o navegador nao tem; aqui e um sleep do # Asyncify de 35 ms, o WAIT do proprio jogo); # - main.c, ending.c, game.c, opening.c, image.c, extern.h: usam o fredy.c no Emscripten e nao instalam o timer; # - manage.c: o nome nos recordes e "player" (o navegador nao tem nome de usuario); # - input.c: os nomes das teclas na tela "How To Play" sao escritos (o SDL 1.2 do navegador nao tem nomes de teclas). # As imagens (pixmap/*.xpm) e o scorefile.txt (a lista inicial de recordes) vao num xsoldier.data que o proprio # Emscripten carrega (--preload-file). Os recordes ficam em /fs/games/xsoldier/xsoldier.scores, que a pagina # monta no IndexedDB. # # Saida: artifacts/build/xsoldier-1.8/xsoldier.{js,wasm,data}, que o bundle.yaml do jogo confere pelo SHA-256. set -euo pipefail export TZ=UTC LC_ALL=C VERSION=1.8 SRC_SHA256=4d1a60513a2738e5dc09a25b4ab7bdbcd88705a5cc7ef0ad6f27263b914cdae6 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/xsoldier-$VERSION" cache="$root/artifacts/cache/xsoldier" tarball="xsoldier_$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/xsoldier/$1" ]; then echo "$here/xsoldier/$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/x/xsoldier/$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/xsoldier-$VERSION" tar xzf "$src_tar" -C "$out/xsoldier-$VERSION" --strip-components=1 patch -d "$out/xsoldier-$VERSION" -p1 --no-backup-if-mismatch < "$(aux xsoldier-fredygames.patch)" >&2 # Compila de dentro da pasta de saida, com caminhos relativos. ( cd "$out" s="xsoldier-$VERSION" mkdir obj data for f in $(LC_ALL=C ls "$s"/*.c); do emcc -O2 -w -ffile-prefix-map="$out/=" -I"$s" -I"$s/fredy-x11" -include "$s/config.h" -sUSE_SDL=1 \ -DDATADIR='"/data"' -DLOCALSTATEDIR='"/fs"' -c "$f" -o "obj/$(basename "$f" .c).o" done mkdir -p data/games/xsoldier cp "$s"/pixmap/*.xpm data/games/xsoldier/ emcc -O2 $(LC_ALL=C ls obj/*.o) -sUSE_SDL=1 -lidbfs.js -sASYNCIFY -sALLOW_MEMORY_GROWTH \ -sENVIRONMENT=web -sEXIT_RUNTIME=1 -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file data@/data --preload-file "$s/scorefile.txt@/scorefile.txt" -o xsoldier.js rm -rf obj data "$s" ) shasum -a 256 "$out/xsoldier.js" "$out/xsoldier.wasm" "$out/xsoldier.data"