#!/usr/bin/env bash # Compila o Chromium B.S.U. do fredygames.com: o shoot 'em up vertical de Mark B. Allan, mantido pelo # projeto chromium-bsu (codigo e graficos sob a Clarified Artistic License; sons e musica de Brian # Redfern, MIT/Expat), em WebAssembly, com o Emscripten 6.0.10 e as portas SDL2 2.32.10, SDL2_image # 2.6.0 (libpng 1.6.58, zlib 1.3.2) e SDL2_mixer 2.8.0 dele. Este script, o patch e os arquivos ao # lado dele (cbgl, ftgl, chromium-bsu-config.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-chromium-bsu.sh # # Fonte: o tarball da release 0.9.16.1 publicado pelo projeto no SourceForge, conferido pelo SHA-256 e # guardado em artifacts/cache/chromium-bsu/ (o site hospeda o mesmo arquivo), junto do stb_truetype.h # (Sean Barrett, dominio publico ou MIT) de um commit pinado e da fonte Chakra Petch Bold (SIL OFL 1.1) # do repositorio google/fonts. Na pasta de fontes do site, o script acha tudo ao lado dele. # # Sem o configure do jogo: o chromium-bsu-config.h escolhe SDL2 para janela e entrada, SDL_mixer para # o som, SDL_image para as texturas e o texto pela API do FTGL, sem traducoes, com os dados em /data. # - cbgl.c/cbgl.h: a parte do OpenGL 1.x que o jogo usa (glBegin/glEnd, pilhas de matrizes, display # lists, GL_QUADS, coordenadas de textura em sphere map, duas unidades de textura, alpha test) sobre # WebGL 1, que nao tem nada disso; o build inclui o cbgl.h em todos os arquivos do jogo (-include). # - ftgl.h/ftgl-stb.cpp: o pedaco do FTGL que o jogo usa (FTBufferFont), sobre o stb_truetype. O jogo # nao traz fonte (procura a Gothic Uralic do sistema); usamos a Chakra Petch Bold. # # chromium-bsu-fredygames.patch (so ativo com __EMSCRIPTEN__; cada arquivo mudado traz o aviso, como a # licenca pede): # - toda imagem vira RGBA antes de ir para a placa (os PNG em tons de cinza iam como luminancia); # - trocar o tamanho da tela redimensiona o canvas, e a tela cheia fica com o botao da pagina; # - a nave segue o movimento relativo do mouse travado pelo navegador (a pagina nao move o ponteiro) # e Q nao fecha o jogo (o menu ainda tem quit); # - tamanho padrao 1024x768, recordes assinados "player" e fredygames_save(), que a pagina chama # quando a aba some ou fecha (o jogo so grava as opcoes ao sair). # # Icone dos power-ups de escudo, reparo e super escudo: o original (data/png/powerUpShield.png) e o Tux, # o pinguim do Linux, que o site deixa de fora. O tarball hospedado vem sem ele # (chromium-bsu-0.9.16.1-pruned.tar.gz, podado pelo Bundler), e o build poe no lugar o # chromium-bsu/powerUpShield.png, um escudo desenhado pelo make-shield-icon.py (versionado ao lado; o # aviso de "como e quando mudou" vai no proprio PNG e no inicio do patch). # # Saida: artifacts/build/chromium-bsu-0.9.16.1/chromium-bsu.{js,wasm,data}, que o bundle.yaml do jogo # confere pelo SHA-256. set -euo pipefail VERSION=0.9.16.1 SRC_SHA256=a1c141a34d19a59607ae81166a19864eb8c84cf86b155462fed31a6d56e1624a PRUNED_SHA256=d7385aed21f601c4aaef9fb74d4740adc453ca17fab06919a8fb548d46fbfa56 ICON_SHA256=53cf11b31d688f7cbe0fa4bcd0b9d70b4ae435027fb8d27ac0f1c50a7e228f8f STB_COMMIT=a7d4c2175630e1ea5b6f8dd00ab96fed0b97b96d STB_SHA256=ecd30b05e0dd4fea3a13c26810dd9e1992dc379049482c393d5a19e6b5090aab FONTS_COMMIT=45e3d5269e4a17d823f6d84470bc084dc5ae46f6 FONT_SHA256=65fbf76d95651697275e19db4d717c0e95a789ddd3476478b05292104db278a0 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/chromium-bsu-$VERSION" cache="$root/artifacts/cache/chromium-bsu" tarball="chromium-bsu-$VERSION.tar.gz" pruned="chromium-bsu-$VERSION-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 chromium-bsu/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/chromium-bsu/$1" ]; then echo "$here/chromium-bsu/$1"; else echo "$here/$1"; fi } # Arquivo baixado: ao lado do script ou no cache, conferido pelo SHA-256. fetch() { local name="$1" url="$2" sha="$3" file if [ -f "$here/$name" ]; then file="$here/$name" else file="$cache/$name" if [ ! -f "$file" ]; then mkdir -p "$cache" curl -fsSL -o "$file.part" "$url" mv "$file.part" "$file" fi fi echo "$sha $file" | shasum -a 256 -c - >&2 echo "$file" } # Na pasta de fontes do site, o tarball podado (sem o Tux); aqui, o original do SourceForge. if [ -f "$here/$pruned" ]; then src_tar="$here/$pruned" echo "$PRUNED_SHA256 $src_tar" | shasum -a 256 -c - >&2 else src_tar=$(fetch "$tarball" \ "https://downloads.sourceforge.net/project/chromium-bsu/Chromium%20B.S.U.%20source%20code/$tarball" \ "$SRC_SHA256") fi icon="$(aux powerUpShield.png)" echo "$ICON_SHA256 $icon" | shasum -a 256 -c - >&2 stb=$(fetch stb_truetype.h "https://raw.githubusercontent.com/nothings/stb/$STB_COMMIT/stb_truetype.h" \ "$STB_SHA256") font=$(fetch ChakraPetch-Bold.ttf \ "https://raw.githubusercontent.com/google/fonts/$FONTS_COMMIT/ofl/chakrapetch/ChakraPetch-Bold.ttf" \ "$FONT_SHA256") rm -rf "$out" mkdir -p "$out" tar xzf "$src_tar" -C "$out" s="chromium-bsu-$VERSION" patch -d "$out/$s" -p1 --no-backup-if-mismatch < "$(aux chromium-bsu-fredygames.patch)" rm -f "$out/$s/data/png/powerUpShield.png" cp "$icon" "$out/$s/data/png/powerUpShield.png" mkdir -p "$out/shim/FTGL" "$out/fonts" cp "$(aux cbgl.h)" "$(aux cbgl.c)" "$(aux ftgl-stb.cpp)" "$(aux chromium-bsu-config.h)" "$stb" "$out/shim/" cp "$(aux ftgl.h)" "$out/shim/FTGL/ftgl.h" cp "$font" "$out/fonts/ChakraPetch-Bold.ttf" # Compila de dentro da pasta de saida, com caminhos relativos: o carregador do chromium-bsu.data guarda # o nome que o arquivo tem aqui. ( cd "$out" flags=(-O2 -ffile-prefix-map="$out/=" -w -DHAVE_CONFIG_H -Ishim -sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS='["png"]' -sUSE_SDL_MIXER=2 -sSDL2_MIXER_FORMATS='[]') # O cbgl.c chama o WebGL de verdade, por isso fica fora do -include. emcc "${flags[@]}" -std=c99 -c shim/cbgl.c -o shim/cbgl.o objs=(shim/cbgl.o) for f in shim/ftgl-stb.cpp $(LC_ALL=C ls "$s"/src/*.cpp); do o="obj/$(basename "${f%.cpp}").o" mkdir -p obj em++ "${flags[@]}" -include shim/cbgl.h -c "$f" -o "$o" objs+=("$o") done em++ "${flags[@]}" "${objs[@]}" \ -lidbfs.js -sASYNCIFY -sALLOW_MEMORY_GROWTH -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file "$s/data/png@/data/png" --preload-file "$s/data/wav@/data/wav" \ --preload-file "fonts/ChakraPetch-Bold.ttf@/data/fonts/ChakraPetch-Bold.ttf" \ --exclude-file '*Makefile*' --exclude-file '*.MID' --exclude-file '*.txt' --exclude-file '*.jpg' \ -o chromium-bsu.js ) shasum -a 256 "$out/chromium-bsu.js" "$out/chromium-bsu.wasm" "$out/chromium-bsu.data"