#!/usr/bin/env bash # Compila o Cityforge (versao modificada do micropolisJS de Graeme McCutcheon, GPL-3 com os termos adicionais da Electronic # Arts; TypeScript/JS + jQuery 3.7.1, webpack 5) a partir do commit f13a162 de github.com/graememcc/micropolisJS, com o Node # 24.21.0 de artifacts/tools e o package-lock.json do autor ("npm ci"). # # Mudancas (cityforge/cityforge-fredygames.patch): nome novo na interface (a licenca proibe distribuir modificacao com a marca # do jogo original e exige marcar como modificada), sem o widget do Twitter, doacoes, links externos, fonte do Google, paginas # about/name_license, chave do save no localStorage propria ("cityforgeGame") e build id fixo (sem git). # # src/FredGames.Bundler/Builds/build-cityforge.sh # # Saida: artifacts/build/cityforge-f13a162/cityforge-f13a162-dist.tar.gz (dist/); o tar.gz tem que sair igual em dois builds. set -euo pipefail COMMIT=f13a1624d111d235e804bd80f48ba7c9f66a8e0f SHA256=f5dc658a86ff71f08b28d64dc4b2ad794517ea855c0c7473a5a8e50cb9f3d108 NODE=24.21.0 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/cityforge-${COMMIT:0:7}" cache="$root/artifacts/build/cache" tgz="$cache/micropolisJS-${COMMIT:0:7}.tar.gz" nodebin="$root/artifacts/tools/node-v$NODE/bin" [ -x "$nodebin/node" ] && [ "$("$nodebin/node" -v)" = "v$NODE" ] || { echo "Precisa do Node $NODE em $nodebin." >&2; exit 1; } export PATH="$nodebin:$PATH" mkdir -p "$cache" if [ ! -f "$tgz" ]; then curl -fsSL --retry 4 "https://github.com/graememcc/micropolisJS/archive/$COMMIT.tar.gz" -o "$tgz.partial" && mv "$tgz.partial" "$tgz" fi echo "$SHA256 $tgz" | shasum -a 256 -c - rm -rf "$out" mkdir -p "$out/tree" tar -xzf "$tgz" -C "$out/tree" --strip-components 1 cd "$out/tree" patch -s -p1 < "$here/cityforge/cityforge-fredygames.patch" export npm_config_cache="$cache/npm-cityforge" npm ci --ignore-scripts --no-audit --no-fund > "$out/install.log" 2>&1 || { tail -20 "$out/install.log"; exit 1; } NO_COLOR=1 npx webpack --mode production > "$out/webpack.log" 2>&1 || { tail -30 "$out/webpack.log"; exit 1; } [ -s dist/index.html ] && [ -s dist/src/micropolis.js ] mv dist "$out/dist" if grep -rqE 'twitter|googleapis|refuweegee|paypal' "$out/dist/index.html" "$out/dist/src" "$out/dist/css"; then echo "Sobrou referencia externa:" >&2 grep -rnoE 'twitter|googleapis|refuweegee|paypal' "$out/dist/index.html" "$out/dist/src" "$out/dist/css" >&2 exit 1 fi # nome do jogo original na interface/codigo servido (so os avisos de copyright podem citar) ls -R "$out/dist" > "$out/files.txt" find "$out/dist" -exec touch -t 202611080000 {} + ( cd "$out" && find dist -type f | LC_ALL=C sort > list.txt \ && COPYFILE_DISABLE=1 tar --format=ustar --uid 0 --gid 0 --uname root --gname root -n -cf - -T list.txt \ | gzip -n -9 > "cityforge-${COMMIT:0:7}-dist.tar.gz" && rm list.txt ) rm -rf "$out/tree" ls -l "$out/cityforge-${COMMIT:0:7}-dist.tar.gz" shasum -a 256 "$out/cityforge-${COMMIT:0:7}-dist.tar.gz"