#!/usr/bin/env bash # Compila o SDL-Ball do fredygames.com: o Breakout de Jimmy Christensen (DusteDdk; codigo, graficos, # niveis e sons GPL-3.0-or-later) 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), SDL2_ttf 2.20.2 (FreeType 2.14.3, # HarfBuzz 3.2.0) 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-sdl-ball.sh # # Fonte: o commit 437701b do repositorio do autor no GitHub (o port para SDL2, de 2022, posterior a # release 1.04 do SourceForge, que ainda usa SDL 1.2), conferido pelo SHA-256 e guardado em # artifacts/cache/sdl-ball/. O site hospeda esse tarball sem quatro coisas: as duas fontes que o jogo # trazia (Bandal.ttf, Artistic License, e subgamefont.ttf, cuja licenca so consta de terceiros), a pasta # win32/ (DLLs de bibliotecas sem o fonte delas) e o binario Linux do plugin do GIMP (o fonte dele # continua la). O script aceita os dois tarballs e apaga esses arquivos de qualquer forma; o resultado # e o mesmo. # # As fontes trocadas: Lilita One (menus) e Chakra Petch Medium (avisos e recordes), as duas da SIL Open # Font License 1.1, tiradas sem mudancas do repositorio google/fonts no commit pinado abaixo, com o # OFL.txt de cada uma. # # sdl-ball-fredygames.patch: # - fredygames-gl.h (so com __EMSCRIPTEN__), para a emulacao de OpenGL do Emscripten # (-sLEGACY_GL_EMULATION): display lists gravadas e repetidas, vertices de glBegin/glEnd entregues # com cor e coordenada de textura em todos (a emulacao exige; o jogo da cor a so alguns), # gluBuild2DMipmaps como um glTexImage2D e GL_CLAMP como GL_CLAMP_TO_EDGE; # - o laco principal devolve a vez ao navegador (emscripten_sleep no lugar do usleep; Asyncify); # - a "tela" e uma imagem fixa de 1024x768 que a pagina escala; Q (sair), S (captura de tela) e F11 # (tela cheia) ficam desligadas no navegador; # - correcoes do port para SDL 2 que valem em qualquer plataforma: o estado do teclado era lido pelos # numeros de tecla do SDL 1.2 (as setas nao funcionavam), setas e Shift viravam letras nos nomes de # recordes e de jogos salvos, e o clang recusa inicializar o vetor de tamanho variavel do # display.cpp; # - themes/default/font/fonts.txt aponta para as fontes novas, e o COPYING da pasta as descreve. # # A pilha padrao do Emscripten (64 KB) nao comporta as variaveis locais do main (-sSTACK_SIZE=8MB). # # Saida: artifacts/build/sdl-ball-437701b/sdl-ball.{js,wasm,data}, que o bundle.yaml do jogo confere # pelo SHA-256. set -euo pipefail COMMIT=437701b3e1b10618f7f05461b904d482cd1b1e59 SRC_SHA256=a57aa758c75b4cbaefefb0b5deb8dc032e915767c3baf7a305e831fbe9e9908a PRUNED_SHA256=04654ec168e8f341882c3dda6a383a8fd2298ddb5ed3a21971116b5a30acf70f FONTS_COMMIT=45e3d5269e4a17d823f6d84470bc084dc5ae46f6 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/sdl-ball-${COMMIT:0:7}" cache="$root/artifacts/cache/sdl-ball" tarball="SDL-Ball-$COMMIT.tar.gz" pruned="SDL-Ball-${COMMIT:0:7}-pruned.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 sdl-ball/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/sdl-ball/$1" ]; then echo "$here/sdl-ball/$1"; else echo "$here/$1"; fi } # fetch : usa o arquivo ao lado do script, ou baixa para o cache. fetch() { local file="$here/$(basename "$2")" if [ ! -f "$file" ]; then file="$2" if [ ! -f "$file" ]; then mkdir -p "$(dirname "$file")" curl -fsSL -o "$file.part" "$1" mv "$file.part" "$file" fi fi echo "$3 $file" | shasum -a 256 -c - >&2 echo "$file" } if [ -f "$here/$pruned" ]; then src_tar="$here/$pruned" echo "$PRUNED_SHA256 $src_tar" | shasum -a 256 -c - >&2 else src_tar="$(fetch "https://github.com/DusteDdk/SDL-Ball/archive/$COMMIT.tar.gz" "$cache/$tarball" "$SRC_SHA256")" fi gf="https://raw.githubusercontent.com/google/fonts/$FONTS_COMMIT/ofl" lilita="$(fetch "$gf/lilitaone/LilitaOne-Regular.ttf" "$cache/LilitaOne-Regular.ttf" \ f5b641c45c69d772ee4eda687bc9fda411d5cad6b0b45371491da4580cbc8d59)" lilita_ofl="$(fetch "$gf/lilitaone/OFL.txt" "$cache/OFL-LilitaOne.txt" \ 255d5debbb80eb2ea762644311f266a279e8778f00156655a516e2b7781a63e1)" chakra="$(fetch "$gf/chakrapetch/ChakraPetch-Medium.ttf" "$cache/ChakraPetch-Medium.ttf" \ d480f4f97405fac3600652e2e14fd0b14339031c0af4da11582994878f04d919)" chakra_ofl="$(fetch "$gf/chakrapetch/OFL.txt" "$cache/OFL-ChakraPetch.txt" \ 13831d02389d917d22fcfa6c79f98f8acbf61d230add0e73a4d4dc5f3bfb9e56)" rm -rf "$out" mkdir -p "$out/sdl-ball" tar xzf "$src_tar" -C "$out/sdl-ball" --strip-components 1 rm -rf "$out/sdl-ball/win32" "$out/sdl-ball/leveleditor/gimp-leveleditor/gimp-sdlball" \ "$out/sdl-ball/themes/default/font/Bandal.ttf" "$out/sdl-ball/themes/default/font/subgamefont.ttf" patch -d "$out/sdl-ball" -p1 --quiet --no-backup-if-mismatch < "$(aux sdl-ball-fredygames.patch)" font="$out/sdl-ball/themes/default/font" cp "$lilita" "$font/LilitaOne-Regular.ttf" cp "$lilita_ofl" "$font/OFL-LilitaOne.txt" cp "$chakra" "$font/ChakraPetch-Medium.ttf" cp "$chakra_ofl" "$font/OFL-ChakraPetch.txt" # Compila de dentro da pasta de saida, com caminhos relativos: o carregador do sdl-ball.data guarda o # nome que o arquivo tem aqui. O jogo le os temas de themes/ na pasta de trabalho (a raiz). ( cd "$out" em++ -O2 -ffile-prefix-map="$out/=" -w \ -sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS='["png","jpg"]' -sUSE_SDL_TTF=2 \ -sUSE_SDL_MIXER=2 -sSDL2_MIXER_FORMATS='["ogg"]' \ sdl-ball/main.cpp sdl-ball/display.cpp -lidbfs.js \ -sLEGACY_GL_EMULATION -sGL_UNSAFE_OPTS=0 \ -sASYNCIFY -sASYNCIFY_STACK_SIZE=65536 -sSTACK_SIZE=8MB -sALLOW_MEMORY_GROWTH -sINITIAL_MEMORY=64MB -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file "sdl-ball/themes@/themes" \ -o sdl-ball.js ) shasum -a 256 "$out/sdl-ball.js" "$out/sdl-ball.wasm" "$out/sdl-ball.data"