#!/usr/bin/env bash # Compila o Nikwi Deluxe do fredygames.com: o jogo de plataforma de Kostas Michalopoulos ("Bad Sector", # 2005-2012; src/ sob a licenca zlib e o resto, dados incluidos, sob a WTFPL, como diz o license.txt do # repositorio) em WebAssembly com o Emscripten 6.0.10 e a porta SDL2 dele (-sUSE_SDL=2) sob uma camada de SDL 1.2. # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # src/FredGames.Bundler/Builds/build-nikwi.sh # # Fonte: o commit fa5a634 de github.com/jbradish/nikwi (a pagina "Homepage" do pacote Debian; o historico # e do autor), conferido pelo SHA-256 e guardado em artifacts/cache/nikwi/. # O jogo e escrito para o SDL 1.2. A porta SDL 1.2 do Emscripten nao tem blitter em software (nao desenha # superficies de 16 bits nem respeita color key, e o jogo usa os dois), entao o build usa a porta SDL2 e # uma camada propria (nikwi/nikwi-sdl12.h e .c) com o pedaco da API do SDL 1.2 que o jogo usa: # SDL_SetVideoMode (uma superficie RGB565 em memoria, que e o que o codigo grafico do jogo espera), # SDL_Flip (sobe para uma textura e apresenta), SDL_WM_SetCaption e SDL_PollEvent sem repeticao de tecla. # Um unico patch no codigo do jogo, nikwi/nikwi-fredygames.patch (so ativo com __EMSCRIPTEN__): o loop # principal nao dorme em lugar nenhum e travaria a aba; ele passa a ceder o controle ao navegador a cada # quadro (SDL_Delay(10)). # Os graficos .bmp viram .ut (RGB565) por bmp2ut.py, igual ao bmp2ut do autor com --halfbits (conferido # byte a byte contra a ferramenta dele em todos os 98 arquivos); o jogo le a pasta data/ quando nao ha # justdata.up, e ela vai no nikwi.data do Emscripten (--preload-file). O loop do jogo e as telas # bloqueiam em SDL_Delay, entao o link usa -sASYNCIFY (com SDL_Delay em ASYNCIFY_IMPORTS, para o Asyncify # tratar a chamada como assincrona). O jogo nao grava nada em disco. # # Saida: artifacts/build/nikwi-fa5a634/nikwi.{js,wasm,data}, que o bundle.yaml confere pelo SHA-256. set -euo pipefail COMMIT=fa5a634bce0dfeb96c23b6dface2c00a7d4c7f8b SRC_SHA256=86431e7dd11e605b4312507dc4b0a803ceededc95e278f9f410ca8fe8c222785 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/nikwi-${COMMIT:0:7}" cache="$root/artifacts/cache/nikwi" tarball="$cache/nikwi-$COMMIT.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 if [ ! -f "$tarball" ]; then mkdir -p "$cache" curl -fsSL -o "$tarball.part" "https://github.com/jbradish/nikwi/archive/$COMMIT.tar.gz" mv "$tarball.part" "$tarball" fi echo "$SRC_SHA256 $tarball" | shasum -a 256 -c - >&2 rm -rf "$out" mkdir -p "$out/work/obj" tar xzf "$tarball" -C "$out/work" S="$out/work/nikwi-$COMMIT" patch -d "$S" -p1 --no-backup-if-mismatch < "$here/nikwi/nikwi-fredygames.patch" >&2 mkdir -p "$S/data/tiles" "$S/data/objects" python3 -I "$here/nikwi/bmp2ut.py" "$S/images/tiles" "$S/data/tiles" >&2 python3 -I "$here/nikwi/bmp2ut.py" "$S/images/objects" "$S/data/objects" >&2 mkdir -p "$out/work/shim/SDL" cp "$here/nikwi/nikwi-sdl12.h" "$here/nikwi/nikwi-sdl12.c" "$out/work/shim/" echo '#include "../nikwi-sdl12.h"' > "$out/work/shim/SDL/SDL.h" FLAGS=(-O2 -w -ffile-prefix-map="$out/work/=" -D_DEFAULT_SOURCE -include sys/types.h -sUSE_SDL=2 -I"$out/work/shim" -I"$S/src/badcfg" -I"$S/src/nikwi" -I"$S/src/slashfx" -I"$S/src/slashtdp" -I"$S/src/us") objs=() for f in "$S"/src/nikwi/*.cpp "$S"/src/slashfx/main.c "$S"/src/slashtdp/*.cpp "$S"/src/us/*.cpp "$S"/src/badcfg/main.c "$out/work/shim/nikwi-sdl12.c"; do o="$out/work/obj/$(basename "$(dirname "$f")")_$(basename "$f").o" objs+=("$o") case "$f" in *.cpp) em++ "${FLAGS[@]}" -c "$f" -o "$o" ;; *) emcc "${FLAGS[@]}" -c "$f" -o "$o" ;; esac done # Liga de dentro de uma pasta com caminhos relativos (o carregador do .data guarda o nome daqui). cp -R "$S/data" "$out/data" ( cd "$out" em++ -O2 "${objs[@]}" -sUSE_SDL=2 \ -sASYNCIFY -sASYNCIFY_IMPORTS=SDL_Delay -sALLOW_MEMORY_GROWTH=1 -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ --preload-file data@/data \ -o nikwi.js ) rm -rf "$out/data" "$out/work" shasum -a 256 "$out/nikwi.js" "$out/nikwi.wasm" "$out/nikwi.data"