#!/usr/bin/env bash # Exporta o Hunt for the Shadow Rider (Alexander Huntley, Open Jam 2019; codigo GPL-3.0, arte Ansimuz/domsson/ # TokyoGeisha CC0, musica de Eric Matyas CC BY 4.0, fontes OFL e CC0, github.com/alexhuntley/Hunt-for-the-Shadow-Rider) # para a web com o Godot 3.5.3 oficial: modelo webassembly_release (sem threads: nao precisa de SharedArrayBuffer # nem de COOP/COEP), sem PWA. O projeto e do Godot 3.x (config_version 4). O repositorio traz um # export_presets.cfg com caminhos do autor e sem preset util para nos; o nosso fica ao lado deste script. # Mudancas no projeto, todas feitas aqui e visiveis no fonte publicado: # - props/BannerCoke.tscn e props/BannerBig.tscn mostravam letreiros com marca (um "COKE" em neon e, no # "banner-big", uma silhueta que lembra o logo da Atari): as duas cenas passam a usar os letreiros neon # em japones (banner-side e banner-neon, do mesmo pacote CC0) e as pastas banner-coke/ e banner-big/ saem; # - StartGame.tscn tocava Cyber-Dream-Loop.ogg, faixa que o README do projeto nao credita (as tags dizem # Eric Matyas, mas a licenca dela nao esta no projeto): o arquivo sai e a tela de titulo toca # Neon-Runner_Looping.ogg, uma das quatro faixas que o README credita (CC BY 4.0); # - get_tree().quit() (botoes e tecla Q de sair) apaga a pagina no navegador: os quatro pontos passam a voltar # para a tela de titulo (StartGame.tscn), tirando antes a pausa; # - o export deixa de fora os .mp3 (copias das .ogg), os .gif de previa, o README e o LICENSE.txt do projeto. # # src/FredGames.Bundler/Builds/build-hunt-for-the-shadow-rider.sh # # Saida: artifacts/build/hunt-for-the-shadow-rider-095b68a/{web/,hunt-for-the-shadow-rider-095b68a.tar.gz}, que o # bundle.yaml do jogo confere pelo SHA-256. O tar.gz e o repositorio do commit com as mudancas acima e sai igual # a cada execucao. set -euo pipefail SLUG=hunt-for-the-shadow-rider COMMIT=095b68ae923a10fca416caca52f84953bd909596 SHA256=3c75bcb7f60f191a71b8fe159d8ea8e901c93f6ecdc8226b5db9676f24deb63e URL=https://github.com/alexhuntley/Hunt-for-the-Shadow-Rider/archive/$COMMIT.tar.gz GODOT=3.5.3 GODOT_URL=https://github.com/godotengine/godot/releases/download/$GODOT-stable GODOT_MAC_SHA256=d448bf70a438edfd506c6878963327d7814d83fd636d132294fb7abb1f971246 GODOT_TPZ_SHA256=ae3c1f6fbd431b9e3b67c1f9e42539a6d270a0ccc35558f13072f04b968312d1 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 - } fetch "$URL" "$SLUG-${COMMIT:0:7}.tar.gz" "$SHA256" fetch "$GODOT_URL/Godot_v$GODOT-stable_osx.universal.zip" "Godot_v$GODOT-stable_osx.universal.zip" "$GODOT_MAC_SHA256" fetch "$GODOT_URL/Godot_v$GODOT-stable_export_templates.tpz" "Godot_v$GODOT-stable_export_templates.tpz" "$GODOT_TPZ_SHA256" # Instalacao compartilhada com outros jogos Godot 3.5.3; lockf evita duas instalacoes ao mesmo tempo. if [ ! -d "$tools/godot-$GODOT" ]; then install_godot() { [ -d "$tools/godot-$GODOT" ] && return 0 rm -rf "$tools/godot-$GODOT.tmp" mkdir -p "$tools/godot-$GODOT.tmp" unzip -q "$cache/Godot_v$GODOT-stable_osx.universal.zip" -d "$tools/godot-$GODOT.tmp" unzip -q "$cache/Godot_v$GODOT-stable_export_templates.tpz" templates/webassembly_release.zip templates/version.txt \ -d "$tools/godot-$GODOT.tmp" mv "$tools/godot-$GODOT.tmp" "$tools/godot-$GODOT" } export -f install_godot; export tools GODOT cache lockf -k "$root/artifacts/godot-$GODOT.lock" bash -c install_godot fi rm -rf "$out" mkdir -p "$out/tree" "$out/web" tar -xzf "$cache/$SLUG-${COMMIT:0:7}.tar.gz" -C "$out/tree" --strip-components 1 # Marcas: o "COKE" e a silhueta tipo Atari saem (ver o cabecalho). p="$out/tree/props" grep -q 'banner-coke/banner-coke-' "$p/BannerCoke.tscn" sed -i.bak 's|banner-coke/banner-coke-|banner-side/banner-side-|' "$p/BannerCoke.tscn" grep -q 'banner-big/banner-big-' "$p/BannerBig.tscn" sed -i.bak 's|banner-big/banner-big-|banner-neon/banner-neon-|' "$p/BannerBig.tscn" rm "$p"/*.bak rm -rf "$out/tree/warped city files/ENVIRONMENT/props/banner-coke" "$out/tree/warped city files/ENVIRONMENT/props/banner-big" if grep -rIl --exclude-dir=.git -E 'banner-coke|banner-big' "$out/tree" | grep .; then echo "restou referencia aos letreiros" >&2; exit 1; fi # Sair no navegador: volta para o titulo. for f in StartGame.gd PauseLayer.gd QuitKey.gd GameOverLayer.gd; do grep -q 'get_tree().quit()' "$out/tree/$f" perl -pi -e 's/^(\s*)get_tree\(\)\.quit\(\)/$1get_tree().paused = false\n$1get_tree().change_scene("res:\/\/StartGame.tscn")/' "$out/tree/$f" if grep -q 'get_tree().quit()' "$out/tree/$f"; then echo "quit() restou em $f" >&2; exit 1; fi done # Musica sem credito no README. grep -q 'res://Cyber-Dream-Loop.ogg' "$out/tree/StartGame.tscn" sed -i.bak 's|res://Cyber-Dream-Loop.ogg|res://Neon-Runner_Looping.ogg|' "$out/tree/StartGame.tscn" rm "$out/tree/StartGame.tscn.bak" "$out/tree/Cyber-Dream-Loop.ogg" "$out/tree/Cyber-Dream-Loop.ogg.import" if grep -rIl --exclude-dir=.git 'Cyber-Dream' "$out/tree" | grep .; then echo "restou referencia a Cyber-Dream" >&2; exit 1; fi # Fonte publicado: o repositorio do commit com as mudancas acima, em tar deterministico (ordem, dono e data fixos). TZ=UTC find "$out/tree" -exec touch -t 202001010000 {} + ( 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" project="$out/tree" cp "$here/$SLUG/export_presets.cfg" "$project/export_presets.cfg" export HOME="$out/home" TZ=UTC LC_ALL=C templates="$HOME/Library/Application Support/Godot/templates/$GODOT.stable" mkdir -p "$templates" cp "$tools/godot-$GODOT/templates/webassembly_release.zip" "$tools/godot-$GODOT/templates/version.txt" "$templates/" godot="$tools/godot-$GODOT/Godot.app/Contents/MacOS/Godot" cd "$project" # A primeira passada importa os recursos (cria .import/); a segunda exporta. "$godot" --path . --editor --quit --no-window > "$out/import.log" 2>&1 || true "$godot" --path . --export "Web" "$out/web/index.html" --no-window > "$out/export.log" 2>&1 ls -l "$out/web"