#!/usr/bin/env bash # Compila o Blobby Volley 2 do fredygames.com (GPL-2.0; Jonathan Sieber, Daniel Knobe, Sven Rech e Erik # Schultheis na programacao, Silvio Mummert nos graficos) em WebAssembly, com o Emscripten 6.0.10, as # portas SDL2 2.32.10 dele e o PhysFS 3.2.0 (zlib) compilado aqui. Este script, o patch e o gerador de # sons (blobby-volley-2/) 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-blobby-volley-2.sh # # Fonte: o tarball do commit c28c5fa do github.com/danielknobe/blobbyvolley2, conferido pelo SHA-256 e # guardado em artifacts/cache/blobby-volley/. # # blobby-volley-2/blobby-fredygames.patch: # - sem o jogo em rede (menu "online game" e "lan game") nem o botao que abre o site do jogo; # - CURRENT_NETWORK_LAG, que era definido nos estados de rede, vira uma variavel local. # O RakNet entra so pelo BitStream (usado para gravar replays); servidor, lobby e HTTP ficam de fora. # Os tres sons do jogo (bums, pfiff e chat) nao tem autor nem licenca no repositorio: sao trocados por # sons gerados por blobby-volley-2/make-sounds.py (CC0). Os dados vao num blobby.data que o proprio # Emscripten carrega (--preload-file) em /data; as configuracoes e replays ficam em # /home/web_user/.local/share/blobby, que a pagina monta no IndexedDB. # # Saida: artifacts/build/blobby-volley-2-c28c5fa/blobby.{js,wasm,data}, que o bundle.yaml do jogo confere # pelo SHA-256. set -euo pipefail COMMIT=c28c5fa87872b7592f34f5f86196e93d127b6cf9 SRC_SHA256=6613016b6a83e4006647d17ab997b3ee8e61ce8f41d67ec93e95d92bf4ae98ed PHYSFS_SHA256=1991500eaeb8d5325e3a8361847ff3bf8e03ec89252b7915e1f25b3f8ab5d560 EMSCRIPTEN=6.0.10 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/blobby-volley-2-${COMMIT:0:7}" cache="$root/artifacts/cache/blobby-volley" 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 fetch() { # arquivo url sha256 if [ ! -f "$cache/$1" ]; then mkdir -p "$cache" curl -fsSL -o "$cache/$1.part" "$2" mv "$cache/$1.part" "$cache/$1" fi echo "$3 $cache/$1" | shasum -a 256 -c - >&2 } fetch blobby.tar.gz "https://github.com/danielknobe/blobbyvolley2/archive/$COMMIT.tar.gz" "$SRC_SHA256" fetch physfs-3.2.0.tar.gz "https://github.com/icculus/physfs/archive/refs/tags/release-3.2.0.tar.gz" "$PHYSFS_SHA256" rm -rf "$out" mkdir -p "$out/work/obj" tar xzf "$cache/blobby.tar.gz" -C "$out/work" tar xzf "$cache/physfs-3.2.0.tar.gz" -C "$out/work" G="$out/work/blobbyvolley2-$COMMIT" P="$out/work/physfs-release-3.2.0" patch -d "$G" -p1 --binary --no-backup-if-mismatch < "$here/blobby-volley-2/blobby-fredygames.patch" >&2 python3 -I "$here/blobby-volley-2/make-sounds.py" "$G/data/sounds" PORTS=(-sUSE_SDL=2 -sUSE_BOOST_HEADERS=1) COMMON=(-O2 -w -fexceptions -ffile-prefix-map="$out/work/=" "${PORTS[@]}") NOARCH=(-DPHYSFS_SUPPORTS_DEFAULT=0 -DPHYSFS_SUPPORTS_ZIP=1) objs=() jobs=0 add() { # compilador arquivo flags... local cc="$1" f="$2" rel o shift 2 rel="${f#"$out/work/"}" o="$out/work/obj/${rel//\//_}.o" objs+=("$o") "$cc" "${COMMON[@]}" "$@" -c "$f" -o "$o" & jobs=$((jobs + 1)) if [ "$jobs" -ge 8 ]; then wait; jobs=0; fi } for f in physfs physfs_byteorder physfs_unicode physfs_platform_posix physfs_platform_unix \ physfs_archiver_dir physfs_archiver_unpacked physfs_archiver_zip; do add emcc "$P/src/$f.c" "${NOARCH[@]}" done for f in "$G"/deps/lua/*.c; do case "$f" in */lua.c|*/luac.c|*/loslib.c) continue ;; esac add emcc "$f" done add em++ "$G/deps/tinyxml/tinyxml2.cpp" INC=(-I"$G/src" -I"$G/deps/lua" -I"$G/deps/tinyxml" -I"$P/src" -std=c++14) S="$G/src" for f in base64 BlobbyDebug Clock DuelMatch FileRead FileSystem FileWrite File GameLogic GenericIO Color \ NetworkMessage PhysicWorld SpeedController UserConfig PhysicState DuelMatchState GameLogicState \ InputSource PlayerInput IScriptableComponent PlayerIdentity Blood TextManager IMGUI \ InputManager LocalInputSource RenderManager RenderManagerSDL RenderManagerNull \ ScriptedInputSource SoundManager BlobbyApp main \ replays/ReplayRecorder replays/ReplaySavePoint replays/ReplayPlayer replays/ReplayLoader \ state/State state/GameState state/LocalGameState state/OptionsState state/ReplayState \ state/ReplaySelectionState \ input_device/JoystickInput input_device/JoystickPool input_device/KeyboardInput \ input_device/MouseInput input_device/TouchInput \ raknet/BitStream raknet/NetworkTypes; do add em++ "$S/$f.cpp" "${INC[@]}" done wait for o in "${objs[@]}"; do [ -f "$o" ] || { echo "Falhou: $o" >&2; exit 1; }; done # Liga de dentro da pasta de saida, com caminhos relativos: o carregador do blobby.data guarda o nome # que a pasta tem aqui. mkdir -p "$out/data" cp -R "$G/data/." "$out/data/" rm -rf "$out/data/CMakeLists.txt" "$out/data/Icon.jpg" ( cd "$out" em++ -O2 -fexceptions ${LINK_EXTRA:-} "${objs[@]}" "${PORTS[@]}" -lidbfs.js -sASYNCIFY -sALLOW_MEMORY_GROWTH=1 \ -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ -sEXPORTED_RUNTIME_METHODS=FS,ENV,addRunDependency,removeRunDependency \ --preload-file data@/data \ -o blobby.js ) rm -rf "$out/data" "$out/work" shasum -a 256 "$out/blobby.js" "$out/blobby.wasm" "$out/blobby.data"