#!/usr/bin/env bash # Compila o Chessamphetamine do fredygames.com: o jogo de xadrez e cartas de Jason Rohrer (2026, dominio # publico) em WebAssembly, com o Emscripten 6.0.10. 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-chessamphetamine.sh # # Fonte: o commit 4f12111 do repositorio do autor no GitHub (jasonrohrer/Chessamphetamine), conferido # pelo SHA-256 e guardado em artifacts/cache/chessamphetamine/. # # chessamphetamine/mingin-web.patch: o jogo roda sobre a "Mingin" do autor, uma camada de plataforma de # um arquivo so (mingin.h, dominio publico) que traz versoes para Linux e Windows. O patch acrescenta uma # para o navegador (mingin_web.h: video, teclado, mouse, audio e arquivos via SDL2 do Emscripten) e liga # ela no mingin.h com 3 linhas; nenhum arquivo do jogo muda. # # Saida: artifacts/build/chessamphetamine-4f12111/chessamphetamine.{js,wasm,data}, que o bundle.yaml # confere pelo SHA-256. set -euo pipefail COMMIT=4f121115ca9dd040d3d61b0e9b02319000e99247 SRC_SHA256=0952b6b9447f07211d9206e93966c1fc77ca912a78712de60554ceb4f5838ec7 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/chessamphetamine-${COMMIT:0:7}" cache="$root/artifacts/cache/chessamphetamine" tarball="Chessamphetamine-$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 # Arquivo auxiliar: em chessamphetamine/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/chessamphetamine/$1" ]; then echo "$here/chessamphetamine/$1"; else echo "$here/$1"; fi } # fetch : usa o arquivo ao lado do script, ou baixa para o cache. fetch() { local file="$here/$(basename "$2")" if [ ! -f "$file" ]; then file="$2" if [ ! -f "$file" ]; then mkdir -p "$(dirname "$file")" curl -fsSL -o "$file.part" "$1" mv "$file.part" "$file" fi fi echo "$3 $file" | shasum -a 256 -c - >&2 echo "$file" } src_tar="$(fetch "https://github.com/jasonrohrer/Chessamphetamine/archive/$COMMIT.tar.gz" "$cache/$tarball" "$SRC_SHA256")" rm -rf "$out" mkdir -p "$out/src" "$out/obj" tar xzf "$src_tar" -C "$out/src" --strip-components 1 patch -d "$out/src" -p1 --quiet --no-backup-if-mismatch < "$(aux mingin-web.patch)" # Compila de dentro da pasta de saida, com caminhos relativos. O jogo le data/ do diretorio de trabalho # e grava em settings/ (a pagina monta o IndexedDB nessa pasta). cd "$out" for f in game maxigin_imp mingin_imp header_impA header_impB; do emcc -O2 -w -std=gnu99 -ffile-prefix-map="$PWD/=" -sUSE_SDL=2 -Isrc -c "src/$f.c" -o "obj/$f.o" & done wait emcc -O2 -w obj/*.o -sUSE_SDL=2 -lidbfs.js -sALLOW_MEMORY_GROWTH -sINITIAL_MEMORY=256MB -sSTACK_SIZE=2MB \ -sENVIRONMENT=web -sEXIT_RUNTIME=1 -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file src/data@/data -o chessamphetamine.js rm -rf obj shasum -a 256 chessamphetamine.js chessamphetamine.wasm chessamphetamine.data