#!/usr/bin/env bash # Exporta o Strange Winds (Yuri N. Martinez Laskowski e Lui Wolff, OpenGameArt Winter Game Jam 2022; GPL-3.0) # para a web com o Godot 3.5.3 oficial: modelo webassembly_release (sem threads), sem PWA. O repositorio traz # um export_presets.cfg so para desktop; o nosso (preset "Web") fica ao lado deste script. Mudancas no projeto, # todas feitas aqui (e entregues no tar do fonte, que e o projeto ja mudado): # 1. gfx/gui/navigator_portrait.png (retrato animado do navegador, do pacote "Animated Shadowy Portraits" de # YuriNikolai) e rostos gerados por StyleGAN2, e a OpenGameArt tirou os arquivos do ar por "possiveis # problemas de licenca". Como a licenca nao esta comprovada, trocamos por uma silhueta desenhada por nos # (scripts/navigator_silhouette.py, GPL-3.0-or-later) e tiramos o credito de texts/credits.csv e README.md. # 2. Os botoes Quit (menu, tela de morte, tela final) nao fazem sentido numa pagina web: o do menu nao faz # nada e os outros voltam ao menu. # # src/FredGames.Bundler/Builds/build-strange-winds.sh # # Saida: artifacts/build/strange-winds-9b50080/{web/,strange-winds-9b50080.tar.gz}, que o bundle.yaml do jogo # confere pelo SHA-256. O tar.gz e o projeto do commit com as mudancas acima (fonte GPL), deterministico. set -euo pipefail SLUG=strange-winds COMMIT=9b50080be41c66032909a7b51b9694298d00db89 SHA256=452957971f21279b348b0a15e7af963ade61227a9b97b158d2a8b31f0383e1e7 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 "https://github.com/YuriNikolai/StrangeWinds/archive/$COMMIT.tar.gz" "$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" 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 project="$out/tree" # 1. Retrato: silhueta nossa no lugar dos rostos gerados por IA; credito removido. mkdir -p "$project/scripts" cp "$here/$SLUG/navigator_silhouette.py" "$project/scripts/navigator_silhouette.py" "$tools/venv/bin/python" -I "$project/scripts/navigator_silhouette.py" "$project/gfx/gui/navigator_portrait.png" "$tools/venv/bin/python" -I - "$project" <<'PY' import re, sys root = sys.argv[1] # credits.csv (BBCode): bloco entre dois "[center]---[/center]". p = root + "/texts/credits.csv" t = open(p, encoding="utf-8").read() n = t.count('"Animated Shadowy Portraits"') assert n == 1, n t2 = re.sub(r'\[color=#FFA500\]"Animated Shadowy Portraits".*?\[center\]---\[/center\]\n\n', '', t, flags=re.S) assert t2 != t open(p, "w", encoding="utf-8").write(t2) # README.md: bloco entre dois "---". p = root + "/README.md" t = open(p, encoding="utf-8").read() t2 = re.sub(r'\* "Animated Shadowy Portraits".*?\n---\n\n', '', t, flags=re.S) assert t2 != t open(p, "w", encoding="utf-8").write(t2) PY ! grep -rq "Shadowy" "$project/texts" "$project/README.md" # 2. Botoes Quit. sed -i.bak 's/^\tget_tree().quit()$/\tpass # web: nothing to quit/' "$project/scripts/MainMenu.gd" for f in EndMenu DeathScreen; do sed -i.bak 's/^\tget_tree().quit()$/\tGlobal.day = 0\n\tget_tree().change_scene("res:\/\/scenes\/Menu.tscn")/' "$project/scripts/$f.gd" done rm "$project"/scripts/*.bak grep -q 'web: nothing to quit' "$project/scripts/MainMenu.gd" grep -q 'scenes/Menu.tscn' "$project/scripts/EndMenu.gd" "$project/scripts/DeathScreen.gd" ! grep -rq 'get_tree().quit()' "$project/scripts" touch -t 202401010000 "$project"/scripts/{MainMenu,EndMenu,DeathScreen}.gd "$project/README.md" "$project/texts/credits.csv" \ "$project/gfx/gui/navigator_portrait.png" "$project/scripts/navigator_silhouette.py" # Fonte publicado: o projeto ja mudado (o .import do upstream vai junto), em tar deterministico. ( cd "$project" && find . -type f ! -name export_presets.cfg | sed 's|^\./||' | LC_ALL=C sort > "$out/files.txt" ) ( cd "$project" && 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" 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" "$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"