#!/usr/bin/env bash # Compila o Passage (Jason Rohrer, 2007, "Placed in the public domain" na pagina do autor) para # WebAssembly a partir do Passage_v4_UnixSource.tar.gz do proprio autor, com o Emscripten 6.0.10 # (SDL 2 do Emscripten no lugar da SDL 1.2 do jogo; Asyncify para os lacos bloqueantes): # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # src/FredGames.Bundler/Builds/build-passage.sh # # Mudancas no jogo (passage/browser.patch, publicado junto): o jogo dorme e espera tecla com chamadas # que cedem a vez ao navegador (emscripten_sleep), Q/Esc nao encerram o programa e F (tela cheia) nao faz # nada. As configuracoes (passage/settings/*.ini) pedem janela de 800x128 em vez de tela cheia 640x480. # # Saida: artifacts/build/passage-4/passage.{js,wasm,data} set -euo pipefail SHA256=c32fb893a5b91e7090237859367559e67c2fb394690c54723879cbd689227e0a EMSCRIPTEN=6.0.10 URL="https://downloads.sourceforge.net/project/hcsoftware/Passage/v4/Passage_v4_UnixSource.tar.gz" here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/passage-4" cache="$root/artifacts/build/cache" 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" tarball="$cache/Passage_v4_UnixSource.tar.gz" [ -f "$tarball" ] || curl -fsSL "$URL" -o "$tarball" echo "$SHA256 $tarball" | shasum -a 256 -c - rm -rf "$out" mkdir -p "$out/tree" tar -xzf "$tarball" -C "$out/tree" --strip-components 1 patch -d "$out/tree" -p1 < "$here/passage/browser.patch" cp "$here"/passage/settings/*.ini "$out/tree/gamma256/gameSource/settings/" # O jogo inclui (SDL 1.2); no Emscripten 6 essa pasta guarda os cabecalhos antigos do SDL # do proprio Emscripten (teclas com outros valores), nao os da SDL 2.32 que e ligada. Estes encaminhadores # apontam para os cabecalhos certos (), e a pasta vai primeiro no caminho de inclusao. mkdir -p "$out/shim/SDL" for h in SDL SDL_audio SDL_main SDL_video; do printf '#include \n' "$h" > "$out/shim/SDL/$h.h" done # SDL_DOUBLEBUF (flag da SDL 1.2) nao existe na SDL 2: o jogo so a testa em "flags" da nossa superficie, onde # ela nunca esta ligada. printf '#define SDL_DOUBLEBUF 0x40000000\n' >> "$out/shim/SDL/SDL.h" cd "$out/tree/gamma256/gameSource" MG=../../minorGems em++ -O2 -w -sUSE_SDL=2 -sASYNCIFY -sALLOW_MEMORY_GROWTH=1 -sEXIT_RUNTIME=0 \ -I"$out/shim" -I../.. \ game.cpp landscape.cpp blowUp.cpp World.cpp map.cpp common.cpp score.cpp musicPlayer.cpp Timbre.cpp Envelope.cpp \ $MG/io/file/linux/PathLinux.cpp $MG/util/stringUtils.cpp $MG/util/StringBufferOutputStream.cpp \ $MG/util/SettingsManager.cpp $MG/system/unix/TimeUnix.cpp $MG/system/linux/ThreadLinux.cpp \ $MG/crypto/hashes/sha1.cpp $MG/formats/encodingUtils.cpp \ --preload-file graphics@/graphics --preload-file music@/music --preload-file settings@/settings \ -o "$out/passage.js" shasum -a 256 "$out/passage.js" "$out/passage.wasm" "$out/passage.data"