#!/usr/bin/env bash # Compila o Azimuth do fredygames.com: o metroidvania de graficos vetoriais de Matthew D. Steele # (GPL-3.0-or-later; a musica tambem sob CC BY 4.0) em WebAssembly, com o Emscripten 6.0.10 e a porta # SDL2 2.32.10 dele. Este script, o patch e o azgl.{c,h} 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-azimuth.sh # # Fonte: o tarball da tag v1.0.4 no GitHub do autor (azimuth-1.0.4.tar.gz), conferido pelo SHA-256 e # guardado em artifacts/cache/azimuth/ (o site hospeda o mesmo arquivo). Na pasta de fontes do site, o # script acha o tarball e os arquivos auxiliares ao lado dele. # # Graficos e sons nao tem arquivos: tudo e desenhado e sintetizado pelo codigo (os efeitos com o # sintetizador do sfxr, MIT, embutido em src/azimuth/util/sound.c). Os dados sao as salas # (data/rooms) e as partituras (data/music), arquivos de texto que vao num azimuth.data que o proprio # Emscripten carrega (--preload-file), na raiz. # # azgl.c/azgl.h: a parte do OpenGL 1.x que o jogo usa (glBegin/glEnd, pilha de matrizes, display # lists, GL_QUADS/GL_QUAD_STRIP/GL_POLYGON e linhas largas) sobre WebGL 1, que nao tem nada disso; o # build inclui o azgl.h em todos os arquivos do jogo (-include), sem mudar as chamadas. # # azimuth-fredygames.patch (so ativo com __EMSCRIPTEN__): # - a tela tem tamanho fixo (640x480 escalado para a tela do aparelho, de 1x a 3x) e Ctrl-F nao # muda nada (a pagina tem o proprio botao de tela cheia); # - cada quadro devolve a vez ao navegador e espera o requestAnimationFrame, mantendo os 60 Hz do # jogo em telas mais rapidas; # - salas e musica sao lidas como arquivos, como no app de macOS; # - saves e opcoes ficam em /home/web_user/azimuth, que a pagina guarda no IndexedDB. # # Saida: artifacts/build/azimuth-1.0.4/azimuth.{js,wasm,data}, que o bundle.yaml do jogo confere pelo # SHA-256. set -euo pipefail VERSION=1.0.4 SRC_SHA256=b77e3da9045929108aefa3a2026d7d92c3d681c5b34a0f6d3ab421e0a8a3daae 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/azimuth-$VERSION" cache="$root/artifacts/cache/azimuth" tarball="azimuth-$VERSION.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 azimuth/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/azimuth/$1" ]; then echo "$here/azimuth/$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/mdsteele/azimuth/archive/refs/tags/v$VERSION.tar.gz" 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" s="azimuth-$VERSION" patch -d "$out/$s" -p1 --no-backup-if-mismatch < "$(aux azimuth-fredygames.patch)" mkdir -p "$out/azgl" cp "$(aux azgl.h)" "$(aux azgl.c)" "$out/azgl/" # Os mesmos arquivos do executavel azimuth no Makefile do jogo: util, state, tick, gui, view, control # e o main.c, mais o resource.c (sem o blob de recursos, que o macOS tambem nao usa). files=$(cd "$out" && LC_ALL=C find "$s/src/azimuth/util" "$s/src/azimuth/state" "$s/src/azimuth/tick" \ "$s/src/azimuth/gui" "$s/src/azimuth/view" "$s/src/azimuth/control" -name '*.c' | LC_ALL=C sort) # Compila de dentro da pasta de saida, com caminhos relativos: o carregador do azimuth.data guarda o # nome que o arquivo tem aqui. ( cd "$out" # O azgl.c chama o WebGL de verdade, por isso fica fora do -include. emcc -O2 -std=c99 -DNDEBUG -ffile-prefix-map="$out/=" -w -sUSE_SDL=2 -c azgl/azgl.c -o azgl/azgl.o emcc -O2 -std=c99 -DNDEBUG -ffile-prefix-map="$out/=" -w \ -I"$s/src" -Iazgl -include azgl/azgl.h -sUSE_SDL=2 \ $files "$s/src/azimuth/main.c" "$s/src/azimuth/system/resource.c" azgl/azgl.o \ -lidbfs.js -sASYNCIFY -sALLOW_MEMORY_GROWTH -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file "$s/data/rooms@/rooms" --preload-file "$s/data/music@/music" \ -o azimuth.js ) shasum -a 256 "$out/azimuth.js" "$out/azimuth.wasm" "$out/azimuth.data"