#!/usr/bin/env bash # Exporta o Charge Kid (USPGameDev: Ayrton Sato, Rafael Bordoni e Vicente Farias; codigo MIT, arte e audio CC0 ou # CC BY 3.0, gitlab.com/uspgamedev/charge_kid) para a web com o Godot 3.2.2 oficial (a versao do projeto): # 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 (charge-kid/export_presets.cfg). Uma mudanca no projeto, feita aqui: # - assets/textures/controller-{sony,nintendo,microsoft}.png sao desenhos de controles de console (com os # simbolos e nomes de botoes de cada fabricante) e saem da arvore; entram no lugar, com os mesmos nomes e # tamanhos, diagramas genericos (so texto: L1, Up, Top, Select...) de charge-kid/controller-*.png, CC0, # gerados por charge-kid/gen-controller-diagrams.py com a fonte do proprio jogo (Press Start 2P, OFL). # Os arquivos .import do repositorio ficam como estao. # - o export deixa de fora os *.proxy.mkv (proxies de video que o autor deixou na pasta de audio). # # src/FredGames.Bundler/Builds/build-charge-kid.sh # # Fonte baixado da API do GitLab (o link /-/archive/ fica atras de um desafio do Cloudflare; a API devolve o # mesmo tar.gz, igual a cada download). 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/charge-kid-61eec33/{web/,charge-kid-61eec33.tar.gz}, que o bundle.yaml do jogo confere # pelo SHA-256. O tar.gz e o repositorio do commit com os diagramas trocados, e sai igual a cada execucao. set -euo pipefail COMMIT=61eec3361e1f07a7a8fa29c7df4d20e731a22917 SHA256=39081a6e375274474b02fc65ae7e5aa632c3bba868d896a3a4f72996fabe1350 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/charge-kid-${COMMIT:0:7}" cache="$root/artifacts/build/cache" tools="$root/artifacts/tools" # Arquivo auxiliar: em charge-kid/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/charge-kid/$1" ]; then echo "$here/charge-kid/$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://gitlab.com/api/v4/projects/uspgamedev%2Fcharge_kid/repository/archive.tar.gz?sha=$COMMIT" \ "charge-kid-${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/charge-kid-${COMMIT:0:7}.tar.gz" -C "$out/tree" --strip-components 1 # Diagramas genericos no lugar dos desenhos de controles de console. for m in sony nintendo microsoft; do test -f "$out/tree/source/assets/textures/controller-$m.png" cp "$(aux controller-$m.png)" "$out/tree/source/assets/textures/controller-$m.png" 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/charge-kid-${COMMIT:0:7}.tar.gz" project="$out/tree/source" 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" # 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"