#!/usr/bin/env bash # Compila o Monk Tower (roguelike de torre de Maciej Glowka, MIT; Rust + o motor rogalik, do mesmo autor, MIT) para WebAssembly # a partir do commit 83e1138 de maciekglowka/tower-rl, no molde do build-terratactician.sh (Rust 1.92.0, "cargo build --locked", # wasm-bindgen 0.2.91 = o do Cargo.lock): # # src/FredGames.Bundler/Builds/build-monk-tower.sh # # O rogalik e uma dependencia git do jogo (rev 757321605b); como a build nao deve depender do git, o script baixa o tarball dessa # revisao (sha256 conferido) e aponta a dependencia para ele por caminho (Cargo.toml e Cargo.lock ajustados: monk-tower/rogalik-path.patch). # Mudancas nos assets: os nove .wav de efeitos do repositorio nao tem autoria declarada; saem e entram sons sinteticos nossos, # com os mesmos nomes (monk-tower/gen-sfx.py, CC0). O resto (sprites, fonte bitmap, tela de titulo) e do autor, sob a MIT do repositorio. # A pagina (bevy/index.html.in, bevy/start.js.in) e nossa: o jogo so inicia depois de um clique, window.open nao abre nada e a # politica de seguranca bloqueia qualquer conexao fora da origem. O jogo e feito para a vertical (celular): em janela larga o # canvas fica numa coluna 9:16 centralizada, em vez de esticar a tela de titulo e cortar a arte. # # Saida: artifacts/build/monk-tower/{tower_bg.wasm, monk-tower-83e1138-dist.tar.gz, monk-tower-licenses.txt}. set -euo pipefail COMMIT=83e1138cb4c7a0afdb83a15f6bcd68d02bb35f62 SHA256=4ef4a4e8f4dafeb2336ab6266b4a50e12f90e72cb43d9d371c3cb951f1110980 ROGALIK=757321605b1a6ba152056bd8024e75bd555e272c ROGALIK_SHA256=e033038bae881c1ba594826c91ca335b522a90a8aa48aaf6d5f3902d7f56674f TOOLCHAIN=1.92.0 WB=0.2.91 WB_ARCH=aarch64-apple-darwin WB_SHA=8f644617cbd12763268854cb550604f18e15a869c9b2e63ba977278fee99ff3d ALLOW="${ALLOW:-}" here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" cache="$root/artifacts/build/cache" tools="$root/artifacts/tools" out="$root/artifacts/build/monk-tower" tree="$out/tree" short="${COMMIT:0:7}" mkdir -p "$cache" export RUSTUP_HOME="$tools/rustup" CARGO_HOME="$tools/cargo" export PATH="$CARGO_HOME/bin:$PATH" fetch() { # url arquivo sha256 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 - >/dev/null } fetch "https://github.com/maciekglowka/tower-rl/archive/$COMMIT.tar.gz" "monk-tower-$short.tar.gz" "$SHA256" fetch "https://github.com/maciekglowka/rogalik/archive/$ROGALIK.tar.gz" "rogalik-${ROGALIK:0:7}.tar.gz" "$ROGALIK_SHA256" fetch "https://github.com/rustwasm/wasm-bindgen/releases/download/$WB/wasm-bindgen-$WB-$WB_ARCH.tar.gz" "wasm-bindgen-$WB-$WB_ARCH.tar.gz" "$WB_SHA" if [ ! -x "$tools/wasm-bindgen-$WB/wasm-bindgen" ]; then rm -rf "$tools/wasm-bindgen-$WB.tmp"; mkdir -p "$tools/wasm-bindgen-$WB.tmp" tar -xzf "$cache/wasm-bindgen-$WB-$WB_ARCH.tar.gz" -C "$tools/wasm-bindgen-$WB.tmp" --strip-components 1 mv "$tools/wasm-bindgen-$WB.tmp" "$tools/wasm-bindgen-$WB" fi rustup toolchain install "$TOOLCHAIN" --profile minimal --target wasm32-unknown-unknown >/dev/null 2>&1 export RUSTUP_TOOLCHAIN="$TOOLCHAIN" rm -rf "$out"; mkdir -p "$tree" "$out/rogalik" "$out/dist" tar -xzf "$cache/monk-tower-$short.tar.gz" -C "$tree" --strip-components 1 tar -xzf "$cache/rogalik-${ROGALIK:0:7}.tar.gz" -C "$out/rogalik" --strip-components 1 ( cd "$tree" && patch -s -p1 < "$here/monk-tower/rogalik-path.patch" ) # Assets: efeitos sonoros nossos no lugar dos originais. python3 -I "$here/monk-tower/gen-sfx.py" "$tree/assets/sfx" # Licencas dos crates primeiro (falha cedo). ( cd "$tree" cargo metadata --locked --format-version 1 --filter-platform wasm32-unknown-unknown 2>/dev/null \ | RUST_LICENSES_ALLOW="$ALLOW" python3 -I "$here/gridbugs/rust-licenses.py" tower "$out/crates.txt" ) echo "crates com copyleft de arquivo (MPL-2.0; o fonte vai em sources do bundle.yaml):"; cat "$out/crates.txt.copyleft" 2>/dev/null || true target="$tree/target/wasm32-unknown-unknown" ( cd "$tree" CARGO_INCREMENTAL=0 RUSTFLAGS="--remap-path-prefix=$tree=/src --remap-path-prefix=$out/rogalik=/rogalik --remap-path-prefix=$CARGO_HOME=/cargo" \ cargo build --locked --release --lib --target wasm32-unknown-unknown 2> "$out/cargo.log" || { tail -40 "$out/cargo.log"; exit 1; } shasum -a 256 "$target/release/tower.wasm" > "$out/cargo-wasm.sha256" "$tools/wasm-bindgen-$WB/wasm-bindgen" --target web --no-typescript --remove-name-section --remove-producers-section \ --out-name tower --out-dir "$out/dist" "$target/release/tower.wasm" ) # Pagina e script de partida (modelos compartilhados em bevy/). canvas=' ' python3 -I - "$here/bevy/index.html.in" "$out/dist/index.html" "Monk Tower" '#000000' "$canvas" 'width: min(100vw, 100vh * 9 / 16); height: min(100vh, 100vw * 16 / 9); margin: 0 auto;' <<'PY' import sys src, dst, title, bg, canvas, css = sys.argv[1:7] s = open(src, encoding='utf-8').read() for k, v in (('@TITLE@', title), ('@BG@', bg), ('@CANVAS@', canvas), ('@CANVASCSS@', css)): s = s.replace(k, v) open(dst, 'w', encoding='utf-8').write(s) PY python3 -I - "$here/bevy/start.js.in" "$out/dist/start.js" tower 'wasm' <<'PY' import sys src, dst, name, init = sys.argv[1:5] s = open(src, encoding='utf-8').read().replace('@NAME@', name).replace('@INIT@', init) s = s.replace('@FIXED@', 'false').replace('@W@', '0').replace('@H@', '0') s += "\nwindow.open = () => null;\n" open(dst, 'w', encoding='utf-8').write(s) PY # O .wasm sai a parte (o Bundler comprime); o resto vira um tar.gz deterministico. mv "$out/dist/tower_bg.wasm" "$out/tower_bg.wasm" { cat "$here/monk-tower/licenses-header.txt" echo; echo "------------------------------------------------------------------------"; echo "LICENSE (tower-rl, o jogo)" echo "------------------------------------------------------------------------" cat "$tree/LICENSE" echo; echo "------------------------------------------------------------------------"; echo "LICENSE (rogalik, o motor)" echo "------------------------------------------------------------------------" cat "$out/rogalik/LICENSE" echo; cat "$out/crates.txt" } > "$out/monk-tower-licenses.txt" find "$out/dist" -exec touch -t 202511010000 {} + ( cd "$out" && find dist -type f | LC_ALL=C sort > files.txt \ && COPYFILE_DISABLE=1 tar --format=ustar --uid 0 --gid 0 --uname root --gname root -n -cf - -T files.txt \ | gzip -n -9 > "monk-tower-$short-dist.tar.gz" && rm files.txt ) rm -rf "$tree" "$out/rogalik" cat "$out/cargo-wasm.sha256" ls -l "$out/tower_bg.wasm" "$out/monk-tower-$short-dist.tar.gz" shasum -a 256 "$out/tower_bg.wasm" "$out/monk-tower-$short-dist.tar.gz" "$out/monk-tower-licenses.txt"