#!/usr/bin/env bash # Compila o Li-Ri do fredygames.com: o jogo do trenzinho de madeira de Dominique Roux-Serret (Ri-li, 2006), # portado para SDL2 por Johnny Jazeix (codigo, graficos e sons sob a GPL-2.0-or-later ou GPL-3.0; musica # de Maf464 sob a GPL-3.0, COPYING.Music), em WebAssembly, com o Emscripten 6.0.10 e as portas SDL2 # 2.32.10 e SDL2_mixer 2.8.0 (com a libmodplug 11022021, que toca os modulos MOD e XM da musica) dele, e o # SimpleIni v4.22 (MIT, so o cabecalho). Este script e o patch 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-li-ri.sh # # Fonte: o tarball da tag v3.1.6 do GitHub (petitlapin/Li-Ri, a ultima versao publicada, antes das musicas # novas de 2026, que entraram sem licenca propria) e o do SimpleIni no commit que o CMakeLists.txt do jogo # baixa, conferidos pelo SHA-256 e guardados em artifacts/cache/li-ri/ (o site hospeda os mesmos # arquivos). Na pasta de fontes do site, o script acha os tarballs e o patch ao lado dele. # # li-ri-fredygames.patch (so ativo com __EMSCRIPTEN__): # - o laco de quadros devolve a vez ao navegador tambem quando o quadro atrasou (o build usa Asyncify); # - a janela e um canvas fixo de 800x600, sem tela cheia (a pagina escala a imagem e tem o proprio # botao); # - fredygames_save(), que a pagina chama quando a aba some ou fecha: o jogo so grava o li-ri.ini # (opcoes, fases liberadas e recordes) ao sair; # - os idiomas alem do ingles sao baixados quando escolhidos (lang/.gz, ao lado da pagina). # config.h: o que o CMake geraria (versao e pasta de dados "/"). SI_NO_CONVERSION, como o CMake faz no # Linux: o SimpleIni nao usa o ConvertUTF. # sprites.dat, language.dat, levels.dat, language.En e Sounds/ vao num li-ri.data que o proprio # Emscripten carrega (--preload-file), na raiz, que e a pasta de trabalho do jogo. Os outros 18 idiomas # saem em lang/, um arquivo por idioma. O gamecontrollerdb.txt (mapeamentos de controle de terceiros) fica # de fora: no navegador o SDL ja usa o mapeamento padrao dos controles. As preferencias ficam em # /libsdl/Li-Ri/Li-Ri (SDL_GetPrefPath), que a pagina guarda no IndexedDB. # # Saida: artifacts/build/li-ri-3.1.6/li-ri.{js,wasm,data} e lang/language.*, que o bundle.yaml do jogo # confere pelo SHA-256. set -euo pipefail VERSION=3.1.6 SRC_SHA256=2f6da13e31016156922aa8c71f1bd15fe2c26c370622a8807ebc7faef5f6ab7c SIMPLEINI=09c21bda1dc1b578fa55f4a005d79b0afd481296 SIMPLEINI_SHA256=f53b816e6c534942e63dce33b8c060c64d72d3877343b5d1fbf5c5a9571bb432 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/li-ri-$VERSION" cache="$root/artifacts/cache/li-ri" 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 li-ri/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/li-ri/$1" ]; then echo "$here/li-ri/$1"; else echo "$here/$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" } src_tar="$(fetch "li-ri-$VERSION.tar.gz" \ "https://github.com/petitlapin/Li-Ri/archive/refs/tags/v$VERSION.tar.gz" "$SRC_SHA256")" ini_tar="$(fetch "simpleini-${SIMPLEINI:0:8}.tar.gz" \ "https://github.com/brofield/simpleini/archive/$SIMPLEINI.tar.gz" "$SIMPLEINI_SHA256")" rm -rf "$out" mkdir -p "$out" tar xzf "$src_tar" -C "$out" tar xzf "$ini_tar" -C "$out" s="Li-Ri-$VERSION" ini="simpleini-$SIMPLEINI" patch -d "$out/$s" -p1 --no-backup-if-mismatch < "$(aux li-ri-fredygames.patch)" cat > "$out/$s/src/config.h" <