#!/usr/bin/env bash # Compila o Cataclysm: Dark Days Ahead do fredygames.com: a versao estavel 0.I-1 (CC BY-SA 3.0) em # WebAssembly, pelo suporte a Emscripten do proprio jogo (Makefile NATIVE=emscripten, o mesmo do # build-scripts/build-emscripten.sh e do build-scripts/prepare-web.sh dele), com o Emscripten 6.0.10 # e as portas SDL2 2.32.10, SDL2_image 2.6.0 (so PNG), SDL2_ttf 2.20.2, FreeType 2.14.3, # HarfBuzz 3.2.0, libpng 1.6.58 e zlib 1.3.2 dele. Este script, o patch e o prepare-data.py fazem # parte do codigo-fonte publicado junto do jogo. # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # src/FredGames.Bundler/Builds/build-cataclysm-dda.sh [--source ] # # Fonte do jogo: o tarball original da tag 0.I-1 (baixado do GitHub se --source nao for dado) ou o # Cataclysm-DDA-0.I-1-pruned.tar.gz que o fredygames.com hospeda (o mesmo, sem os tres mods deixados # de fora, as pastas mod_interactions/xedra_evolved e as traducoes em lang/po, que este build nao # usa). Os dois geram os mesmos bytes. Na pasta de fontes do site os arquivos ficam lado a lado: o # script acha o patch e o prepare-data.py ao lado dele (ou em cataclysm-dda/, no repositorio) e, # sem --source, usa o pruned que estiver ao lado dele. # # Saida: artifacts/build/cataclysm-dda-0.I-1/cataclysm-tiles.{js,wasm,data,data.js}, que o # bundle.yaml do jogo confere pelo SHA-256. Precisa do GNU make 4.3 ou mais novo (o 3.81 do macOS # nao ordena o $(wildcard), e a ordem dos objetos no link mudaria): usa o de artifacts/tools/make-4.4.1 # se existir, senao o "make" do PATH. O link (passo Asyncify do wasm-opt) leva mais de uma hora. # # Mudancas (cataclysm-dda-fredygames.patch, so no Makefile): em++ no lugar de emcc (o emcc atual nao # liga mais a libc++), -DEMSCRIPTEN (o codigo do jogo testa EMSCRIPTEN, que o Emscripten atual nao # define mais; sem ele o suporte ao navegador fica de fora) e -sDYNAMIC_EXECUTION=0 (o embind nao usa # new Function, e a pagina dispensa 'unsafe-eval' na Content-Security-Policy). Na linha de comando: avisos nao viram # erro (-w; o Clang do Emscripten 6.0.10 e mais novo que o do 3.1.51 que o jogo usa), sem som, sem # traducoes (o jogo fica em ingles), sem backtrace, sem testes. # # Opcoes do proprio Makefile do jogo: -sASYNCIFY (o laco do jogo nao retorna; emscripten_sleep cede a # vez ao navegador), sem threads (sem SharedArrayBuffer, sem COOP/COEP), -lidbfs.js (a pasta do # jogador, /home/web_user/.cataclysm-dda, vai para o IndexedDB; o proprio jogo monta e grava). # # Arquivos do jogo (prepare-data.py): data/ e gfx/ como no prepare-web.sh do jogo, sem os mods # obsoletos (menos o dda_tutorial, que o Tutorial Game usa), o mod MA e o tileset Ultica_iso (o # prepare-web.sh tambem tira os tres) e, na regra # "na duvida, fica de fora", sem os mods MMA, Backrooms e Xedra_Evolved (propriedade de terceiros). # Vao para a raiz do sistema de arquivos do jogo no cataclysm-tiles.data (file_packager do # Emscripten, sem LZ4: o site serve o arquivo em gzip). set -euo pipefail VERSION=0.I-1 EMSCRIPTEN=6.0.10 CDDA_SHA256=27e35a0a5181f88f0929bef180ca0465d00e606e569911cb02d97b59b8b5768a # Cataclysm-DDA-0.I-1-pruned.tar.gz (gerado pelo FredGames.Bundler a partir do original, deterministico). PRUNED_SHA256=5bdbbf465cc5974ca9f58bbe2f41111fd02152001b4e6d6ddf346437fc6906af here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" source_tarball="" while [ $# -gt 0 ]; do case "$1" in --source) source_tarball="$(cd "$(dirname "$2")" && pwd)/$(basename "$2")"; shift 2 ;; *) echo "Uso: $0 [--source ]" >&2; exit 2 ;; esac done # Arquivos auxiliares: em cataclysm-dda/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/cataclysm-dda/$1" ]; then echo "$here/cataclysm-dda/$1" elif [ -f "$here/$1" ]; then echo "$here/$1" else echo "Falta $1 (em $here/cataclysm-dda/ ou $here/)." >&2; exit 1; fi } patch_file="$(aux cataclysm-dda-fredygames.patch)" prepare_data="$(aux prepare-data.py)" if [ -z "$source_tarball" ] && [ -f "$here/Cataclysm-DDA-$VERSION-pruned.tar.gz" ]; then source_tarball="$here/Cataclysm-DDA-$VERSION-pruned.tar.gz" fi root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" # CDDA_OUT troca a pasta de saida (ex.: para conferir dois builds lado a lado). out="${CDDA_OUT:-$root/artifacts/build/cataclysm-dda-$VERSION}" dl="$out/dl" jobs="$(sysctl -n hw.ncpu 2>/dev/null || nproc)" make_bin="$root/artifacts/tools/make-4.4.1/bin/make" [ -x "$make_bin" ] || make_bin=make if ! "$make_bin" --version | head -1 | grep -qE 'GNU Make (4\.[3-9]|[5-9])'; then echo "Precisa do GNU make 4.3 ou mais novo ($make_bin)." >&2 exit 1 fi if ! emcc --version 2>/dev/null | head -1 | grep -q " $EMSCRIPTEN "; then echo "Precisa do Emscripten $EMSCRIPTEN no PATH (source /emsdk_env.sh)." >&2 exit 1 fi mkdir -p "$dl" if [ -n "$source_tarball" ]; then sha="$(shasum -a 256 "$source_tarball" | cut -d' ' -f1)" if [ "$sha" != "$CDDA_SHA256" ] && [ "$sha" != "$PRUNED_SHA256" ]; then echo "$source_tarball nao e o tarball original nem o pruned do Cataclysm: DDA $VERSION ($sha)." >&2 exit 1 fi cdda_tarball="$source_tarball" else [ -f "$dl/Cataclysm-DDA-$VERSION.tar.gz" ] || curl -fsSL "https://github.com/CleverRaven/Cataclysm-DDA/archive/refs/tags/$VERSION.tar.gz" \ -o "$dl/Cataclysm-DDA-$VERSION.tar.gz" echo "$CDDA_SHA256 $dl/Cataclysm-DDA-$VERSION.tar.gz" | shasum -a 256 -c - cdda_tarball="$dl/Cataclysm-DDA-$VERSION.tar.gz" fi echo "Fonte do jogo: $cdda_tarball" rm -rf "$out/source" "$out/stage" "$out"/cataclysm-tiles.* mkdir -p "$out/source" # lang/po (quase 700 MB de traducoes) nao entra neste build. tar -xzf "$cdda_tarball" -C "$out/source" --strip-components 1 --exclude "Cataclysm-DDA-$VERSION/lang/po" patch -d "$out/source" -p1 --no-backup-if-mismatch < "$patch_file" # Os cabecalhos das portas so entram no sysroot quando elas sao compiladas. embuilder build zlib libpng sdl2 freetype harfbuzz sdl2_ttf "sdl2_image:formats=png" > /dev/null 2>&1 # O Makefile consulta o git (versao, -DGIT_VERSION); a pasta de build fica dentro do repositorio do # site, entao o git nao pode subir alem dela. ( cd "$out/source" export GIT_CEILING_DIRECTORIES="$out" "$make_bin" -j"$jobs" NATIVE=emscripten RELEASE=1 TILES=1 SOUND=0 LOCALIZE=0 BACKTRACE=0 \ TESTS=0 RUNTESTS=0 LINTJSON=0 ASTYLE=0 WARNINGS=-w CXX_WARNINGS= cataclysm-tiles.js > "$out/make.log" 2>&1 || { tail -40 "$out/make.log" >&2; exit 1; } ) cp "$out/source/cataclysm-tiles.js" "$out/source/cataclysm-tiles.wasm" "$out/" "${EMSDK_PYTHON:-python3}" "$prepare_data" "$out/source" "$out/stage" ( cd "$out" "${EMSDK_PYTHON:-python3}" "$EMSDK/upstream/emscripten/tools/file_packager.py" cataclysm-tiles.data \ --js-output=cataclysm-tiles.data.js --no-node --preload stage@/ ) shasum -a 256 "$out"/cataclysm-tiles.js "$out"/cataclysm-tiles.wasm "$out"/cataclysm-tiles.data \ "$out"/cataclysm-tiles.data.js