#!/usr/bin/env bash # Compila o Kobo Deluxe do fredygames.com: o shooter de David Olofson baseado no XKobo de Akira Higuchi # (codigo GPL-2.0-or-later, o motor de som e de graficos LGPL-2.1-or-later; graficos e sons do David # Olofson sob a GPL v2, conforme ele declarou na lista olofsonprojects em junho de 2008) em # WebAssembly, com o Emscripten 6.0.10 e as portas SDL2 2.32.10 e SDL2_image 2.6.0 (libpng 1.6.58, # zlib 1.3.2) dele. Este script, o patch e o sdl12shim 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-kobodeluxe.sh # # Fonte: o tarball do commit 943aa38 do olofson/kobodeluxe no GitHub (o repositorio do autor, de 2020, # sem tags; versao 0.6.0 em desenvolvimento, com as correcoes posteriores a 0.5.1), conferido pelo # SHA-256 e guardado em artifacts/cache/kobodeluxe/ (o site hospeda o mesmo arquivo). Na pasta de # fontes do site, o script acha o tarball, o patch e o shim ao lado dele. # # O jogo usa a SDL 1.2. O Emscripten nao tem a SDL 1.2 de verdade, entao sdl12shim.{h,c} (nosso, # GPL-2.0-or-later) implementa sobre a SDL2 so as chamadas da SDL 1.2 que o jogo faz (modo de video, # flags de colorkey e alpha, DisplayFormat, teclado). O shim entra antes de cada arquivo (-include). # # kobodeluxe-fredygames.patch (so ativo com __EMSCRIPTEN__): # - sprite.c e filters.c: le alpha e colorkey pelas funcoes da SDL2 (a SDL 1.2 os guardava no # SDL_PixelFormat) e converte para RGBA com SDL_ConvertSurfaceFormat; # - kobo.cpp: caractere digitado (nomes) pelo shim, foco e exposicao da janela pelos eventos da # SDL2, sem capturas de tela (o S e o Print Screen gravariam BMPs na memoria), perfis e recordes # numa pasta propria (KOBO_SCOREDIR: o jogo le todo arquivo da pasta de recordes como perfil, e o # arquivo de opcoes, na mesma pasta, virava um recorde com lixo) e fredygames_save(), que a pagina # chama quando a aba some ou fecha (o jogo so grava as opcoes ao sair). # # O laco do jogo e dele mesmo: o build usa Asyncify, e cada quadro mostrado devolve a vez ao navegador # (emscripten_sleep(0) no shim). gfx/ e sfx/ vao num kobodeluxe.data (--preload-file) em /data. # # Saida: artifacts/build/kobodeluxe-943aa38/kobodeluxe.{js,wasm,data}, que o bundle.yaml do jogo # confere pelo SHA-256. set -euo pipefail COMMIT=943aa38f941e4f463863d56c8aac6f23a2ef663b SHORT=943aa38 SRC_SHA256=33c9b989bf0146ed9b7d4785846f1ab9ad1f2f6b75083bba59dcf511d0b9ccc4 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/kobodeluxe-$SHORT" cache="$root/artifacts/cache/kobodeluxe" tarball="kobodeluxe-$SHORT.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 # Arquivo auxiliar: em kobodeluxe/ (repositorio) ou ao lado do script (pasta de fontes do site). aux() { if [ -f "$here/kobodeluxe/$1" ]; then echo "$here/kobodeluxe/$1"; else echo "$here/$1"; fi } if [ -f "$here/$tarball" ]; then src_tar="$here/$tarball" else src_tar="$cache/$tarball" if [ ! -f "$src_tar" ]; then mkdir -p "$cache" curl -fsSL -o "$src_tar.part" "https://github.com/olofson/kobodeluxe/archive/$COMMIT.tar.gz" mv "$src_tar.part" "$src_tar" fi fi echo "$SRC_SHA256 $src_tar" | shasum -a 256 -c - >&2 rm -rf "$out" mkdir -p "$out" tar xzf "$src_tar" -C "$out" s="kobodeluxe-$COMMIT" patch -d "$out/$s" -p1 --no-backup-if-mismatch < "$(aux kobodeluxe-fredygames.patch)" cp "$(aux sdl12shim.h)" "$(aux sdl12shim.c)" "$out/$s/src/" # O que o CMake do projeto gera em buildconfig.h, com os caminhos do navegador. mkdir -p "$out/$s/include" cat > "$out/$s/include/buildconfig.h" <<'EOF' #define KOBO_HAVE_SNPRINTF #define KOBO_HAVE_VSNPRINTF #define KOBO_HAVE_STAT #define KOBO_HAVE_LSTAT #define RETSIGTYPE void #define PACKAGE "kobodeluxe-0.6.0" #define KOBO_VERSION_STRING "0.6.0" #define KOBO_MAKE_VERSION(major, minor, micro, build) (((major) << 24) | ((minor) << 16) | ((micro) << 8) | (build)) #define KOBO_MAJOR(ver) (((ver) >> 24) & 0xff) #define KOBO_MINOR(ver) (((ver) >> 16) & 0xff) #define KOBO_MICRO(ver) (((ver) >> 8) & 0xff) #define KOBO_BUILD(ver) ((ver) & 0xff) #define KOBO_VERSION KOBO_MAKE_VERSION(0, 6, 0, 0) #define KOBO_ORGANIZATION "OlofsonArcade" #define KOBO_APPLICATION "KoboDeluxe" #define KOBO_DATADIR "/data" #define KOBO_USERDIR "HOME>>.kobodeluxe" #define KOBO_SCOREDIR "HOME>>.kobodeluxe/scores" #define KOBO_CONFIGFILE "kobodeluxe.cfg" #define KOBO_SYSCONFDIR "/etc" EOF # Compila de dentro da pasta de saida, com caminhos relativos: o carregador do kobodeluxe.data guarda # o nome que o arquivo tem aqui. Os fontes sao os da lista do src/CMakeLists.txt, na mesma ordem. ( cd "$out" srcs="$(sed -n '/set(sources/,/^)/p' "$s/src/CMakeLists.txt" | grep -v -E 'set\(|^\)' | tr -d '\t' | sed "s#^#$s/src/#") $s/src/sdl12shim.c" emcc -O2 -ffile-prefix-map="$out/=" -w -include "$s/src/sdl12shim.h" \ -I"$s/include" -I"$s/src" -I"$s/src/graphics" -I"$s/src/eel" -I"$s/src/sound" -I"$s/data/sfx" \ $srcs -lc++ -lc++abi \ -sUSE_SDL=2 -sUSE_SDL_IMAGE=2 -sSDL2_IMAGE_FORMATS='["png"]' -lidbfs.js \ -sASYNCIFY -sASYNCIFY_STACK_SIZE=65536 -sSTACK_SIZE=1MB -sINITIAL_MEMORY=64MB -sALLOW_MEMORY_GROWTH \ -sENVIRONMENT=web -sEXIT_RUNTIME=1 \ -sEXPORTED_RUNTIME_METHODS=FS,addRunDependency,removeRunDependency \ --preload-file "$s/data/gfx@/data/gfx" --preload-file "$s/data/sfx@/data/sfx" \ -o kobodeluxe.js ) shasum -a 256 "$out/kobodeluxe.js" "$out/kobodeluxe.wasm" "$out/kobodeluxe.data"