#!/usr/bin/env bash # Compila What the Road Brings do fredygames.com: o jogo de corrida pseudo-3D de Lukas Holzbeierlein # (Captain4LK, codigo CC0 1.0; ULK_fixed em BSD-3-Clause ou Unlicense) em WebAssembly, com raylib 5.5 (zlib) e o Emscripten 6.0.10. # # source /emsdk_env.sh # emsdk install 6.0.10 && emsdk activate 6.0.10 # src/FredGames.Bundler/Builds/build-what-the-road-brings.sh # # Fontes: # - o codigo: codeberg.org/Captain4LK/what_the_road_brings no commit fixo abaixo (clonado com git), o "Most likely # final jam version" de 2021-04-10: o pacote do itch.io (de 2021-04-10 tambem) e dessa epoca, o codigo mais novo # do repositorio espera uma pista (.lil) que o pacote nao traz e desenha tudo preto com ela; # - os dados (imagens, sons, musicas, a pista): o repositorio nao os traz, vem a pasta data/ do pacote que o autor # publica no itch.io ("What the road brings - Windows", o mesmo que o README dele manda baixar), conferida pelo # SHA-256; so a pasta data/ entra na build, o .exe e a DLL ficam de fora; # - raylib 5.5 (github.com/raysan5/raylib, tarball da tag, zlib). # O jogo e de 2021 e usa raylib 3.7; o raylib 3.7 compila para a web, mas o audio dele (miniaudio antigo) nao roda # no Emscripten atual. Por isso o raylib 5.5, com um patch no jogo (Builds/what-the-road-brings/ # what-the-road-brings-fredygames.patch): # - IsMusicPlaying virou IsMusicStreamPlaying (nome novo no raylib); # - o "Quit" do titulo chamava CloseWindow(), que na web mata a pagina: agora recarrega a pagina (volta ao titulo); # - sem a tecla M (tela cheia por SetWindowSize/monitor; a pagina tem o botao dela) e sem a janela redimensionavel # (o raylib web a esticaria para o tamanho do navegador: a pagina escala o canvas 4:3 por CSS). # # Saida: artifacts/build/what-the-road-brings-/{wtrb.js,wtrb.wasm,wtrb.data,licenses.txt}, que o # bundle.yaml confere pelo SHA-256 (dois builds seguidos dao os mesmos bytes). set -euo pipefail COMMIT=1f80b288165a9cafa31b824dfaa68b6dfa2cd956 RAYLIB=5.5 RAYLIB_SHA256=aea98ecf5bc5c5e0b789a76de0083a21a70457050ea4cc2aec7566935f5e258e DATA_PAGE=https://captain4lk.itch.io/what-the-road-brings DATA_NAME="What the road brings - Windows" DATA_SHA256=b092f537efcceb6c0a0165318c6f5bac67bdaf681937c5d959e4384d482d1ecb 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/what-the-road-brings-${COMMIT:0:7}" cache="$root/artifacts/build/cache" 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 mkdir -p "$cache" if [ ! -f "$cache/raylib-$RAYLIB.tar.gz" ]; then curl -fsSL --retry 4 "https://github.com/raysan5/raylib/archive/refs/tags/$RAYLIB.tar.gz" -o "$cache/raylib-$RAYLIB.tar.gz.partial" mv "$cache/raylib-$RAYLIB.tar.gz.partial" "$cache/raylib-$RAYLIB.tar.gz" fi echo "$RAYLIB_SHA256 $cache/raylib-$RAYLIB.tar.gz" | shasum -a 256 -c - "$here/itch-fetch.sh" "$DATA_PAGE" "$DATA_NAME" "$cache/what-the-road-brings-windows.zip" "$DATA_SHA256" rm -rf "$out" mkdir -p "$out/raylib" "$out/obj" "$out/pack" git clone -q https://codeberg.org/Captain4LK/what_the_road_brings.git "$out/source" git -C "$out/source" -c advice.detachedHead=false checkout -q "$COMMIT" [ "$(git -C "$out/source" rev-parse HEAD)" = "$COMMIT" ] patch -d "$out/source" -p1 --no-backup-if-mismatch < "$here/what-the-road-brings/what-the-road-brings-fredygames.patch" tar -xzf "$cache/raylib-$RAYLIB.tar.gz" -C "$out/raylib" --strip-components 1 unzip -q "$cache/what-the-road-brings-windows.zip" 'data/*' -d "$out/pack" R="$out/raylib/src" for f in rcore rshapes rtextures rtext rmodels raudio utils; do emcc -c -O3 -std=gnu99 -D_GNU_SOURCE -DGL_SILENCE_DEPRECATION=199309L -DPLATFORM_WEB -DGRAPHICS_API_OPENGL_ES2 \ -I"$R" -I"$R/external/glfw/include" "$R/$f.c" -o "$out/obj/$f.o" done for f in main audio car ULK_fixed draw input menu mode player segment track lil; do emcc -c -O3 -std=c99 -D_DEFAULT_SOURCE -DPLATFORM_WEB -I"$R" -Wno-missing-braces \ "$out/source/src/$f.c" -o "$out/obj/g_$f.o" done # O raylib 5.5 so usa o miniaudio com ScriptProcessor, que le Module.HEAPF32 e Module._malloc. ( cd "$out/pack" emcc -O3 "$out/obj/"*.o -lm -sUSE_GLFW=3 -sINITIAL_MEMORY=67108864 -sALLOW_MEMORY_GROWTH=1 -sFORCE_FILESYSTEM=1 \ -sENVIRONMENT=web -sEXPORTED_FUNCTIONS=_main,_malloc,_free -sEXPORTED_RUNTIME_METHODS=ccall,HEAPF32 \ --preload-file data@/data -o "$out/wtrb.html" ) rm -f "$out/wtrb.html" { echo "== raylib $RAYLIB (LICENSE, zlib)" cat "$out/raylib/LICENSE" echo echo "== lil (src/lil.h, zlib)" sed -n '1,20p' "$out/source/src/lil.h" echo echo "== Emscripten (LICENSE, MIT / UIUC)" cat "$(dirname "$(command -v emcc)")/LICENSE" } > "$out/licenses.txt" shasum -a 256 "$out/wtrb.js" "$out/wtrb.wasm" "$out/wtrb.data" "$out/licenses.txt"