#!/usr/bin/env bash # Compila o Seven Kingdoms: Ancient Adversaries do fredygames.com: o jogo da Enlight Software liberado # sob a GPL-2.0 em 2009 e mantido pelo projeto 7kfans (codigo e dados GPL-2.0), em WebAssembly, com o # Emscripten 6.0.10, a porta SDL2 2.32.10 e o OpenAL do proprio Emscripten. A trilha sonora de Bjorn # Lynne (7kaa-music-2.15.zip) tem licenca propria (COPYING-Music.txt): redistribuicao livre do conjunto # completo e sem modificacao, com o aviso; os WAV entram como vem no zip. 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-7kaa.sh # # Fontes: o tarball da release 2.15.7 (7kaa-2.15.7.tar.gz, publicado pelo projeto no SourceForge) e o # zip da musica (7kfans.com), conferidos pelo SHA-256 e guardados em artifacts/cache/7kaa/ (o site # hospeda os mesmos arquivos). Na pasta de fontes do site, o script acha os dois e o patch ao lado dele. # # Opcoes: --disable-multiplayer (sem enet nem curl: o jogo nao usa rede). data/ e a musica vao num # 7kaa.data que o proprio Emscripten carrega (--preload-file), em /7kaa (a pagina aponta SKDATA para la). # # 7kaa-fredygames.patch (so ativo com __EMSCRIPTEN__, so em src/OVGA.cpp): # - a janela abre sempre em 800x600, sem tela cheia (a pagina escala o canvas e tem o proprio botao); # - o tratamento de eventos devolve a vez ao navegador a cada ~10 ms (o jogo tem lacos proprios; o # build usa Asyncify). # # Saida: artifacts/build/7kaa-2.15.7/7kaa.{js,wasm,data}, que o bundle.yaml do jogo confere pelo SHA-256. set -euo pipefail VERSION=2.15.7 SRC_SHA256=2a9833ffe5fa7558857d4f8ba39cad1dccefadb01d298350ed8f954c75b6a6ae MUSIC=7kaa-music-2.15.zip MUSIC_SHA256=b6bdcd2ca4c7f78b45b831d70f30e3c472646e84dd8ca21e1f7128f80fcf0d32 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/7kaa-$VERSION" cache="$root/artifacts/cache/7kaa" tarball="7kaa-$VERSION.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 7kaa/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/7kaa/$1" ]; then echo "$here/7kaa/$1"; else echo "$here/$1"; fi } # Arquivo baixado: ao lado do script, ou no cache (baixa se faltar). fetch() { local name="$1" url="$2" sha="$3" path if [ -f "$here/$name" ]; then path="$here/$name" else path="$cache/$name" if [ ! -f "$path" ]; then mkdir -p "$cache" curl -fsSL -o "$path.part" "$url" mv "$path.part" "$path" fi fi echo "$sha $path" | shasum -a 256 -c - >&2 echo "$path" } src_tar="$(fetch "$tarball" "https://downloads.sourceforge.net/project/skfans/7KAA%20$VERSION/$tarball" "$SRC_SHA256")" music_zip="$(fetch "$MUSIC" "https://www.7kfans.com/downloads/$MUSIC" "$MUSIC_SHA256")" rm -rf "$out" mkdir -p "$out/pkg" tar xzf "$src_tar" -C "$out" s="$out/7kaa-$VERSION" patch -d "$s" -p1 --no-backup-if-mismatch < "$(aux 7kaa-fredygames.patch)" # Musica: os WAV do zip, sem modificacao, na pasta MUSIC que o jogo procura, com o COPYING-Music.txt # e o README-Music.txt do zip. mkdir -p "$out/music" unzip -q "$music_zip" -d "$out/music" wav="$(cd "$out/music" && find . -type f -name 'WAR.WAV')" [ -n "$wav" ] || { echo "WAR.WAV nao esta no $MUSIC" >&2; exit 1; } mv "$out/music/$(dirname "$wav")" "$s/MUSIC" # O aviso da licenca vai junto dos WAV (a licenca proibe tira-lo de qualquer distribuicao). cp "$out/music/$(dirname "$(dirname "$wav")")"/*-Music.txt "$s/MUSIC/" # Compila de dentro de src/, com caminhos relativos: o carregador do 7kaa.data guarda o nome que o # arquivo tem aqui. export SOURCE_DATE_EPOCH=0 flags="-O2 -ffile-prefix-map=$out/= -w" ( cd "$s" OPENAL_CFLAGS=" " OPENAL_LIBS="-lopenal" CFLAGS="$flags" CXXFLAGS="$flags" \ PATH="$(dirname "$(command -v emcc)")/system/bin:$PATH" \ emconfigure ./configure --host=wasm32-unknown-emscripten --disable-multiplayer --disable-curl \ --disable-enet --disable-fhs --disable-nls >/dev/null emmake make -C src -j"$(sysctl -n hw.ncpu 2>/dev/null || nproc)" AR=emar \ LDFLAGS="-sASYNCIFY -sALLOW_MEMORY_GROWTH -sINITIAL_MEMORY=128MB -sSTACK_SIZE=1MB \ -sENVIRONMENT=web -sEXIT_RUNTIME=1 -lidbfs.js \ -sEXPORTED_RUNTIME_METHODS=FS,ENV,addRunDependency,removeRunDependency \ --preload-file ../data@/7kaa --preload-file ../MUSIC@/7kaa/MUSIC --exclude-file '*Makefile*'" \ >/dev/null ) cp "$s/src/7kaa" "$out/7kaa.js" cp "$s/src/7kaa.wasm" "$s/src/7kaa.data" "$out/" shasum -a 256 "$out/7kaa.js" "$out/7kaa.wasm" "$out/7kaa.data"