#!/usr/bin/env bash # Exporta o Towards The Sunrise (AlexNottaBen, jogo de planador em 3D no estilo "corrida contra o sol"; codigo # GPL-3.0-or-later, graficos da interface CC BY 4.0 do autor, modelos 3D CC BY 4.0 / CC0, musica de Kevin MacLeod # CC BY 4.0, sons CC0 / CC BY 4.0, fontes SIL OFL; github.com/AlexNottaBen/Towards-The-Sunrise) para a web com o # Godot 3.5.3 oficial (a versao do projeto): modelo webassembly_release (sem threads: nao precisa de # SharedArrayBuffer nem de COOP/COEP), sem PWA. O export_presets.cfg (preset "Web") e nosso, ao lado deste # script. Mudancas no projeto, todas visiveis no fonte publicado (o tar.gz ja as traz): # 1. (no script, o patch nao le caminho com espaco) o gltf do cenario ("Sinrise Scene") tem dois materiais, "material" e "Material", que o autor (sistema # de arquivos sem distincao de caixa) viu como um arquivo so, material.material; o pck distingue # maiusculas de minusculas e, sem o segundo, o ceu sai cinza. O script chama o segundo de "MaterialAlt" no # gltf e o script copia material.material para MaterialAlt.material (o mesmo material que o autor via); # 2. patch towards-the-sunrise/web.patch: os botoes "Exit" (get_tree().quit(), que no navegador so trava a # pagina) ficam escondidos no menu e no menu de pausa, e as quatro texturas 4096x4096 do planador # (Hand Glider, CC BY 4.0) caem para 1024x1024 (size_limit na importacao; sao ~50 MB de textura); # 3. o export deixa de fora as quatro scene_N.png do planador (restos da exportacao do gltf, nada as # referencia) e a pasta Pictures/ (capturas do README), pelo exclude_filter do preset. # # src/FredGames.Bundler/Builds/build-towards-the-sunrise.sh # # Godot 3 precisa de duas passadas depois de "-e --quit" (a primeira exportacao ainda perde importacoes). # # Saida: artifacts/build/towards-the-sunrise-dd77887/{web/,towards-the-sunrise-dd77887.tar.gz}, que o # bundle.yaml do jogo confere pelo SHA-256. O tar.gz e o fonte publicado (o projeto no commit pinado ja com as # mudancas 1 e 2) e sai igual a cada execucao. set -euo pipefail NAME=towards-the-sunrise COMMIT=dd77887c5f3ddf7ec33be66a9977026ac5ee08f3 SHA256=c08822511a1e32f0d584c6c26cdf8d57d9c9caab29c39feb44e2b11069bc5733 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/$NAME-${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/AlexNottaBen/Towards-The-Sunrise/archive/$COMMIT.tar.gz" "$NAME-${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/$NAME-${COMMIT:0:7}.tar.gz" -C "$out/tree" --strip-components 1 tree="$out/tree" # 1. O segundo material do cenario ("Material" no gltf) vira "MaterialAlt" e usa o mesmo arquivo que o primeiro, # como no sistema do autor. gltf="$tree/Assets/Objects/Sinrise Scene/scene.gltf" test "$(grep -c '^ "name": "Material",$' "$gltf")" = 1 sed -i.bak 's/^ "name": "Material",$/ "name": "MaterialAlt",/' "$gltf" rm "$gltf.bak" cp "$tree/Assets/Objects/Sinrise Scene/material.material" "$tree/Assets/Objects/Sinrise Scene/MaterialAlt.material" # 2. Patch (botoes Exit escondidos, texturas do planador em 1024). patch -p1 -d "$tree" < "$here/$NAME/web.patch" > "$out/patch.log" # Data fixa nos arquivos. TZ=UTC find "$tree" -exec touch -t 202001010000 {} + # Fonte publicado: o projeto com as mudancas 1 e 2, em tar deterministico (ordem, dono e data fixos). ( cd "$tree" && find . -type f | sed 's|^\./||' | LC_ALL=C sort > "$out/files.txt" ) ( cd "$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/$NAME-${COMMIT:0:7}.tar.gz" cp "$here/$NAME/export_presets.cfg" "$tree/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 "$tree" # Importa os recursos (cria .import/) e exporta; a primeira exportacao ainda perde importacoes, a terceira e a final. perl -e 'alarm 600; exec @ARGV' "$godot" --path . --editor --quit --no-window --audio-driver Dummy > "$out/import.log" 2>&1 || true "$godot" --path . --export "Web" "$out/web/index.html" --no-window --audio-driver Dummy > "$out/export0.log" 2>&1 || true "$godot" --path . --export "Web" "$out/web/index.html" --no-window --audio-driver Dummy > "$out/export1.log" 2>&1 || true "$godot" --path . --export "Web" "$out/web/index.html" --no-window --audio-driver Dummy > "$out/export.log" 2>&1 # O pck precisa ter os dois materiais (o nome fica em texto no indice do pck). grep -a -q 'Sinrise Scene/MaterialAlt.material' "$out/web/index.pck" grep -a -q 'Sinrise Scene/material.material' "$out/web/index.pck" ls -l "$out/web"