#!/usr/bin/env bash # Compila "I Have Put The Creature Into My Gun" (plataforma de Jez Swanson/Jezzamonn, Ludum Dare 56; MIT; sons # gerados com jsfxr, Unlicense) a partir do commit 4330453 de github.com/Jezzamonn/LD56, como o package.json do # autor: "npm ci" (package-lock.json dele), webpack e sass, com o Node 24.21.0 de artifacts/tools. Em producao # (sem source map) e sem os scripts de instalacao dos pacotes (o "canvas" nativo so serve a ferramentas de # desenvolvimento do autor). # # Mudancas no jogo (i-have-put-the-creature-into-my-gun/creature-fredygames.patch): sem o Google Analytics, sem o # link para o site do autor (a pagina roda num iframe), uma CSP que barra qualquer requisicao fora do site, os # modos de depuracao que o jogo liga em "localhost" desligados, e as fontes ChevyRay (o repositorio as ignora: # *.ttf no .gitignore, nao sao distribuidas com o codigo) trocadas pela Press Start 2P (OFL-1.1, google/fonts num # commit fixo). # # src/FredGames.Bundler/Builds/build-i-have-put-the-creature-into-my-gun.sh # # Saida: artifacts/build/i-have-put-the-creature-into-my-gun-4330453/{dist/,*-dist.tar.gz,licenses.txt}; o tar.gz # (pasta dist/) tem que sair igual em dois builds seguidos. set -euo pipefail COMMIT=43304531855abf2afaa70d437d0a5b5c4f6e4fc3 SHA256=2c242e1d581e0cac735162fbb0a7a16d35b0b5953417583390212a4fcebbf038 NODE=24.21.0 FONTS_COMMIT=2eb0b48d5f760f62e286216f0859a8c540dbc1bd FONT_SHA256=034c77f1f05ec89421e4a63f0e3a4ca1ecf852cc6d2bf611f126f275728e017d OFL_SHA256=705960c3281a5765ecc0b59bd4ed7ca59eed165748076bc2fc3e8fdbfeb944b0 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/i-have-put-the-creature-into-my-gun-${COMMIT:0:7}" cache="$root/artifacts/build/cache" nodebin="$root/artifacts/tools/node-v$NODE/bin" [ -x "$nodebin/node" ] && [ "$("$nodebin/node" -v)" = "v$NODE" ] || { echo "Precisa do Node $NODE em $nodebin." >&2; exit 1; } export PATH="$nodebin:$PATH" 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 - } fetch "https://github.com/Jezzamonn/LD56/archive/$COMMIT.tar.gz" "creature-${COMMIT:0:7}.tar.gz" "$SHA256" fonts="https://raw.githubusercontent.com/google/fonts/$FONTS_COMMIT/ofl/pressstart2p" fetch "$fonts/PressStart2P-Regular.ttf" "PressStart2P-Regular-${FONTS_COMMIT:0:7}.ttf" "$FONT_SHA256" fetch "$fonts/OFL.txt" "PressStart2P-OFL-${FONTS_COMMIT:0:7}.txt" "$OFL_SHA256" rm -rf "$out" mkdir -p "$out/tree" "$out/dist/font" "$out/dist/js" "$out/dist/css" tar -xzf "$cache/creature-${COMMIT:0:7}.tar.gz" -C "$out/tree" --strip-components 1 patch -s -p1 -d "$out/tree" < "$here/i-have-put-the-creature-into-my-gun/creature-fredygames.patch" cd "$out/tree" export npm_config_cache="$cache/npm-creature" npm_config_update_notifier=false npm ci --ignore-scripts --no-audit --no-fund --loglevel=error npx webpack --mode production --devtool false >"$out/webpack.log" 2>&1 || { tail -30 "$out/webpack.log"; exit 1; } npx sass --no-source-map src/scss/styles.scss "$out/dist/css/styles.css" cp build/client/js/main.bundle.js build/client/js/main.bundle.js.LICENSE.txt "$out/dist/js/" cp src/static/index.html "$out/dist/" cp -R src/static/img "$out/dist/img" cp "$cache/PressStart2P-Regular-${FONTS_COMMIT:0:7}.ttf" "$out/dist/font/PressStart2P-Regular.ttf" mkdir -p "$out/dist/sprites" "$out/dist/music" ( cd sprites && find . -type f \( -name '*.png' -o -name '*.json' \) ! -name 'player.gif' -print0 | while IFS= read -r -d '' f; do mkdir -p "$out/dist/sprites/$(dirname "$f")"; cp "$f" "$out/dist/sprites/$f"; done ) cp music/*.mp3 "$out/dist/music/" { echo "== I Have Put The Creature Into My Gun (LICENSE do repositorio, MIT)" cat LICENSE echo echo "== jsfxr $(node -p "require('./node_modules/jsfxr/package.json').version") (UNLICENSE do pacote; gerou os efeitos sonoros)" cat node_modules/jsfxr/UNLICENSE echo echo "== regenerator-runtime (no bundle; MIT, Facebook)" cat node_modules/regenerator-runtime/LICENSE echo echo "== Press Start 2P (google/fonts $FONTS_COMMIT, ofl/pressstart2p/OFL.txt)" cat "$cache/PressStart2P-OFL-${FONTS_COMMIT:0:7}.txt" } > "$out/licenses.txt" # dist/ vira um tar.gz deterministico (datas fixas, ordem fixa, sem dono). 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 > "i-have-put-the-creature-into-my-gun-${COMMIT:0:7}-dist.tar.gz" && rm files.txt ) cd "$out" && rm -rf tree ls -l "$out/i-have-put-the-creature-into-my-gun-${COMMIT:0:7}-dist.tar.gz" shasum -a 256 "$out/i-have-put-the-creature-into-my-gun-${COMMIT:0:7}-dist.tar.gz" "$out/licenses.txt"