#!/usr/bin/env bash # Compila o Primrose do fredygames.com: o jogo de pecas contra uma IA de Jason Rohrer (2009, dominio # publico) em WebAssembly, com o Emscripten 6.0.10. Este script, o patch e os arquivos de # Builds/minorgems-web/ 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-primrose.sh # # Fonte: o tarball upstream do Debian (primrose_6+dfsg1.orig.tar.gz: o codigo da versao 6 do autor, com # a biblioteca minorGems dele), conferido pelo SHA-256. # # primrose/primrose-web.patch: # - o laco principal (gameSDL.cpp) vira uma funcao que o navegador chama (emscripten_set_main_loop), # a 25 quadros por segundo como o original; Q e Esc nao saem mais do jogo; # - sai tudo que usa a rede: o placar online ("high scores"), a edicao do nome do placar ("edit name") e o # envio da pontuacao (botao "done"). Os arquivos de rede (WebRequest, HighScore*, EditNamePanel, # BringNetworkUpThread, networkInterfaceGeneric) e os soquetes do minorGems nem sao compilados. # O que o Emscripten nao tem fica em Builds/minorgems-web/ (glBegin/glEnd, sleep, ver glut-compat.h). # O jogo grava o estado da partida e as opcoes em settings/ (pagina: IndexedDB). # # Saida: artifacts/build/primrose-6/primrose.{js,wasm,data}, que o bundle.yaml confere pelo SHA-256. set -euo pipefail SRC_SHA256=a2b3f9069f2b74af677dc8a14dabea0135d0275fbd5bce37ea03118cddb70205 here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ -f "$here/minorgems-web/common.sh" ]; then source "$here/minorgems-web/common.sh"; else source "$here/common.sh"; fi mgw_init primrose tarball="$(mgw_fetch "https://deb.debian.org/debian/pool/main/p/primrose/primrose_6+dfsg1.orig.tar.gz" \ primrose_6+dfsg1.orig.tar.gz "$SRC_SHA256")" if [ -f "$mgw_here/primrose/primrose-web.patch" ]; then patchfile="$mgw_here/primrose/primrose-web.patch"; else patchfile="$mgw_here/primrose-web.patch"; fi out="$mgw_root/artifacts/build/primrose-6" rm -rf "$out" mkdir -p "$out/src" "$out/data" tar xzf "$tarball" -C "$out/src" --strip-components 1 patch -d "$out/src" -p1 --quiet --no-backup-if-mismatch < "$patchfile" mgw_install_portaudio "$out/src" game="src/tilePlacementGames/game1/gameSource" cp -R "$out/$game/graphics" "$out/data/graphics" cd "$out" mgw_flags 1 mg="src/minorGems" sources=( $game/gameSDL.cpp $game/game.cpp $game/common.cpp $game/spriteBank.cpp $game/GridSpace.cpp $game/NextPieceDisplay.cpp $game/numeral.cpp $game/ColorPool.cpp $game/Button.cpp $game/Panel.cpp $game/MenuPanel.cpp $game/TutorialPanel.cpp $game/TutorialPanelB.cpp $game/TutorialPanelC.cpp $game/ScoreBundle.cpp $game/sound.cpp $mg/graphics/openGL/SingleTextureGL.cpp $mg/io/linux/TypeIOLinux.cpp $mg/util/stringUtils.cpp $mg/util/StringBufferOutputStream.cpp $mg/io/file/linux/PathLinux.cpp $mg/system/unix/TimeUnix.cpp $mg/system/linux/ThreadLinux.cpp $mg/system/FinishedSignalThread.cpp $mg/system/linux/MutexLockLinux.cpp $mg/util/TranslationManager.cpp $mg/util/SettingsManager.cpp $mg/crypto/hashes/sha1.cpp $mg/formats/encodingUtils.cpp ) mgw_compile_all "${sources[@]}" "$mgw_compat/glut-compat.c" em++ "${MGW_LINKFLAGS[@]}" "${MGW_OBJS[@]}" --preload-file data@/ -o primrose.js rm -rf obj shasum -a 256 primrose.js primrose.wasm primrose.data