#!/usr/bin/env bash # Compila o Biniax-2 do fredygames.com: o quebra-cabeca de Jordan Tuzsuzov (codigo, graficos e musica # sob a licenca zlib, como diz o LICENSE.txt do pacote: "applied for all the files included in standard # binary or source code distributions (including graphical resources and music)") em WebAssembly, com o # Emscripten 6.0.10 e as portas SDL2 2.32.10, SDL2_image 2.6.0 (libpng 1.6.58, zlib 1.3.2) e # SDL2_mixer 2.8.0 (com a libmodplug 11022021, que toca os modulos IT da musica) dele. Este script, o # patch e a camada de compatibilidade (biniax2/bnxsdl12.h e .c) 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-biniax2.sh # # Fonte: o pacote de fontes da versao 1.30 (biniax2-1.30-fullsrc.tar.gz, publicado pelo autor em # tuzsuzov.com; o Debian usa o mesmo arquivo), conferido pelo SHA-256 e guardado em # artifacts/cache/biniax2/. O site hospeda o mesmo pacote sem o data/music/biniax_common00.it (abaixo); # o script aceita os dois. Na pasta de fontes do site, o script acha tudo ao lado dele. # # O jogo e escrito para o SDL 1.2, que nao tem porta no Emscripten. bnxsdl12.h/.c tem o pedaco da API # do SDL 1.2 que ele usa (SDL_SetVideoMode, SDL_Flip, SDL_SetAlpha, SDL_DisplayFormat e as teclas do # teclado numerico) sobre o SDL2; o build a inclui em todos os arquivos (-include). -fcommon: os # cabecalhos do jogo definem variaveis globais (como compiladores C antigos aceitavam). # biniax2-fredygames.patch (so ativo com __EMSCRIPTEN__): # - sys.c: configuracao, recordes e o jogo salvo ficam em /home/web_user/biniax2 (a pagina guarda a # pasta no IndexedDB), no lugar da pasta de trabalho; # - snd.c e biniax.c: a musica biniax_common00.it fica de fora (o texto do proprio modulo atribui a # musica "Spaceships" a outro musico, "deepflow"), e as musicas das partidas sao sorteadas entre # as faixas 1 a 6, como antes entre 0 e 6. # Os dados de data/ (sem o Thumbs.db e sem a faixa 00) vao num biniax2.data que o proprio Emscripten # carrega (--preload-file), em /data, porque o jogo os abre por caminhos relativos a raiz. # # Saida: artifacts/build/biniax2-1.30/biniax2.{js,wasm,data}, que o bundle.yaml do jogo confere pelo # SHA-256. set -euo pipefail VERSION=1.30 SRC_SHA256=2c09f6f0a5fe453a409d990d72a964636ee91ca91daac99f0db861b8f42531bf PRUNED_SHA256=e9315372e83d95588580cd3cadeaca57691998cd0fead885e1490ef904b609ef 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/biniax2-$VERSION" cache="$root/artifacts/cache/biniax2" tarball="biniax2-$VERSION-fullsrc.tar.gz" pruned="biniax2-$VERSION-fullsrc-pruned.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 biniax2/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/biniax2/$1" ]; then echo "$here/biniax2/$1"; else echo "$here/$1"; fi } if [ -f "$here/$pruned" ]; then src_tar="$here/$pruned" echo "$PRUNED_SHA256 $src_tar" | shasum -a 256 -c - >&2 else src_tar="$cache/$tarball" if [ ! -f "$src_tar" ]; then mkdir -p "$cache" curl -fsSL -o "$src_tar.part" "http://www.tuzsuzov.com/biniax/$tarball" mv "$src_tar.part" "$src_tar" fi echo "$SRC_SHA256 $src_tar" | shasum -a 256 -c - >&2 fi rm -rf "$out" mkdir -p "$out/work/src" "$out/work/obj" tar xzf "$src_tar" -C "$out/work/src" S="$out/work/src" patch -d "$S" -p1 --no-backup-if-mismatch < "$(aux biniax2-fredygames.patch)" >&2 cp "$(aux bnxsdl12.h)" "$(aux bnxsdl12.c)" "$out/work/" PORTS=(-sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS='["png"]' -sUSE_SDL_MIXER=2 -sSDL2_MIXER_FORMATS='["mod"]') FLAGS=(-O2 -w -fcommon -ffile-prefix-map="$out/work/=" "${PORTS[@]}" -I"$S" -I"$S/desktop" -I"$out/work" -include "$out/work/bnxsdl12.h") # Arquivos: os do makefile do jogo, mais a camada. srcs=() for f in biniax.c hof.c desktop/cfg.c desktop/gfx.c desktop/snd.c desktop/inp.c desktop/sys.c; do srcs+=("$S/$f") done srcs+=("$out/work/bnxsdl12.c") objs=() for f in "${srcs[@]}"; do rel="${f#"$out/work/"}" o="$out/work/obj/${rel//\//_}.o" objs+=("$o") emcc "${FLAGS[@]}" -c "$f" -o "$o" done # Liga de dentro da pasta de saida, com caminhos relativos: o carregador do biniax2.data guarda o nome # que a pasta tem aqui. cp -R "$S/data" "$out/data" rm -f "$out/data/Thumbs.db" "$out/data/music/biniax_common00.it" ( cd "$out" em++ -O2 "${objs[@]}" "${PORTS[@]}" -lidbfs.js \ -sASYNCIFY -sALLOW_MEMORY_GROWTH=1 -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file data@/data \ -o biniax2.js ) rm -rf "$out/data" "$out/work" shasum -a 256 "$out/biniax2.js" "$out/biniax2.wasm" "$out/biniax2.data"