#!/usr/bin/env bash # Compila o Zatacka X do fredygames.com: o jogo de linhas que crescem de Simen Heggestoyl e colaboradores # (codigo sob a GPL-3.0-or-later; graficos e audio sob a CC BY-SA, salvo o indicado no AUTHORS.md) em # WebAssembly, com o Emscripten 6.0.10 e as portas SDL2 2.32.10, SDL2_image 2.6.0 (PNG), SDL2_ttf 2.20.2 e # SDL2_mixer 2.8.0 (OGG) dele. Este script, o patch e os dois icones desenhados por nos 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-zatacka-x.sh # # Fonte: zatacka_1.1.0.orig.tar.gz do Debian (o tarball da versao 1.1.0 de github.com/simenheg/zatackax), # conferido pelo SHA-256 e guardado em artifacts/cache/zatacka-x/. O jogo usa o SDL 1.2. O patch # (zatacka-x/zatacka-x-fredygames.patch): # - acrescenta src/ztksdl12.h/.c, o pedaco do SDL 1.2 que o jogo usa sobre o SDL2 (tela de 32 bits em # memoria mostrada numa textura, alfa por superficie, color key, sem repeticao de tecla, os codigos de # tecla do SDL 1.2, que o jogo usa como indice), e src/compat/SDL/*.h, que fazem o do jogo # achar o SDL2; o SDL_Delay do laco principal devolve a vez ao navegador (Asyncify); # - zatackax.c: sem o evento de redimensionar a janela; o laco sempre cede ao navegador; grava as # configuracoes a cada 30 s e em fredygames_save(), que a pagina chama quando a aba some ou fecha. # Os dois icones do chili (wi_chilirun.png e wis_chilirun.png), do Ravenmore e sem licenca declarada, sao # trocados por desenhos nossos (zatacka-x/make-chili.py gera, CC0; os PNG ficam ao lado). data/gfx, data/fonts # e data/sound vao num zatackax.data (--preload-file) em /data; as configuracoes ficam em # /home/web_user/.config/zatackax. # # Saida: artifacts/build/zatacka-x-1.1.0/zatackax.{js,wasm,data}, que o bundle.yaml confere pelo SHA-256. set -euo pipefail VERSION=1.1.0 SRC_SHA256=9339b75a76c9a6cb97d80e79a7108989d504b0b43eecad3ba2362606d6e5e41d 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/zatacka-x-$VERSION" cache="$root/artifacts/cache/zatacka-x" tarball="zatacka_$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 zatacka-x/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/zatacka-x/$1" ]; then echo "$here/zatacka-x/$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/z/zatacka/$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/obj" s=zatackax mkdir "$out/$s" tar xzf "$src_tar" -C "$out/$s" --strip-components 1 patch -d "$out/$s" -p1 --quiet --no-backup-if-mismatch < "$(aux zatacka-x-fredygames.patch)" cp "$(aux wi_chilirun.png)" "$(aux wis_chilirun.png)" "$out/$s/data/gfx/" # Compila de dentro da pasta de saida, com caminhos relativos: o carregador do zatackax.data guarda o nome # que o arquivo tem aqui. ( cd "$out" ports=(-sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS='["png"]' -sUSE_SDL_TTF=2 -sUSE_SDL_MIXER=2 -sSDL2_MIXER_FORMATS='["ogg"]') flags=(-O2 -w -ffile-prefix-map="$out/=" -DDATADIR='"/data"' -I"$s/src/compat" -include "$s/src/ztksdl12.h" "${ports[@]}") objs=() for f in $(LC_ALL=C ls "$s"/src/*.c); do o="obj/$(basename "$f" .c).o" emcc "${flags[@]}" -c "$f" -o "$o" objs+=("$o") done emcc -O2 "${objs[@]}" "${ports[@]}" -lm -lidbfs.js \ -sASYNCIFY -sSTACK_SIZE=1MB -sALLOW_MEMORY_GROWTH -sINITIAL_MEMORY=64MB -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ -sEXPORTED_FUNCTIONS=_main,_fredygames_save \ -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file "$s/data/gfx@/data/gfx" --preload-file "$s/data/fonts@/data/fonts" \ --preload-file "$s/data/sound@/data/sound" --exclude-file '*.txt' \ -o zatackax.js rm -rf obj ) rm -rf "$out/$s" shasum -a 256 "$out/zatackax.js" "$out/zatackax.wasm" "$out/zatackax.data"