#!/usr/bin/env bash # Compila o Fish Fillets - Next Generation 1.0.1 do fredygames.com: o jogo de peixes e quebra-cabecas que a # ALTAR interactive publicou em 1998 e abriu sob a GPL em 2004 (codigo e dados), mantido pelo projeto Fish # Fillets NG (Ivo Danihelka, Pavel Danihelka, Mirek Olsak e outros), em WebAssembly, com o Emscripten 6.0.10 # e as portas SDL2 2.32.10, SDL2_image, SDL2_ttf e SDL2_mixer (libvorbis, libogg) dele, mais o Lua 5.0.3 # (MIT). Este script e os arquivos de Builds/fish-fillets/ fazem parte do codigo-fonte publicado junto. # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # src/FredGames.Bundler/Builds/build-fish-fillets.sh # # Fonte: os tarballs do commit 4e47409 de Fish-Fillets-NG (o motor, de 2011) e do 7daaf56 de fillets-data # (os dados, de 2012) no GitHub, e o do Lua 5.0.3 do lua.org, conferidos pelo SHA-256 e guardados em # artifacts/cache/fish-fillets/. Na pasta de fontes do site, o script acha os tarballs e os arquivos # auxiliares ao lado dele. # # O motor foi escrito para SDL 1.2. compat/SDL.h e compat/sdl12shim.cpp (GPL-2.0-or-later) oferecem por # cima do SDL2 as poucas chamadas do SDL 1.2 que o jogo usa (modo de video, Flip, DisplayFormat, chave de # cor, alfa da superficie, teclas e eventos); fillets-ng-fredygames.patch ajusta o que nao cabia ai. # # Dados (fillets-data-fredygames.patch + o que este script tira): # - ficam de fora os fontes de edicao (.xcf, .svg), o filme da introducao (.mpg; a build nao tem smpeg, # e o jogo ja mostra "intro under construction" sem ele) e as vozes em tcheco e holandes (cs/ e nl/, # 90 MB; as legendas e os textos em todos os idiomas ficam, os efeitos sonoros en/ tambem); # - ficam de fora os seis niveis do "Secret Computer" (tetris, emulator, warcraft, windoze, hardware, # floppy): sao parĂ³dias de marcas de terceiros (Tetris, Warcraft, Windows, ZX Spectrum...); o patch # tira os nos da lista de niveis, as descricoes e os recordes deles; # - a fala padrao passa a "en" (sem voz), porque so os efeitos en/ vao no pacote. # # Saida: artifacts/build/fish-fillets-1.0.1-4e47409/fillets.{js,wasm,data}, que o bundle.yaml do jogo # confere pelo SHA-256. set -euo pipefail NG_COMMIT=4e4740998d5c9fb7b8fbc993c87f0673019697b6 NG_SHA256=84d85d309698ee284feb77e7e4afec9e9cb665b4adebbfc210e3911edb4005dd DATA_COMMIT=7daaf56dc85500135588037c0bbbb0870b92ec6d DATA_SHA256=1713078459400bb78151597b098ba633303e48a95bf9f5ad968a1883b149f1db LUA_SHA256=1193a61b0e08acaa6eee0eecf29709179ee49c71baebc59b682a25c3b5a45671 EMSCRIPTEN=6.0.10 BRAND_LEVELS="tetris emulator warcraft windoze hardware floppy" here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/fish-fillets-1.0.1-${NG_COMMIT:0:7}" cache="$root/artifacts/cache/fish-fillets" 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 # Arquivo auxiliar: em fish-fillets/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/fish-fillets/$1" ]; then echo "$here/fish-fillets/$1"; else echo "$here/$(basename "$1")"; fi } # Tarball: ao lado do script (pasta de fontes do site) ou no cache, baixado se faltar. fetch() { local name="$1" url="$2" sha="$3" file if [ -f "$here/$name" ]; then file="$here/$name" else file="$cache/$name" if [ ! -f "$file" ]; then mkdir -p "$cache" curl -fsSL -o "$file.part" "$url" mv "$file.part" "$file" fi fi echo "$sha $file" | shasum -a 256 -c - >&2 echo "$file" } ng_tar="$(fetch "fillets-ng-${NG_COMMIT:0:7}.tar.gz" \ "https://github.com/FishFilletsNG/Fish-Fillets-NG/archive/$NG_COMMIT.tar.gz" "$NG_SHA256")" data_tar="$(fetch "fillets-data-${DATA_COMMIT:0:7}.tar.gz" \ "https://github.com/FishFilletsNG/fillets-data/archive/$DATA_COMMIT.tar.gz" "$DATA_SHA256")" lua_tar="$(fetch "lua-5.0.3.tar.gz" "https://www.lua.org/ftp/lua-5.0.3.tar.gz" "$LUA_SHA256")" rm -rf "$out" mkdir -p "$out/ng" "$out/data" "$out/lua" tar xzf "$ng_tar" -C "$out/ng" --strip-components=1 tar xzf "$data_tar" -C "$out/data" --strip-components=1 tar xzf "$lua_tar" -C "$out/lua" --strip-components=1 patch -d "$out/ng" -p1 --no-backup-if-mismatch < "$(aux fillets-ng-fredygames.patch)" # ---- Dados: o que vai no fillets.data, montado em /data ---- stage="$out/stage" mkdir -p "$stage" ( cd "$out/data" for d in images script music font; do find "$d" -type f ! -name '*.xcf' ! -name '*.svg' ! -name '*.mpg' | LC_ALL=C sort done find sound -type f | grep -v -E '/(cs|nl)/' | LC_ALL=C sort ) | (cd "$out/data" && while read -r f; do mkdir -p "$stage/$(dirname "$f")"; cp "$f" "$stage/$f"; done) for b in $BRAND_LEVELS; do rm -rf "$stage/images/$b" "$stage/script/$b" "$stage/sound/$b"; done patch -d "$stage" -p1 --no-backup-if-mismatch < "$(aux fillets-data-fredygames.patch)" # ---- Lua 5.0.3 ---- mkdir -p "$out/lobj" for f in $(cd "$out/lua" && ls src/*.c | grep -v -E 'ltests|luac' ) $(cd "$out/lua" && ls src/lib/*.c); do case "$f" in src/lua/*) continue;; esac emcc -O2 -w -ffile-prefix-map="$out/=" -I"$out/lua/include" -I"$out/lua/src" -c "$out/lua/$f" \ -o "$out/lobj/$(basename "$f" .c).o" done # ---- O jogo ---- cp "$(aux compat/SDL.h)" "$(aux compat/sdl12shim.cpp)" "$out/ng/src/" mkdir -p "$out/ng/compat" "$out/obj" mv "$out/ng/src/SDL.h" "$out/ng/src/sdl12shim.cpp" "$out/ng/compat/" define_flags() { inc=(-I"$out/ng/compat" -I"$out/lua/include") for d in gengine effect widget plan option state level menu SDL_gfx game; do inc+=(-I"$out/ng/src/$d"); done ports=(-sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS='["png"]' -sUSE_SDL_TTF=2 -sUSE_SDL_MIXER=2 -sSDL2_MIXER_FORMATS='["ogg"]') } cc_one() { local f="$1" o inc ports define_flags o="$out/obj/$(echo "${f#$out/ng/}" | tr / _).o" case "$f" in *.c) emcc -O2 -w -ffile-prefix-map="$out/=" "${inc[@]}" "${ports[@]}" -DSYSTEM_DATA_DIR='"/data"' -c "$f" -o "$o" ;; *) em++ -O2 -w -std=gnu++14 -ffile-prefix-map="$out/=" "${inc[@]}" "${ports[@]}" -DSYSTEM_DATA_DIR='"/data"' -c "$f" -o "$o" ;; esac } export -f cc_one define_flags export out { ls "$out"/ng/src/*/*.cpp | grep -v FsPath_boost; ls "$out"/ng/src/SDL_gfx/*.c; echo "$out/ng/compat/sdl12shim.cpp"; } \ | LC_ALL=C sort | xargs -P 8 -I{} bash -c 'cc_one {}' define_flags em++ -O2 $(LC_ALL=C ls "$out"/obj/*.o) $(LC_ALL=C ls "$out"/lobj/*.o) "${ports[@]}" -lidbfs.js \ -sASYNCIFY -sALLOW_MEMORY_GROWTH -sINITIAL_MEMORY=256MB -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ -sEXPORTED_FUNCTIONS=_main -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file "$stage@/data" -o "$out/fillets.js" rm -rf "$out/ng" "$out/data" "$out/lua" "$out/obj" "$out/lobj" "$stage" shasum -a 256 "$out/fillets.js" "$out/fillets.wasm" "$out/fillets.data" ls -l "$out/fillets.data"