#!/usr/bin/env bash # Compila o Curse of War do fredygames.com: o jogo de estrategia em tempo real de Alexey Nikolaev (codigo # e graficos sob a GPL-3.0-or-later) em WebAssembly, com o Emscripten 6.0.10 e a porta SDL2 2.32.10 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-curse-of-war.sh # # Fonte: curseofwar_1.3.0.orig.tar.gz do Debian (identico ao tarball da tag v1.3.0 de # github.com/a-nikolaev/curseofwar), conferido pelo SHA-256 e guardado em artifacts/cache/curse-of-war/. # O jogo usa o SDL 1.2. O patch (curse-of-war/curse-of-war-fredygames.patch): # - acrescenta cowsdl12.h/.c, o pedaco do SDL 1.2 que o jogo usa sobre o SDL2 (tela RGB565 em memoria, # SDL_Flip, SDL_DisplayFormat, color key); o SDL_Delay do laco devolve a vez ao navegador (Asyncify); # - main-sdl.c: tira o cliente de rede e a escolha single/multiplayer; as teclas de letra vem do # SDL_TEXTINPUT (o SDL2 nao tem keysym.unicode) e as setas do SDL_KEYDOWN; # - main-common.c: tira as opcoes -E, -e, -C e -c (rede). # network.c, client.c e server.c nao entram na compilacao. Os tres BMP de images/ vao num curseofwar.data # (--preload-file), na raiz, que e a pasta de trabalho do jogo. As opcoes de partida (dificuldade, # velocidade, formato do mapa) chegam pela linha de comando (Module.arguments) que a pagina monta. # # Saida: artifacts/build/curse-of-war-1.3.0/curseofwar.{js,wasm,data}, que o bundle.yaml confere pelo SHA-256. set -euo pipefail VERSION=1.3.0 SRC_SHA256=2a90204d95a9f29a0e5923f43e65188209dc8be9d9eb93576404e3f79b8a652b 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/curse-of-war-$VERSION" cache="$root/artifacts/cache/curse-of-war" tarball="curseofwar_$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 # Arquivo auxiliar: em curse-of-war/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/curse-of-war/$1" ]; then echo "$here/curse-of-war/$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/c/curseofwar/$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/obj" s=curseofwar mkdir "$out/$s" tar xzf "$src_tar" -C "$out/$s" --strip-components 1 patch -d "$out/$s" -p1 --quiet --no-backup-if-mismatch < "$(aux curse-of-war-fredygames.patch)" # Compila de dentro da pasta de saida, com caminhos relativos: o carregador do curseofwar.data guarda o # nome que o arquivo tem aqui. ( cd "$out" flags=(-O2 -w -ffile-prefix-map="$out/=" -sUSE_SDL=2 -include "$s/cowsdl12.h" -I"$s" -DVERSION='"1.3.0"' -DINSTALL_DATA='"/"') objs=() for f in grid state king output-common path main-common output-sdl main-sdl; do emcc "${flags[@]}" -c "$s/$f.c" -o "obj/$f.o" objs+=("obj/$f.o") done emcc "${flags[@]}" -c "$s/cowsdl12.c" -o obj/cowsdl12.o objs+=(obj/cowsdl12.o) emcc -O2 "${objs[@]}" -sUSE_SDL=2 -lm \ -sASYNCIFY -sSTACK_SIZE=8MB -sALLOW_MEMORY_GROWTH -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file "$s/images@/images" \ -o curseofwar.js rm -rf obj ) rm -rf "$out/$s" shasum -a 256 "$out/curseofwar.js" "$out/curseofwar.wasm" "$out/curseofwar.data"