#!/usr/bin/env bash # Compila o Meritous (jogo de tiro/RPG em masmorras geradas de Lancer-X/ASCEAI, GPL-3.0-or-later; SDL 1.2 + SDL_image + SDL_mixer) # para WebAssembly com o Emscripten 6.0.10, a partir do commit b215388 de gitlab.com/meritous/meritous (o repositorio mantido por # Sylvain Beucler, sucessor do original). # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # src/FredGames.Bundler/Builds/build-meritous.sh # # O jogo desenha numa tela de 8 bits com paleta, anima a paleta fisica (SDL_PHYSPAL) sem mexer nos pixels e le os PNGs em tons # de cinza como indices; a emulacao de SDL 1.2 do Emscripten nao faz nada disso (tela preta). Por isso ele roda sobre o SDL2 do # Emscripten com uma camada minima de SDL 1.2 so com o que o jogo usa (meritous/sdl1shim.h e sdl1shim.c, GPL-3.0-or-later como o # jogo; forcada com -include), que tambem traz um IMG_Load com libpng que devolve superficies de 8 bits. O SDL_mixer e o do # SDL2 (so WAV). O jogo tem laco proprio (nunca volta ao navegador), entao a build usa ASYNCIFY: o SDL_Delay do fim de cada # quadro vira emscripten_sleep (o main() tem milhares de variaveis locais e a pilha do ASYNCIFY, de 4 KB por padrao, estoura: # -sASYNCIFY_STACK_SIZE=262144). Os dados (dat/: imagens, sons, textos) vao embutidos num meritous.data. As 13 musicas do jogo # original nao estao no repositorio (nao tem licenca para redistribuir; dat/m/README-music.txt): o jogo roda sem musica. # # meritous/meritous-fredygames.patch: # - boss.c declara CanGetArtifact() sem argumentos e uma chamada passava um (em C, inofensivo; em WebAssembly, assinatura # divergente = o primeiro uso do trecho trava); # - ending.c: sai a lista de creditos das musicas que o site nao distribui; # - levelblit.c: Esc na tela de titulo nao encerra o programa (uma pagina nao tem para onde sair). # # Saida: artifacts/build/meritous-/meritous.{js,wasm,data}, que o bundle.yaml do jogo confere pelo SHA-256. set -euo pipefail COMMIT=b2153880efc5f4b17da5301364b9af91e6288a03 SHA256=40c3ae1275adecf50bb6f9c8b3b58a491b33bde1afd8057e84f2eeb859eedc4e 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/meritous-${COMMIT:0:7}" cache="$root/artifacts/build/cache" tgz="$cache/meritous-${COMMIT:0:7}.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 mkdir -p "$cache" if [ ! -f "$tgz" ]; then curl -fsSL --retry 4 "https://gitlab.com/api/v4/projects/meritous%2Fmeritous/repository/archive.tar.gz?sha=$COMMIT" -o "$tgz.partial" && mv "$tgz.partial" "$tgz" fi echo "$SHA256 $tgz" | shasum -a 256 -c - rm -rf "$out" mkdir -p "$out/tree" tar -xzf "$tgz" -C "$out/tree" --strip-components 1 patch -s -p1 -d "$out/tree" --no-backup-if-mismatch < "$here/meritous/meritous-fredygames.patch" ( cd "$out/tree" emcc -O2 -w -DDATADIR='"/data"' -DLOCALEDIR='"/locale"' -include locale.h -include "$here/meritous/sdl1shim.h" -I "$here/meritous/shim" \ src/*.c "$here/meritous/sdl1shim.c" -o "$out/meritous.js" \ -sUSE_SDL=2 -sUSE_SDL_MIXER=2 -sSDL2_MIXER_FORMATS='["wav"]' -sUSE_LIBPNG=1 -sUSE_ZLIB=1 \ -sALLOW_MEMORY_GROWTH=1 -sSTACK_SIZE=4194304 -sASYNCIFY -sASYNCIFY_STACK_SIZE=262144 -sENVIRONMENT=web -lidbfs.js \ -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file dat@/data ) rm -rf "$out/tree" shasum -a 256 "$out/meritous.js" "$out/meritous.wasm" "$out/meritous.data"