#!/usr/bin/env bash # Compila o Pinch Points (Arnaud Gourlay; Rust + Bevy 0.20; Apache-2.0) para WebAssembly, no commit 0dc2ab5. O jogo e # feito para o desktop (LAN, arquivos, linha de comando, area de transferencia), e esta build e um port para o navegador: # pinch-points/browser-build.patch (publicado junto) faz so o que o navegador exige, sem mexer nas regras do jogo: # - sem o crate ureq (a busca de versao nova no GitHub) e sem a feature system_clipboard do Bevy; Cargo.lock podado # - relogio: web-time no lugar de std::time (que dispara panico no wasm) # - "arquivos" do jogador (configuracoes, progresso, trofeus): o localStorage da pagina, no lugar do disco # - menu sem "Replay" (biblioteca de rodadas, que precisa de disco) e sem "Beach lobby" (rede local); Esc nao sai do jogo # - sem thread: a verificacao do editor roda na hora e a animacao de destaque (GIF) nao e gerada # - os niveis do editor (pasta custom) tambem ficam no localStorage, e o jogo abre com a janela (fullscreen desligado) # - WebGL2: o struct Globals do water.wgsl ganha o preenchimento de 16 bytes, e a imagem de pre-visualizacao dos mapas # e criada direto em sRGB (WebGL2 nao tem formatos de view) # - o canvas ocupa o quadro (fit_canvas_to_parent) e os textos da barra do menu perdem "colar codigo" e "sair" # Toolchain: Rust 1.99.1 (o Bevy 0.20.1 pede 1.97.1 ou mais), wasm-bindgen 0.2.130 (a versao do Cargo.lock), binaryen 133. # A pagina (pinch-points/index.html, start.js) e nossa: baixa o .wasm comprimido em gzip (o CloudFront nao comprime # acima de 10 MB), descomprime no navegador, e so inicia depois de um clique (audio). # # src/FredGames.Bundler/Builds/build-pinch-points.sh # # Saida: artifacts/build/pinch-points/{dist/, pinch-points--dist.tar.gz, pinch-points-licenses.txt}. O .tar.gz tem # que sair igual em dois builds seguidos (perfil release do jogo: lto fat, codegen-units 1, strip; caminhos remapeados). set -euo pipefail 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" mkdir -p "$cache" export RUSTUP_HOME="$tools/rustup" CARGO_HOME="$tools/cargo" export PATH="$CARGO_HOME/bin:$PATH" TOOLCHAIN=1.99.1 COMMIT=0dc2ab5bcd5f8abc6cc719116508c160031225d7 SHA256=f63420a319aec9d5089ed786467e7fa04e4cdafe8c049a356e19c07c298028d1 WB=0.2.130 WB_SHA=b90ddb9357f584b1af897d58ad77e4cce2b48fc17e2a967bc249a87f72809444 BINARYEN=133 BINARYEN_SHA=ad66da82ac13f163e424b1643f16c6dfcccc98b5966296b43e52d3cab04f84a8 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 } untar() { # arquivo destino if [ ! -d "$2" ]; then rm -rf "$2.tmp"; mkdir -p "$2.tmp"; tar -xzf "$1" -C "$2.tmp" --strip-components 1; mv "$2.tmp" "$2" fi } slug=pinch-points out="$root/artifacts/build/$slug" tree="$root/artifacts/build/$slug/tree" fetch "https://github.com/agourlay/pinch-points/archive/$COMMIT.tar.gz" "$slug-${COMMIT:0:7}.tar.gz" "$SHA256" fetch "https://github.com/wasm-bindgen/wasm-bindgen/releases/download/$WB/wasm-bindgen-$WB-aarch64-apple-darwin.tar.gz" \ "wasm-bindgen-$WB-aarch64-apple-darwin.tar.gz" "$WB_SHA" fetch "https://github.com/WebAssembly/binaryen/releases/download/version_$BINARYEN/binaryen-version_$BINARYEN-arm64-macos.tar.gz" \ "binaryen-version_$BINARYEN-arm64-macos.tar.gz" "$BINARYEN_SHA" untar "$cache/wasm-bindgen-$WB-aarch64-apple-darwin.tar.gz" "$tools/wasm-bindgen-$WB" untar "$cache/binaryen-version_$BINARYEN-arm64-macos.tar.gz" "$tools/binaryen-version_$BINARYEN" 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/dist" "$out/wb" tar -xzf "$cache/$slug-${COMMIT:0:7}.tar.gz" -C "$tree" --strip-components 1 ( cd "$tree" patch -p1 < "$here/pinch-points/browser-build.patch" >/dev/null CARGO_INCREMENTAL=0 RUSTFLAGS="--remap-path-prefix=$tree=/src --remap-path-prefix=$CARGO_HOME=/cargo" \ cargo build --locked --release --target wasm32-unknown-unknown --bin pinch-points 2> "$out/cargo.log" \ || { tail -40 "$out/cargo.log"; exit 1; } "$tools/wasm-bindgen-$WB/wasm-bindgen" --out-name pinch-points --out-dir "$out/wb" --target web --no-typescript \ target/wasm32-unknown-unknown/release/pinch-points.wasm "$tools/binaryen-version_$BINARYEN/bin/wasm-opt" -O2 --enable-bulk-memory --enable-nontrapping-float-to-int \ --enable-sign-ext --enable-mutable-globals --enable-simd --enable-reference-types --strip-debug --strip-producers \ --output "$out/wb/opt.wasm" "$out/wb/pinch-points_bg.wasm" gzip -9n -c "$out/wb/opt.wasm" > "$out/dist/pinch-points_bg.wasm.gz" cp "$out/wb/pinch-points.js" "$out/dist/" cargo metadata --locked --format-version 1 --filter-platform wasm32-unknown-unknown 2>/dev/null > "$out/metadata.json" python3 -I "$here/gridbugs/rust-licenses.py" pinch-points "$out/crates.txt" < "$out/metadata.json" ) cp "$here/pinch-points/index.html" "$here/pinch-points/start.js" "$out/dist/" { echo "Pinch Points - licences of the build" echo "====================================" echo echo "Source: https://github.com/agourlay/pinch-points at commit $COMMIT, licensed under the Apache License 2.0 (file LICENSE)." echo "The game's pictures and sounds are generated by scripts in the repository (tools/); its fonts are DejaVu Sans Mono," echo "Nunito and a subset of Noto Sans Mono CJK JP, each with the licence file the repository keeps next to it." echo for f in LICENSE assets/fonts/DejaVu-LICENSE assets/fonts/Nunito-LICENSE assets/fonts/NotoSansCJK-LICENSE; do echo "------------------------------------------------------------------------" echo "$f" echo "------------------------------------------------------------------------" cat "$tree/$f"; echo done echo "========================================================================" cat "$out/crates.txt" } > "$out/$slug-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 > "$slug-${COMMIT:0:7}-dist.tar.gz" && rm files.txt ) rm -rf "$tree" "$out/metadata.json" "$out/wb" ls -l "$out/$slug-${COMMIT:0:7}-dist.tar.gz" shasum -a 256 "$out/$slug-${COMMIT:0:7}-dist.tar.gz" "$out/$slug-licenses.txt" "$out/dist/pinch-points_bg.wasm.gz"