#!/usr/bin/env bash # Monta o BrowserQuest de um jogador so (codigo MPL-2.0, conteudo CC BY-SA 3.0; Little Workshop / Mozilla) a partir do commit # af32d24 de github.com/mozilla/BrowserQuest. O jogo original e um MMO: um servidor Node.js fala por WebSocket com os # navegadores. Aqui o servidor (server/js) roda num Web Worker da propria pagina, com o transporte trocado por postMessage # (browserquest/server-head.js e server-tail.js embrulham os modulos CommonJS), e ha um unico jogador. # # Mudancas (browserquest/browserquest-fredygames.patch, mais os passos abaixo): # - o jogo roda numa janela de 1100x800 (index.html e a moldura, game.html o jogo): o layout do BrowserQuest depende da largura; # - GameClient usa um LocalSocket (Web Worker) no lugar do WebSocket; sem chat, sem contagem de jogadores, sem timeout; # - sem Mozilla/Firefox: armadura firefox, firefox.mp3, pocao de fogo, falas com links, aba "mozilla" e icones sociais; # - sem os personagens de terceiros (Rick, Nyan, Octocat, Agent) nem as conquistas ligadas a eles; # - fontes GraphicPixel/AdvoCut (sem licenca no repositorio) trocadas pela VT323 (OFL-1.1, google/fonts); # - sem links externos, sem compartilhamento, sem musicas (o repositorio nao as traz), localStorage com prefixo proprio. # # src/FredGames.Bundler/Builds/build-browserquest.sh # # Saida: artifacts/build/browserquest-af32d24/browserquest-af32d24-dist.tar.gz (dist/); tem que sair igual em dois builds. set -euo pipefail COMMIT=af32d247cac3495ca430d0effbb88dd5f3250b2c SHA256=0242bb9766ebb7e5d99e653d255c8c892bef5b76c3f3107444a5ddd84036abc5 GF=2fe1e8c6b137fb13041a7cfca6fdcd8a910ea4dc FONT_SHA256=cf4de751ada78ceac033dbe16a687742939995b77bc2a052ae17a4957958594d here="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" root="$(git -C "$here" rev-parse --show-toplevel 2>/dev/null || pwd)" out="$root/artifacts/build/browserquest-${COMMIT:0:7}" cache="$root/artifacts/build/cache" tgz="$cache/browserquest-${COMMIT:0:7}.tar.gz" py="$root/artifacts/tools/venv/bin/python" bq="$here/browserquest" mkdir -p "$cache" fetch() { # url arquivo sha256 [ -f "$2" ] || { curl -fsSL --retry 4 "$1" -o "$2.partial" && mv "$2.partial" "$2"; } echo "$3 $2" | shasum -a 256 -c - >/dev/null } fetch "https://github.com/mozilla/BrowserQuest/archive/$COMMIT.tar.gz" "$tgz" "$SHA256" fetch "https://raw.githubusercontent.com/google/fonts/$GF/ofl/vt323/VT323-Regular.ttf" "$cache/VT323-Regular-${GF:0:7}.ttf" "$FONT_SHA256" rm -rf "$out" mkdir -p "$out/tree" tar -xzf "$tgz" -C "$out/tree" --strip-components 1 cd "$out/tree" patch -s -p1 < "$bq/browserquest-fredygames.patch" dist="$out/dist" mkdir "$dist" cp -R client/. "$dist/" cp shared/js/gametypes.js "$dist/js/gametypes.js" # o jogo vira game.html; index.html e uma moldura que o mostra numa janela de 1100x800 reduzida para caber mv "$dist/index.html" "$dist/game.html" cp "$bq/wrapper.html" "$dist/index.html" # --- servidor: modulos do Node embrulhados num unico Web Worker --- { cat "$bq/server-head.js" for f in lib/class area character checkpoint chest chestarea entity format formulas item map message mob mobarea npc player properties utils worldserver; do echo "__defs['${f##*/}'] = function (module, exports, require) {" cat "server/js/$f.js" echo echo "};" done echo "__defs['gametypes'] = function (module, exports, require) {" cat shared/js/gametypes.js echo echo "};" cat "$bq/server-tail.js" } > "$dist/js/bqserver.js" mkdir -p "$dist/maps" python3 -I "$bq/filter-map.py" server/maps/world_server.json "$dist/maps/world_server.json" # --- fontes --- cd "$dist" rm -f fonts/* cp "$cache/VT323-Regular-${GF:0:7}.ttf" fonts/VT323-Regular.ttf cp "$bq/fredygames-storage.js" js/fredygames-storage.js # --- o que o port nao usa --- for n in rick nyan octocat agent firefox item-firepotion; do rm -f "sprites/$n.json" "img/1/$n.png" "img/2/$n.png" "img/3/$n.png" done rm -f audio/sounds/firefox.mp3 audio/sounds/firefox.ogg rm -f img/common/promo-title.jpg img/common/screenshot.jpg rm -f config/*-dist README.md css/ie.css js/lib/css3-mediaqueries.js js/build.js "$py" -I "$bq/blank-sprites.py" "$dist" # nada de requisicao externa nem de marca no que aparece na tela (nomes de classe CSS e constantes mortas nao contam) bad=$( { grep -rniE "https?://" index.html game.html css sprites maps; grep -rniE "mozilla|rick astley|never gonna|octocat|github" index.html game.html css js/*.js --exclude=bqserver.js --exclude=gametypes.js; grep -niE "twitter|facebook" index.html game.html; } 2>/dev/null | grep -vE "http-equiv|^js/(util|text)\.js:" || true) if [ -n "$bad" ]; then echo "Sobrou referencia externa ou de marca:" >&2; echo "$bad" >&2; exit 1 fi find "$dist" -name .DS_Store -delete find "$dist" -exec touch -t 202611090000 {} + ( cd "$out" && find dist -type f | LC_ALL=C sort > list.txt \ && COPYFILE_DISABLE=1 tar --format=ustar --uid 0 --gid 0 --uname root --gname root -n -cf - -T list.txt \ | gzip -n -9 > "browserquest-${COMMIT:0:7}-dist.tar.gz" && rm list.txt ) rm -rf "$out/tree" ls -l "$out/browserquest-${COMMIT:0:7}-dist.tar.gz" shasum -a 256 "$out/browserquest-${COMMIT:0:7}-dist.tar.gz"