#!/usr/bin/env bash # Compila o OpenSSN 1.4 do fredygames.com (o simulador de submarino moderno de Jesse Smith, sobre o LinuxSSN de # Michael Bridak e Rick McDaniel; codigo sob a GNU GPL versao 2, imagens e dados sob a CC0 1.0) em WebAssembly, # com o Emscripten 6.0.10 e o SDL 1.2 que ele traz. Este script, o patch e o gerador de sons 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-openssn.sh # # Fonte: o openssn_1.4.orig.tar.gz do Debian (o mesmo arquivo do jogo no Debian main), conferido pelo SHA-256 e # guardado em artifacts/cache/openssn/. Na pasta de fontes do site, o script acha o tarball, o patch e o # make-sounds.py ao lado dele. # # openssn-fredygames.patch: o jogo so aceita giro e mergulho pelo teclado numerico e as telas pelas teclas F1-F6 # (que o navegador e o macOS tomam); o patch acrescenta J/L (girar), K/I (descer/subir) e M, O, B, H, D, V (mapa, # sonar, armas, leme, ESM, radar) e troca os nomes dos tres sons de .ogg para .wav. # Os tres .ogg do pacote (explosao, ping de sonar, lancamento de torpedo) nao tem origem registrada: o build os # apaga e gera os tres .wav no lugar com o make-sounds.py (sintese propria, CC0). O images/arial_small_12.png # (uma fonte Arial em bitmap, que o jogo nem usa) tambem e apagado. config.h vazio: o main.cpp o inclui, o # ./configure nao existe neste projeto. # O jogo roda no diretorio raiz do sistema de arquivos virtual, onde ficam data/, images/, ships/ e sounds/ # (--preload-file); com -s ele liga os efeitos sonoros e com -w roda em janela (a pagina passa os dois). # # Saida: artifacts/build/openssn-1.4/openssn.{js,wasm,data}, que o bundle.yaml do jogo confere pelo SHA-256. set -euo pipefail export TZ=UTC LC_ALL=C VERSION=1.4 SRC_SHA256=90778d4c6d9b73351102ce1a6d3e30d9209822eea326079d952ae55d840bcba8 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/openssn-$VERSION" cache="$root/artifacts/cache/openssn" tarball="openssn_$VERSION.orig.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 aux() { if [ -f "$here/openssn/$1" ]; then echo "$here/openssn/$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://deb.debian.org/debian/pool/main/o/openssn/$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/openssn-$VERSION" tar xzf "$src_tar" -C "$out/openssn-$VERSION" --strip-components=1 s="openssn-$VERSION" patch -d "$out/$s" -p1 --no-backup-if-mismatch < "$(aux openssn-fredygames.patch)" >&2 : > "$out/$s/src/config.h" rm -f "$out/$s"/sounds/*.ogg "$out/$s/images/arial_small_12.png" python3 -I "$(aux make-sounds.py)" "$out/$s/sounds" # Compila de dentro da pasta de saida, com caminhos relativos. ( cd "$out" mkdir obj for f in $(LC_ALL=C ls "$s"/src/*.cpp); do em++ -O2 -w -ffile-prefix-map="$out/=" -I"$s/src" -include "$s/src/fredy_web.h" -sUSE_SDL=1 -DVERSION=$VERSION \ -DDATADIR='"."' -DOPTDIR='"."' -c "$f" -o "obj/$(basename "$f" .cpp).o" done em++ -O2 $(LC_ALL=C ls obj/*.o) -sUSE_SDL=1 -sUSE_SDL_MIXER=1 -sASYNCIFY -sALLOW_MEMORY_GROWTH \ -sENVIRONMENT=web -sEXIT_RUNTIME=1 -sEXPORTED_RUNTIME_METHODS=FS --use-preload-plugins \ --preload-file "$s/data@/data" --preload-file "$s/images@/images" \ --preload-file "$s/ships@/ships" --preload-file "$s/sounds@/sounds" -o openssn.js rm -rf obj "$s" ) shasum -a 256 "$out/openssn.js" "$out/openssn.wasm" "$out/openssn.data"