#!/usr/bin/env bash # Exporta o Tanks of Freedom (P1X; branch godot3, Godot 3.2; codigo e graficos MIT, musica e efeitos de QmYaan # CC BY-SA 4.0, fontes Courier Prime OFL e Noto Sans Apache-2.0; github.com/w84death/Tanks-of-Freedom) para a # web com o Godot 3.2.2 oficial (o README diz que so a serie 3.2.x funciona): modelo webassembly_release (sem # threads: nao precisa de SharedArrayBuffer nem de COOP/COEP), sem PWA. O jogo roda como o autor publicou; o # repositorio nao traz export_presets.cfg, entao o nosso fica ao lado deste script # (tanks-of-freedom/export_presets.cfg). Mudancas no projeto, todas feitas aqui e visiveis no fonte publicado: # - project.godot, secao [tof]: online=false (desliga scripts/online/*, que falam com api.tof.p1x.in para # compartilhar mapas e jogar online; o botao Online some do menu e qualquer requisicao devolve "Online # functions are disabled"), api_location vazio e debug_mode=false (atalhos de depuracao). # - scripts/map_controller.gd e scripts/services/map_file_handler.gd: tres linhas "var cell" sobrando (o Godot # 3.2.2 as recusa; ver o comentario no # codigo abaixo). # - os CSV de traducao (translations/*.csv, translations/campaigns/*.csv) saem da arvore antes da importacao: # o projeto usa os .translation prontos de translations/_imported/ (versionados pelo autor), e o Godot, ao # importar os CSV por conta propria, gera outros .translation sem uso, em ordem diferente a cada execucao # (ordena as mensagens por endereco de memoria), o que mudava o .pck a cada build. Os CSV continuam no # fonte publicado. # - o export deixa de fora assets/dst.crt (certificado do servidor online), bin/ e buildConfig/ (scripts e # configuracoes de exportacao para outras plataformas). # # src/FredGames.Bundler/Builds/build-tanks-of-freedom.sh # # O editor (macOS 64 bits, roda via Rosetta) e os modelos de exportacao vem do release 3.2.2-stable do GitHub, # conferidos pelo SHA-256 (os mesmos arquivos do SHA512-SUMS.txt do release) e ficam em artifacts/tools/godot-3.2.2, # instalados sob lockf. O editor roda com HOME dentro da pasta de saida (configuracao e modelo isolados). # # Saida: artifacts/build/tanks-of-freedom-6153fa1/{web/,tanks-of-freedom-6153fa1.tar.gz}, que o bundle.yaml do jogo # confere pelo SHA-256. O tar.gz e o repositorio do commit ja com as mudancas do project.godot, e sai igual a cada # execucao. set -euo pipefail COMMIT=6153fa1f3daa67e54ec32a5b9f2b3b5b6c7ef4ac SHA256=e14bd38dd4164901cde42629b462eaa9e7ed97dc9297780641b6eb8bab87bc2d GODOT=3.2.2 GODOT_URL=https://github.com/godotengine/godot/releases/download/$GODOT-stable GODOT_MAC_SHA256=36d1002ad3a99314e03195f944b86b3d9b694ad4938a32e88c4ac51c7bf9b893 GODOT_TPZ_SHA256=2b1e1332878e5230bc5139b458a9bea910e54b9c1ba7e4100398c7da2ef4b94b here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/tanks-of-freedom-${COMMIT:0:7}" cache="$root/artifacts/build/cache" tools="$root/artifacts/tools" # Arquivo auxiliar: em tanks-of-freedom/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -e "$here/tanks-of-freedom/$1" ]; then echo "$here/tanks-of-freedom/$1"; else echo "$here/$1"; fi } 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/w84death/Tanks-of-Freedom/archive/$COMMIT.tar.gz" "tanks-of-freedom-${COMMIT:0:7}.tar.gz" "$SHA256" # Instalacao compartilhada com outros jogos Godot 3.2.2; lockf evita duas instalacoes ao mesmo tempo. if [ ! -d "$tools/godot-$GODOT" ]; then fetch "$GODOT_URL/Godot_v$GODOT-stable_osx.64.zip" "Godot_v$GODOT-stable_osx.64.zip" "$GODOT_MAC_SHA256" fetch "$GODOT_URL/Godot_v$GODOT-stable_export_templates.tpz" "Godot_v$GODOT-stable_export_templates.tpz" "$GODOT_TPZ_SHA256" 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.64.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/tanks-of-freedom-${COMMIT:0:7}.tar.gz" -C "$out/tree" --strip-components 1 # Desliga o que fala com a rede: online=false, sem endereco do servidor, sem atalhos de depuracao. Cada troca # falha se o texto esperado nao existir. p="$out/tree/project.godot" for pair in 'online=true|online=false' 'api_location="api.tof.p1x.in"|api_location=""' 'debug_mode=true|debug_mode=false'; do old="${pair%%|*}"; new="${pair##*|}" grep -q "^$old\$" "$p" sed -i.bak "s|^$old\$|$new|" "$p" done rm "$p.bak" # O jogo foi feito para o Godot 3.2.0/3.2.1; o 3.2.2 recusa o script inteiro quando uma variavel e declarada com # "var cell" e depois reutilizada como variavel de "for cell in ..." na mesma funcao (scripts/map_controller.gd, # generate_map e fill_map_from_data_array: o mapa nao carrega; e map_file_handler.gd, no mesmo padrao). Tiramos as # declaracoes sobrando (o "for" declara a variavel sozinho). Cada arquivo confere quantas linhas espera. for pair in 'scripts/map_controller.gd|2' 'scripts/services/map_file_handler.gd|1'; do f="$out/tree/${pair%%|*}" test "$(grep -c '^ var cell$' "$f")" = "${pair##*|}" sed -i.bak '/^ var cell$/d' "$f" rm "$f.bak" done # Data fixa nos arquivos e fonte publicado 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/tanks-of-freedom-${COMMIT:0:7}.tar.gz" project="$out/tree" cp "$(aux 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" # Sem os CSV, o Godot nao importa traducoes (ver acima); os .translation do autor ja estao em _imported/. rm "$project"/translations/*.csv "$project"/translations/campaigns/*.csv # 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"