#!/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