#!/usr/bin/env bash # Compila o 4DTris do fredygames.com: o Tetris em quatro dimensoes de Laszlo Simon (codigo GPL-3.0; sem # arte nem audio, so icones) em WebAssembly, com o Emscripten 6.0.10 (o SDL 1.2, o FreeType 2.14.3 e a # emulacao de OpenGL 1.x dele). 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-4dtris.sh # # Fonte: o commit 258b0a1 do repositorio github.com/simzer/4dtris (2025), conferido pelo SHA-256 e guardado # em artifacts/cache/4dtris/. A fonte dos textos e a Liberation Sans Bold Italic 2.1.5 (SIL Open Font # License 1.1, o tarball liberation-fonts-ttf-2.1.5.tar.gz do GitHub da Liberation Fonts), a mesma que o # jogo procura no sistema; vai no 4dtris.data com o LICENSE e o AUTHORS dela, sem mudancas. Na pasta de # fontes do site, o script acha os tarballs e o patch ao lado dele. # # 4dtris-fredygames.patch (so ativo com __EMSCRIPTEN__): # - src/4dt_web.h (arquivo novo, incluido em todos os arquivos com -include): o que falta na emulacao # de OpenGL do Emscripten (vertices de glBegin/glEnd com cor, textura e normal completas, as formas # double das chamadas, gluSphere e gluCylinder, formato interno das texturas); # - 4dt_gtxt.c: os textos sao desenhados com o FreeType a partir da fonte acima, no lugar do SDL_ttf e do # fontconfig; # - 4dt_main.c: o laco do jogo vira uma funcao que o navegador chama a cada quadro; os timers do jogo (queda da # peca, animacoes, jogador automatico) passam a ser tocados por esse laco, porque o SDL_AddTimer do SDL 1.2 do # Emscripten dispara uma vez so e ignora o intervalo que o callback devolve; o + e o - do teclado numerico # tambem giram a peca (o jogo so lia PgUp e PgDn). # Pontuacoes ficam em $HOME/.4dtris-scores, que a pagina monta no IndexedDB. # # Saida: artifacts/build/4dtris-258b0a1/4dtris.{js,wasm,data}, que o bundle.yaml do jogo confere pelo SHA-256. set -euo pipefail COMMIT=258b0a1dfdcc8bd509dc2b9c0d53ad636d3e3383 SRC_SHA256=dc6fec568b58a510e33375fac216218e25a018cd8b22e8d06facb6b9b69a8d50 FONTS=2.1.5 FONTS_SHA256=7191c669bf38899f73a2094ed00f7b800553364f90e2637010a69c0e268f25d0 EMSCRIPTEN=6.0.10 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="${FDT_OUT:-$root/artifacts/build/4dtris-${COMMIT:0:7}}" cache="$root/artifacts/cache/4dtris" tarball="4dtris-${COMMIT:0:7}.tar.gz" fonts_tarball="liberation-fonts-ttf-$FONTS.tar.gz" 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 aux() { if [ -f "$here/4dtris/$1" ]; then echo "$here/4dtris/$1"; else echo "$here/$1"; fi } 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" } game_tar="$(fetch "$tarball" "https://github.com/simzer/4dtris/archive/$COMMIT.tar.gz" "$SRC_SHA256")" fonts_tar="$(fetch "$fonts_tarball" \ "https://github.com/liberationfonts/liberation-fonts/files/7261482/$fonts_tarball" "$FONTS_SHA256")" rm -rf "$out" mkdir -p "$out/work/obj" "$out/pkg/fonts" tar xzf "$game_tar" -C "$out/work" G="$out/work/4dtris-$COMMIT" patch -d "$G" -p1 --no-backup-if-mismatch < "$(aux 4dtris-fredygames.patch)" >&2 tar xzf "$fonts_tar" -C "$out/work" F="$out/work/liberation-fonts-ttf-$FONTS" cp "$F/LiberationSans-BoldItalic.ttf" "$F/LICENSE" "$F/AUTHORS" "$out/pkg/fonts/" objs=() jobs=0 for f in 4dt_ai 4dt_eng 4dt_main 4dt_menu 4dt_scn 4dt_m3d 4dt_m4d 4dt_g3d 4dt_gtxt 4dt_g4d 4dt_hst 4dt_ui; do o="$out/work/obj/$f.o" objs+=("$o") emcc -O2 -fcommon -w -Wno-implicit-function-declaration -Wno-int-conversion -Wno-incompatible-function-pointer-types -sUSE_FREETYPE=1 \ -ffile-prefix-map="$out/work/=" -include "$G/src/4dt_web.h" -c "$G/src/$f.c" -o "$o" & jobs=$((jobs + 1)) if [ "$jobs" -ge 8 ]; then wait; jobs=0; fi done wait for o in "${objs[@]}"; do [ -f "$o" ] || { echo "Falhou: $o" >&2; exit 1; }; done ( cd "$out/pkg" emcc -O2 "${objs[@]}" -sUSE_FREETYPE=1 -sLEGACY_GL_EMULATION=1 -lGL -lidbfs.js -sALLOW_MEMORY_GROWTH=1 \ -sENVIRONMENT=web -sEXIT_RUNTIME=0 -sEXPORTED_RUNTIME_METHODS=FS,ENV,addRunDependency,removeRunDependency \ --preload-file fonts@/fonts -o 4dtris.js mv 4dtris.js 4dtris.wasm 4dtris.data .. ) rm -rf "$out/pkg" "$out/work" shasum -a 256 "$out/4dtris.js" "$out/4dtris.wasm" "$out/4dtris.data"