#!/usr/bin/env bash # Compila o Mazocarta (jogo tatico de cartas / roguelike de Tim Cogan, MIT; Rust -> WebAssembly) para a web a # partir do fonte, num commit fixo, com o Rust 1.92.0 (o Cargo.toml pede 1.85+, edicao 2024), como o # scripts/build-web.sh do autor mas sem os passos de PWA (icones PNG, manifest, service worker): # - npm ci (package-lock do autor) + scripts/vendor-qr-libs.mjs: gera web/qrcode.bundle.mjs (qrcode 1.5.4, MIT) # e web/jsqr.js (jsQR 1.4.0, Apache-2.0), usados pelo modo de 2 jogadores por QR code (sem servidor); # - cargo build --lib --release --locked --target wasm32-unknown-unknown (Cargo.lock do autor). # Mudancas no jogo (Builds/mazocarta/mazocarta-fredygames.patch): o link de creditos do autor deixa de abrir # (nada de requisicao nem navegacao para fora do site), o service worker nao e registrado, o index.html nao # liga o manifest PWA e os icones de combate sao carregados como .svg (no lugar dos .png que o resvg gerava). # # src/FredGames.Bundler/Builds/build-mazocarta.sh # # Saida: artifacts/build/mazocarta-5ad68f8/{site.tar.gz,mazocarta-5ad68f8.tar.gz,licenses/}; site.tar.gz # (a pasta do jogo) tem que sair igual em dois builds seguidos. set -euo pipefail SLUG=mazocarta COMMIT=5ad68f82933768795290fad7b341509aaa4d6e9d SHA256=928a8c3089540546b6da4ee661fb20c30ae74b811f127d5de233165036aeec31 URL="https://github.com/timcogan/mazocarta/archive/$COMMIT.tar.gz" RUST=1.92.0 BUILD_TS=2026-10-14T12:04Z # data do commit; o jogo mostra o carimbo na tela de configuracoes here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/$SLUG-${COMMIT:0:7}" cache="$root/artifacts/build/cache" tools="$root/artifacts/tools" mkdir -p "$cache" fetch() { if [ ! -f "$cache/$2" ]; then curl -fsSL --retry 4 "$1" -o "$cache/$2.partial" && mv "$cache/$2.partial" "$cache/$2" fi echo "$3 $cache/$2" | shasum -a 256 -c - } export RUSTUP_HOME="$tools/rustup" export CARGO_HOME="$tools/cargo" export PATH="$tools/node-v24.21.0/bin:$CARGO_HOME/bin:$PATH" export RUSTUP_TOOLCHAIN="$RUST-$(uname -m | sed 's/arm64/aarch64/')-apple-darwin" [ "$(rustc --version | cut -d' ' -f2)" = "$RUST" ] || { echo "Rust inesperado: $(rustc --version)"; exit 1; } rustc --print target-list >/dev/null [ -d "$RUSTUP_HOME/toolchains/$RUSTUP_TOOLCHAIN/lib/rustlib/wasm32-unknown-unknown" ] || rustup target add wasm32-unknown-unknown --toolchain "$RUSTUP_TOOLCHAIN" fetch "$URL" "$SLUG-${COMMIT:0:7}.tar.gz" "$SHA256" rm -rf "$out" mkdir -p "$out/tree" tar -xzf "$cache/$SLUG-${COMMIT:0:7}.tar.gz" -C "$out/tree" --strip-components 1 # Fonte publicado (sem alteracoes): o tarball do commit, regravado em tar deterministico. ( cd "$out/tree" && find . -type f | sed 's|^\./||' | LC_ALL=C sort > "$out/files.txt" ) ( cd "$out/tree" && COPYFILE_DISABLE=1 tar --format=ustar --uid 0 --gid 0 --uname root --gname root -n \ -cf - -T "$out/files.txt" ) | gzip -n -9 > "$out/$SLUG-${COMMIT:0:7}.tar.gz" patch -s -p1 -d "$out/tree" < "$here/mazocarta/mazocarta-fredygames.patch" cd "$out/tree" npm ci --prefer-offline --no-audit --no-fund --ignore-scripts >/dev/null node scripts/vendor-qr-libs.mjs export MAZOCARTA_APP_CHANNEL=stable MAZOCARTA_APP_BUILD_TIMESTAMP_UTC="$BUILD_TS" MAZOCARTA_APP_GIT_SHA_SHORT="${COMMIT:0:7}" export CARGO_TARGET_DIR="$cache/cargo-target-$SLUG" export RUSTFLAGS="--remap-path-prefix=$out/tree=mazocarta --remap-path-prefix=$CARGO_HOME=cargo --remap-path-prefix=$RUSTUP_HOME=rustup" cargo build --lib --release --locked --target wasm32-unknown-unknown # A pasta do jogo (o que o index.html carrega). site="$out/site" mkdir -p "$site/icons/combat" cp web/index.html web/index.js web/multiplayer.js web/ui-kit.js web/ui-kit.css web/ui-overlays.css web/styles.css \ web/mazocarta.svg web/jsqr.js web/qrcode.bundle.mjs "$site/" cp "$CARGO_TARGET_DIR/wasm32-unknown-unknown/release/mazocarta.wasm" "$site/mazocarta.wasm" cp web/icons/combat/*.svg "$site/icons/combat/" find "$site" -exec touch -t 202610141204 {} + ( cd "$out" && find site -type f | LC_ALL=C sort > "$out/site-files.txt" ) ( cd "$out" && COPYFILE_DISABLE=1 tar --format=ustar --uid 0 --gid 0 --uname root --gname root -n \ -cf - -T "$out/site-files.txt" ) | gzip -n -9 > "$out/site.tar.gz" # Licencas: as crates Rust que entram no wasm e os pacotes npm embutidos (qrcode e jsqr). mkdir -p "$out/licenses" cargo metadata --locked --format-version 1 --filter-platform wasm32-unknown-unknown | python3 -I -c ' import json, os, sys m = json.load(sys.stdin) ids = {n["id"] for n in m["resolve"]["nodes"]} for p in sorted(m["packages"], key=lambda p: (p["name"], p["version"])): if p["id"] not in ids or p["name"] == "mazocarta": continue d = os.path.dirname(p["manifest_path"]) print("== crate %s %s (%s)" % (p["name"], p["version"], p.get("license"))) for f in sorted(os.listdir(d)): if f.upper().startswith(("LICENSE", "LICENCE", "COPYING", "NOTICE", "UNLICENSE")): print("-- " + f) print(open(os.path.join(d, f), errors="replace").read()) ' > "$out/licenses/rust-crates.txt" for pkg in qrcode dijkstrajs jsqr; do d="node_modules/$pkg" echo "== npm $pkg $(node -p "require('./$d/package.json').version") ($(node -p "require('./$d/package.json').license"))" for f in "$d"/LICENSE* "$d"/license*; do [ -f "$f" ] && { echo "-- $(basename "$f")"; cat "$f"; echo; }; done done > "$out/licenses/npm.txt" ls -l "$site/mazocarta.wasm" "$out/site.tar.gz" shasum -a 256 "$site/mazocarta.wasm" "$out/site.tar.gz" "$out/$SLUG-${COMMIT:0:7}.tar.gz"