#!/usr/bin/env bash # Compila o Project: Starfighter do fredygames.com: o shoot 'em up da Parallel Realities mantido pelo # projeto pr-starfighter (codigo GPL-3.0-or-later; graficos, sons e musica sob GPL, CC BY, CC BY-SA, # CC0 e dominio publico, arquivo por arquivo no LICENSES do jogo) em WebAssembly, com o Emscripten # 6.0.10 e as portas SDL2 2.32.10, SDL2_image 2.6.0 (libpng 1.6.58, libjpeg 9f, zlib 1.3.2) e # SDL2_mixer 2.8.0 (libogg 1.3.5, libvorbis 1.3.7) dele. 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-starfighter.sh # # Fonte: o tarball de fontes da release v2.4 (starfighter-2.4-src.tar.gz, publicado pelo projeto no # GitHub), conferido pelo SHA-256 e guardado em artifacts/cache/starfighter/ (o site hospeda o mesmo # arquivo). Na pasta de fontes do site, o script acha o tarball e o patch ao lado dele. # # Opcoes: as do configure do jogo para uma build "run in place" sem a Pango e o SDL_ttf (-DNOFONT: os # textos usam a fonte em bitmap do jogo, que so tem o alfabeto ingles; por isso as traducoes e a fonte # TakaoPGothic ficam de fora). gfx/, sound/, music/ e data/credits.txt vao num starfighter.data que o # proprio Emscripten carrega (--preload-file), na raiz, que e a pasta de trabalho do jogo. # # starfighter-fredygames.patch (so ativo com __EMSCRIPTEN__): # - game_delayFrame devolve a vez ao navegador mesmo quando o quadro atrasou (o jogo tem lacos # proprios; o build usa Asyncify, e o SDL_Delay ja cede a vez nos outros casos); # - fredygames_save(), que a pagina chama quando a aba some ou fecha: o jogo so grava as opcoes ao # sair (a gravacao saiu do engine_cleanup para engine_saveConf). # # Saida: artifacts/build/starfighter-2.4/starfighter.{js,wasm,data}, que o bundle.yaml do jogo confere # pelo SHA-256. set -euo pipefail VERSION=2.4 SRC_SHA256=25a7bf0f3ee17c02698c71ad6469c47fe2b5a6066a62498ce2c8373d643afa46 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/starfighter-$VERSION" cache="$root/artifacts/cache/starfighter" tarball="starfighter-$VERSION-src.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 starfighter/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/starfighter/$1" ]; then echo "$here/starfighter/$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://github.com/pr-starfighter/starfighter/releases/download/v$VERSION/$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" tar xzf "$src_tar" -C "$out" patch -d "$out/starfighter-$VERSION-src" -p1 --no-backup-if-mismatch < "$(aux starfighter-fredygames.patch)" # Compila de dentro da pasta de saida, com caminhos relativos: o carregador do starfighter.data guarda # o nome que o arquivo tem aqui. ( cd "$out" s="starfighter-$VERSION-src" emcc -O2 -ffile-prefix-map="$out/=" -DNOFONT -DVERSION="\"$VERSION\"" -w \ -sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS='["png","jpg"]' \ -sUSE_SDL_MIXER=2 -sSDL2_MIXER_FORMATS='["ogg"]' \ $(LC_ALL=C ls "$s"/src/*.c) -lidbfs.js \ -sASYNCIFY -sALLOW_MEMORY_GROWTH -sINITIAL_MEMORY=128MB -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file "$s/gfx@/gfx" --preload-file "$s/sound@/sound" --preload-file "$s/music@/music" \ --preload-file "$s/data/credits.txt@/data/credits.txt" \ --exclude-file '*Makefile*' \ -o starfighter.js ) shasum -a 256 "$out/starfighter.js" "$out/starfighter.wasm" "$out/starfighter.data"