#!/usr/bin/env bash # Compila o Pixel Dungeon: Shattered Web do fredygames.com: o Shattered Pixel Dungeon 3.3.8 (Evan Debenham; # GPL-3.0-or-later, com o Pixel Dungeon de Watabou por baixo) em JavaScript pelo TeaVM, a partir da porta web # de glassesmonkey (github.com/glassesmonkey/shattered-pixel-dungeon-web, commit ce39efd, tambem GPL-3). # Este script, o patch e o gerador do banner fazem parte do codigo-fonte publicado junto do jogo. # # src/FredGames.Bundler/Builds/build-pixel-dungeon-shattered-web.sh # # Precisa do JDK 17 (Temurin) de artifacts/tools/jdk-jdk-17.0.21+9 (ou JAVA_HOME 17+), curl, patch e python3. O Gradle # 9.4.0 e as bibliotecas (libGDX 1.14.0, gdx-teavm 1.5.5, TeaVM, org.json 20250517) vem do wrapper e do Maven # Central; o wrapper confere o SHA-256 do Gradle (distributionSha256Sum, posto pelo patch). O cache do Gradle fica em # artifacts/build/cache/gradle-pixel-dungeon-shattered-web (apague depois). # # O que o pixel-dungeon-shattered-web.patch muda: # - settings.gradle e build.gradle: so os modulos que a web usa (sem Android, iOS, desktop nem os servicos de # noticias e atualizacao, que fazem requisicoes de rede: o jogo web nunca os liga), sem o plugin do Android; # - appName e appPackageName proprios (o docs/recommended-changes.md do Shattered pede isso); # - web/build.gradle: org.json 20250517 (dominio publico) no lugar do 20170516 (licenca "Good, not Evil"); # - BuildWeb/WebLauncher: titulo da pagina e prefixo do armazenamento (IndexedDB) proprios; # - AboutScene: bloco de creditos que diz que esta e uma versao modificada, nao oficial; # - gradle-wrapper.properties: SHA-256 do Gradle. # Alem do patch, banners.png (titulo proprio, no lugar do logo "Shattered Pixel Dungeon"; make-banners.py o gera # da fonte pixel_font.ttf do proprio jogo e mantem as faixas Boss Slain e Game Over) entra em # core/src/main/assets/interfaces/. # # Saida: artifacts/build/pixel-dungeon-shattered-web-ce39efd/web.tar.gz (a pasta webapp/ do TeaVM, com o app.js # de 32 MB como app.js.gz; tar e gzip deterministicos), que o bundle.yaml confere pelo SHA-256. set -euo pipefail COMMIT=ce39efde1c4e9929103a1df684d94fab6aa84bed SRC_SHA256=ccd2a89bd453c64a9f08e6a069e1f942333f73c65efe6753e1929d5c65758051 SLUG=pixel-dungeon-shattered-web 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/cache/$SLUG" aux="$here/$SLUG" [ -d "$aux" ] || aux="$here" # na pasta de fontes do site, os arquivos ficam ao lado do script JDK="$root/artifacts/tools/jdk-jdk-17.0.21+9/Contents/Home" [ -d "$JDK" ] && export JAVA_HOME="$JDK" export GRADLE_USER_HOME="$root/artifacts/build/cache/gradle-$SLUG" tarball="$here/$SLUG-$COMMIT.tar.gz" if [ ! -f "$tarball" ]; then tarball="$cache/$SLUG-$COMMIT.tar.gz" if [ ! -f "$tarball" ]; then mkdir -p "$cache" curl -fsSL -o "$tarball.part" "https://codeload.github.com/glassesmonkey/shattered-pixel-dungeon-web/tar.gz/$COMMIT" mv "$tarball.part" "$tarball" fi fi echo "$SRC_SHA256 $tarball" | shasum -a 256 -c - >/dev/null || { echo "SHA-256 do fonte diverge." >&2; exit 1; } rm -rf "$out" mkdir -p "$out/src" "$GRADLE_USER_HOME" tar xzf "$tarball" -C "$out/src" --strip-components=1 ( cd "$out/src" && patch -p1 -s < "$aux/pixel-dungeon-shattered-web.patch" ) cp "$aux/banners.png" "$out/src/core/src/main/assets/interfaces/banners.png" ( cd "$out/src" && ./gradlew --no-daemon -q :web:webBuild ) # Pacote deterministico: app.js vira app.js.gz; ordem, datas e donos fixos. python3 -I - "$out/src/web/build/dist/webapp" "$out/web.tar.gz" <<'PY' import gzip, io, os, sys, tarfile src, dest = sys.argv[1:3] names = [] for d, _, fs in os.walk(src): for f in fs: names.append(os.path.relpath(os.path.join(d, f), src)) names.sort() raw = io.BytesIO() with tarfile.open(fileobj=raw, mode="w", format=tarfile.GNU_FORMAT) as tar: for n in names: if n == "index.html": # a pagina que hospeda o jogo e a nossa (play.html) continue data = open(os.path.join(src, n), "rb").read() if n == "app.js": n = "app.js.gz" data = gzip.compress(data, 9, mtime=0) ti = tarfile.TarInfo("webapp/" + n) ti.size = len(data); ti.mtime = 0; ti.mode = 0o644; ti.uid = ti.gid = 0; ti.uname = ti.gname = "" tar.addfile(ti, io.BytesIO(data)) with open(dest, "wb") as f: f.write(gzip.compress(raw.getvalue(), 9, mtime=0)) PY shasum -a 256 "$out/web.tar.gz" echo "Pronto: $out/web.tar.gz"