#!/usr/bin/env bash
# Compila o Outlaw Mayor Panic! (01010111 / Will Blanton, Ludum Dare 41, 2018; codigo, arte e musica MIT;
# github.com/01010111/LD41) para a web (HTML5) com o HaxeFlixel, com as mesmas ferramentas pinadas do Plankter (Haxe
# 4.3.6, Lime 8.1.2, OpenFL 9.3.3, HaxeFlixel 5.8.0, flixel-addons 3.2.3; ver build-plankter.sh, que as instala) e o
# zerolib 0.2.3 (MIT, lib.haxe.org). O jogo usou um zerolib de abril de 2018, que nunca foi publicado no haxelib (a
# primeira versao la e de julho de 2018); o 0.2.3 e a mais antiga e traz quase tudo, e o que falta (ZState,
# ZPlayerController, ZBaseController) esta em outlaw-mayor-panic/web.patch. O ndll do Lime so existe para x86_64:
# em Apple Silicon roda sob Rosetta.
#
# Mudancas (o repositorio do commit pinado e o que mudamos esta em outlaw-mayor-panic/web.patch):
# - o texto de fim de jogo "GO FRICK URSELF" (um insulto disfarcado) sai da lista de frases;
# - classes do zerolib de 2018 que o jogo usa e o 0.2.3 nao tem, escritas de novo (shim/), e tirados os imports que
# nao eram usados; o findPath do HaxeFlixel 5 recebe o simplificador como um enum (antes eram dois Bool "false");
# - a fonte padrao do HaxeFlixel, "Nokia Cellphone FC Small", vira a Jersey 20 (SIL OFL 1.1), como no Plankter;
# - uma Content-Security-Policy no index.html (nenhuma conexao fora desta origem);
# - a versao do cache de assets, um numero aleatorio que o Lime grava no LD41.js, vira 1 (build reprodutivel).
#
# src/FredGames.Bundler/Builds/build-outlaw-mayor-panic.sh
#
# Saida: artifacts/build/outlaw-mayor-panic-ec491c0/{web.tar.gz,web.patch,third-party-licenses.txt,Jersey20-OFL.txt};
# o tar sai igual a cada execucao. Nao ha tarball do fonte: a licenca e MIT, e o repositorio traz em _project/ amostras
# do FL Studio (nao redistribuiveis soltas) que ficam de fora.
set -euo pipefail
NAME=outlaw-mayor-panic
COMMIT=ec491c09fd9a0f6178da71aec1c613690cb9080b
SHA256=6a3a167ed52cd55aea8ba8952ac463a9068c6805496be9918d4dfe06f01fef04
ZEROLIB_SHA256=3b8520d92e7365a561f2415c2bef72b2f6a5deef2a3f10af4dd6e81d4076ba5b
HAXE=4.3.6
NEKO=2.4.0
FONTS_COMMIT=9862abc066c9b83bf84c3e8ed1fc2d8d48f9bbf0
here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)"
out="$root/artifacts/build/$NAME-${COMMIT:0:7}"
cache="$root/artifacts/build/cache"
tools="$root/artifacts/tools"
libs="$tools/haxelib-plankter"
py="$tools/venv/bin/python"
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 -
}
# Haxe, Neko e as bibliotecas pinadas: as mesmas do Plankter.
bash "$here/build-plankter.sh" --install
fetch "https://github.com/01010111/LD41/archive/$COMMIT.tar.gz" "$NAME-${COMMIT:0:7}.tar.gz" "$SHA256"
fetch "https://lib.haxe.org/files/3.0/zerolib-0,2,3.zip" "zerolib-0,2,3.zip" "$ZEROLIB_SHA256"
fetch "https://raw.githubusercontent.com/google/fonts/$FONTS_COMMIT/ofl/jersey20/Jersey20-Regular.ttf" \
"Jersey20-Regular-${FONTS_COMMIT:0:7}.ttf" 76670d7e8826860e3d2f2846b88bc1652135b8d54b6adfa5a87649b9fa4bd3b4
fetch "https://raw.githubusercontent.com/google/fonts/$FONTS_COMMIT/ofl/jersey20/OFL.txt" \
"Jersey20-OFL-${FONTS_COMMIT:0:7}.txt" 436d5836064cec796c7ddde6fb4faeabdb6f2f17443a24a30d0c38b75d13f922
rm -rf "$out"
mkdir -p "$out/tree" "$out/web" "$out/haxelib" "$out/bin" "$out/home"
tar -xzf "$cache/$NAME-${COMMIT:0:7}.tar.gz" -C "$out/tree" --strip-components 1
tree="$out/tree"
# Mudancas do port.
( cd "$tree" && patch -p1 --no-backup-if-mismatch < "$here/outlaw-mayor-panic/web.patch" > "$out/patch.log" )
cp "$here/outlaw-mayor-panic/web.patch" "$out/"
TZ=UTC find "$tree" -exec touch -t 202001010000 {} +
# Repositorio de bibliotecas desta compilacao: links para as originais e um flixel proprio, com a fonte trocada.
for lib in lime openfl flixel-addons; do ln -s "$libs/$lib" "$out/haxelib/$lib"; done
mkdir -p "$out/haxelib/flixel"
cp -R "$libs/flixel/5,8,0" "$out/haxelib/flixel/5,8,0"
mkdir -p "$out/haxelib/zerolib/0,2,3"
unzip -q "$cache/zerolib-0,2,3.zip" -d "$out/haxelib/zerolib/0,2,3"
printf '%s' "0.2.3" > "$out/haxelib/zerolib/.current"
printf '%s' "5.8.0" > "$out/haxelib/flixel/.current"
flixel="$out/haxelib/flixel/5,8,0"
cp "$cache/Jersey20-Regular-${FONTS_COMMIT:0:7}.ttf" "$flixel/assets/fonts/jersey20.ttf"
rm "$flixel/assets/fonts/nokiafc22.ttf" "$flixel/assets/fonts/nokiafc22.ttf.hash" "$flixel/assets/fonts/nokiafc22.woff" \
"$flixel/assets/fonts/nokiafc22.svg"
sed -i.bak 's|nokiafc22.ttf|jersey20.ttf|g' "$flixel/include.xml"
sed -i.bak 's|FONT_DEFAULT:String = "Nokia Cellphone FC Small"|FONT_DEFAULT:String = "Jersey 20 Regular"|' "$flixel/flixel/system/FlxAssets.hx"
grep -q 'FONT_DEFAULT:String = "Jersey 20 Regular"' "$flixel/flixel/system/FlxAssets.hx"
sed -i.bak2 '/fonts\/monsterrat.ttf/d' "$flixel/include.xml"
! grep -q 'monsterrat\|nokia' "$flixel/include.xml"
rm "$flixel/flixel/system/FlxAssets.hx.bak" "$flixel/include.xml.bak" "$flixel/include.xml.bak2"
# O haxelib e o neko sao chamados pelo Lime por um shell (/bin/sh), que perde o DYLD_*: dois wrappers resolvem.
for b in haxelib neko; do
real="$tools/haxe-$HAXE/$b"; [ "$b" = neko ] && real="$tools/neko-$NEKO/neko"
printf '#!/bin/sh\nexport DYLD_FALLBACK_LIBRARY_PATH=%s\nexec %s "$@"\n' "$tools/neko-$NEKO" "$real" > "$out/bin/$b"
chmod +x "$out/bin/$b"
done
export NEKOPATH="$tools/neko-$NEKO" DYLD_FALLBACK_LIBRARY_PATH="$tools/neko-$NEKO" HAXE_STD_PATH="$tools/haxe-$HAXE/std"
export PATH="$out/bin:$tools/haxe-$HAXE:$PATH" HAXEPATH="$tools/haxe-$HAXE" HAXELIB_PATH="$out/haxelib"
export HOME="$out/home" TZ=UTC LC_ALL=C
cd "$tree"
arch -x86_64 /bin/bash -c 'haxelib run lime build html5 -release' > "$out/build.log" 2>&1 || { tail -30 "$out/build.log" >&2; exit 1; }
bin="$tree/export/html5/bin"
test -f "$bin/LD41.js"
grep -q "font-family: 'Jersey 20 Regular'" "$bin/index.html"
"$py" -I - "$bin/index.html" <<'PY'
import sys, pathlib
p = pathlib.Path(sys.argv[1]); t = p.read_text()
csp = ('\n\t')
assert t.count('') == 1
t = t.replace('', '\n\t' + csp.rstrip('\t'), 1)
p.write_text(t)
PY
"$py" -I - "$bin/LD41.js" <<'PY'
import sys, re, pathlib
p = pathlib.Path(sys.argv[1]); t = p.read_text()
t, n = re.subn(r'(this\.image = new haxe_ds_StringMap\(\);\n\tthis\.version = )\d+;', r'\g<1>1;', t)
assert n == 1, n
p.write_text(t)
PY
rmdir "$bin/lib" 2>/dev/null || true
cp -R "$bin/." "$out/web/"
TZ=UTC find "$out/web" -exec touch -t 202001010000 {} +
( cd "$out" && find web -type f | LC_ALL=C sort > "$out/web-files.txt" )
( cd "$out" && COPYFILE_DISABLE=1 tar --format=ustar --uid 0 --gid 0 --uname root --gname root -n \
-cf - -T "$out/web-files.txt" ) | gzip -n -9 > "$out/web.tar.gz"
# Licencas do que a compilacao embute no jogo (Haxe std, Lime, OpenFL, HaxeFlixel e as bibliotecas JS do Lime).
{
echo "Outlaw Mayor Panic! - third-party licences of the code compiled into the game (LD41.js)"
echo "=========================================================================================================="
echo
echo "Built with Haxe $HAXE, Lime 8.1.2, OpenFL 9.3.3, HaxeFlixel 5.8.0, flixel-addons 3.2.3 and zerolib 0.2.3"
echo "(see src/build-outlaw-mayor-panic.sh). Every library below is under the MIT licence; texts follow."
echo
echo "--- Haxe standard library ---"
sed -n '/^Copyright (C)2005/,/^DEALINGS IN THE SOFTWARE\./p' "$tools/haxe-$HAXE/LICENSE.txt"
for l in lime:8,1,2 openfl:9,3,3 flixel:5,8,0 flixel-addons:3,2,3; do
echo; echo "--- ${l%%:*} ${l##*:} (LICENSE.md) ---"
cat "$libs/${l%%:*}/${l##*:}/LICENSE.md"
done
echo; echo "--- zerolib 0.2.3 (LICENSE) ---"
cat "$out/haxelib/zerolib/0,2,3/LICENSE"
echo; echo "--- Lime NOTICE.md (the JavaScript libraries below are bundled in the HTML5 output) ---"
sed -n '/howler.js 2.1.1/,/stats.js r16/p' "$libs/lime/8,1,2/NOTICE.md"
echo "(the output carries howler.js v2.2.4: Copyright (c) 2013-2020 James Simpson and GoldFire Studios, Inc., MIT;"
echo " FileSaver.js: Copyright (c) 2016 Eli Grey, MIT; pako 1.0.2: Copyright (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin,"
echo " MIT, with zlib parts Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler, zlib licence. The MIT licence"
echo " text is the one above; the notices travel inside LD41.js.)"
} > "$out/third-party-licenses.txt"
cp "$cache/Jersey20-OFL-${FONTS_COMMIT:0:7}.txt" "$out/Jersey20-OFL.txt"
ls -l "$out/web" "$out"/web.tar.gz