#!/usr/bin/env bash # Compila o Brogue CE do fredygames.com: Brogue: Community Edition 1.15.1 (AGPL-3.0-or-later) em # WebAssembly, pela plataforma SDL2 do proprio jogo (sdl2-platform.c + tiles.c), com o Emscripten # 6.0.10 e as portas SDL2 2.32.10 e SDL2_image 2.6.0 (so PNG, com libpng 1.6.58 e zlib 1.3.2). Este # script, os arquivos ao lado dele e o patch sao parte do codigo-fonte publicado junto do jogo ("the # scripts used to control compilation" da GPL/AGPL). # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # ./build.sh # # Saida: artifacts/build/brogue-1.15.1/brogue.{js,wasm}, que o bundle.yaml do jogo confere pelo # SHA-256. Tambem precisa do Python de artifacts/tools/venv (Pillow 12.3.0 com FreeType 2.14.3, e # fontTools) para redesenhar as letras do tiles.png (abaixo), e do Node do emsdk. # # Letras do tiles.png: as linhas de texto da imagem do jogo (ASCII, Latin-1 e os simbolos do modo # texto) foram rasterizadas da fonte Monaco, da Apple (com alguns simbolos da Consolas e da Noto # Sans), segundo os pull requests #133 e #158 do BrogueCE. make-tiles.py as redesenha com a DejaVu # Sans Mono 2.37 (DejaVu Sans para os simbolos que ela nao tem; os dois "circulos com barras" sao # desenhados pelo script), e as figuras do modo grafico (CC BY-SA 4.0) ficam como estao. O resultado # continua CC BY-SA 4.0, modificado. Como o tiles.png mudou, o tiles.bin (alinhamentos de subpixel # que o jogo acha por forca bruta) e recalculado por tiles-bin.c, que compila o proprio tiles.c e # roda no Node; leva alguns minutos e fica em cache na pasta de saida. # # brogue-fredygames.patch: # - no navegador a janela e a pagina: as teclas que mudam o tamanho da janela ou alternam a tela # cheia (Page Up/Down, +/-/=, F11, F12, Alt+Enter) nao fazem nada; a tela cheia e o botao do player; # - o laco de eventos cede a vez ao navegador mesmo quando nao ha tempo de espera sobrando; # - a janela comeca do tamanho do canvas, que a pagina estica sobre o quadro inteiro. # Opcoes de compilacao: -sASYNCIFY (o jogo espera eventos num laco; o SDL_Delay vira # emscripten_sleep), pilha de 4 MiB, -lidbfs.js (a pagina guarda jogos salvos, gravacoes e recordes # no IndexedDB), -sEXIT_RUNTIME (sair pelo menu avisa a pagina). Os dados (tiles.png, tiles.bin, # icon.png) vao embutidos no .wasm (--embed-file). set -euo pipefail VERSION=1.15.1 EMSCRIPTEN=6.0.10 BROGUE_SHA256=2abc186c5327342cb9ad7e45d41096ab10797d5ba76dcac843824ac2a0bfb3ac DEJAVU_SHA256=fa9ca4d13871dd122f61258a80d01751d603b4d3ee14095d65453b4e846e17d7 # Resultado de make-tiles.py e de tiles-bin (conferidos: outra Pillow/FreeType rasteriza diferente). TILES_PNG_SHA256=7c2087a198262ee7c95470c15ffabad6041cdfd94edd410f5912db3d643810b5 TILES_BIN_SHA256=3a1724ce62dc59c2b9131318308f4d2037884bfcfa5399a56d173ad68cf3ac39 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/brogue-$VERSION" python="${PYTHON:-$root/artifacts/tools/venv/bin/python}" 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 node="${EMSDK_NODE:-node}" mkdir -p "$out" fetch() { # url arquivo sha256 [ -f "$out/$2" ] || curl -fsSL "$1" -o "$out/$2" echo "$3 $out/$2" | shasum -a 256 -c - } fetch "https://github.com/tmewett/BrogueCE/archive/refs/tags/v$VERSION.tar.gz" \ "BrogueCE-$VERSION.tar.gz" "$BROGUE_SHA256" fetch https://github.com/dejavu-fonts/dejavu-fonts/releases/download/version_2_37/dejavu-fonts-ttf-2.37.tar.bz2 \ dejavu-fonts-ttf-2.37.tar.bz2 "$DEJAVU_SHA256" rm -rf "$out/source" "$out/dejavu" "$out/data" mkdir -p "$out/source" "$out/dejavu" "$out/data/assets" tar -xzf "$out/BrogueCE-$VERSION.tar.gz" -C "$out/source" --strip-components 1 tar -xjf "$out/dejavu-fonts-ttf-2.37.tar.bz2" -C "$out/dejavu" --strip-components 1 patch -d "$out/source" -p1 --no-backup-if-mismatch < "$here/brogue-fredygames.patch" # Letras redesenhadas com a DejaVu. "$python" "$here/make-tiles.py" "$out/source/bin/assets/tiles.png" "$out/dejavu/ttf" \ "$out/data/assets/tiles.png" echo "$TILES_PNG_SHA256 $out/data/assets/tiles.png" | shasum -a 256 -c - cp "$out/source/bin/assets/icon.png" "$out/data/assets/" cd "$out/source" common=(-O2 -std=gnu99 -Isrc/brogue -Isrc/platform -Isrc/variants -DBROGUE_SDL -sUSE_SDL=2 -sUSE_SDL_IMAGE=2 "-sSDL2_IMAGE_FORMATS=[\"png\"]") # tiles.bin para o tiles.png novo (em cache pelo SHA-256 dele). if [ ! -f "$out/tiles-$TILES_PNG_SHA256.bin" ]; then mkdir -p "$out/tiles-bin/assets" cp "$out/data/assets/tiles.png" "$out/tiles-bin/assets/" rm -f "$out/tiles-bin/assets/tiles.bin" emcc "${common[@]}" -sNODERAWFS=1 -sENVIRONMENT=node -sALLOW_MEMORY_GROWTH=1 \ -Isrc/platform "$here/tiles-bin.c" -o "$out/tiles-bin/tiles-bin.js" "$node" "$out/tiles-bin/tiles-bin.js" "$out/tiles-bin" mv "$out/tiles-bin/assets/tiles.bin" "$out/tiles-$TILES_PNG_SHA256.bin" rm -rf "$out/tiles-bin" fi cp "$out/tiles-$TILES_PNG_SHA256.bin" "$out/data/assets/tiles.bin" echo "$TILES_BIN_SHA256 $out/data/assets/tiles.bin" | shasum -a 256 -c - # O jogo: as mesmas fontes que o Makefile usa com GRAPHICS=YES, caminhos relativos (o __FILE__ das # mensagens de erro nao leva o caminho da maquina). sources=(src/brogue/*.c src/variants/*.c src/platform/main.c src/platform/platformdependent.c src/platform/null-platform.c src/platform/sdl2-platform.c src/platform/tiles.c) emcc "${common[@]}" -DDATADIR=/brogue '-DBROGUE_EXTRA_VERSION=""' \ -Wno-parentheses -Wno-unused-result \ "${sources[@]}" -lm -lidbfs.js \ -sASYNCIFY -sASYNCIFY_STACK_SIZE=131072 -sSTACK_SIZE=4194304 \ -sINITIAL_MEMORY=67108864 -sALLOW_MEMORY_GROWTH=1 -sEXIT_RUNTIME=1 -sENVIRONMENT=web \ -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --embed-file "$out/data/assets@/brogue/assets" \ -o "$out/brogue.js" shasum -a 256 "$out/brogue.js" "$out/brogue.wasm"