#!/usr/bin/env bash # Compila o Powermanga do fredygames.com: o shoot 'em up vertical da TLK Games (codigo, graficos, sons e # musica sob a GPL-3.0-or-later; README, AUTHORS e o debian/copyright do Debian main) em WebAssembly, com o # Emscripten 6.0.10 e as portas SDL2 2.32.10 e SDL2_mixer 2.8.0 (com a libmodplug 11022021, que toca os # modulos XM da musica) 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-powermanga.sh # # Fonte: o tarball da versao 0.93.1 (powermanga-0.93.1.tgz, publicado pela TLK Games em linux.tlk.fr), # conferido pelo SHA-256 e guardado em artifacts/cache/powermanga/ (o site hospeda o mesmo arquivo). Na # pasta de fontes do site, o script acha o tarball e o patch ao lado dele. # # O jogo e escrito para o SDL 1.2, que nao tem porta no Emscripten. O patch acrescenta o sdl1compat.c/.h, # so com o pedaco da API do SDL 1.2 que o jogo usa, sobre o SDL2 (tela numa textura, estado do teclado por # scancode, foco da janela). Tudo vale so com __EMSCRIPTEN__: # - powermanga.h inclui o sdl1compat.h no lugar dos cabecalhos do SDL 1.2; # - display_sdl.c le as teclas pelo scancode e o foco pelo SDL_WINDOWEVENT; # - F e F11 (tela cheia) nao fazem nada: a pagina tem o proprio botao; # - cada quadro devolve a vez ao navegador, mesmo atrasado (o build usa Asyncify); # - fredygames_save(), que a pagina chama quando a aba some ou fecha: o jogo so grava a configuracao # ao sair (os recordes ele grava na hora). # config.h: as definicoes que o configure geraria (SDL, SDL_mixer, sem X11), escritas aqui. # graphics/, data/, texts/ e sounds/ vao num powermanga.data que o proprio Emscripten carrega # (--preload-file), na raiz, que e a pasta de trabalho do jogo; os OGG de sounds/handheld_console (a # mesma musica, para os portateis) ficam de fora. Recordes e configuracao ficam em # /home/web_user/.config/tlk-games. # # Saida: artifacts/build/powermanga-0.93.1/powermanga.{js,wasm,data}, que o bundle.yaml do jogo confere # pelo SHA-256. set -euo pipefail VERSION=0.93.1 SRC_SHA256=da753fce83905a6db3fd8ea65c70c57d662362c86c429d6c6954417144f943e8 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/powermanga-$VERSION" cache="$root/artifacts/cache/powermanga" tarball="powermanga-$VERSION.tgz" 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 powermanga/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/powermanga/$1" ]; then echo "$here/powermanga/$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://linux.tlk.fr/games/Powermanga/download/$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" s="powermanga-$VERSION" patch -d "$out/$s" -p1 --no-backup-if-mismatch < "$(aux powermanga-fredygames.patch)" cat > "$out/$s/config.h" <