#!/usr/bin/env python3 """Patches the HTML/JS of the dtsudo games for FredyGames (run with python3 -I). usage: patch.py Every replacement must match exactly the expected number of times, otherwise the build aborts. Changes, for all games: * a Content-Security-Policy in index.html that blocks every request outside the game's own folder; * the link that opens the author's GitHub page (window.open) does nothing; * browser saves (localStorage) get a prefix with the game's slug, because all games share the same origin. """ import os, sys slug, root = sys.argv[1], sys.argv[2] CSP = ("default-src 'none'; script-src 'self' 'unsafe-inline' 'unsafe-eval' 'wasm-unsafe-eval' blob:; " "style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; media-src 'self' data: blob:; " "font-src 'self' data:; connect-src 'self' data: blob:; worker-src 'self' blob:; base-uri 'self'; form-action 'none'") def edit(rel, old, new, count=1): p = os.path.join(root, rel) with open(p, encoding='utf-8', newline='') as f: t = f.read() n = t.count(old) if n != count: sys.exit(f"{slug}: {rel}: esperava {count} ocorrencia(s) de {old!r}, achei {n}") with open(p, 'w', encoding='utf-8', newline='') as f: f.write(t.replace(old, new)) # CSP no index.html (logo depois do ) p = os.path.join(root, 'index.html') t = open(p, encoding='utf-8', newline='').read() i = t.lower().index('', i) + 1 t = t[:j] + '\n\t' + t[j:] open(p, 'w', encoding='utf-8', newline='').write(t) P = slug + ':' if slug == 'tux-planet-speedrun': js = 'TuxPlanetSpeedrunAnyPercent.js' edit(js, "window.open(window.bridgeClickUrl, '_blank');", "void 0;") edit(js, "localStorage.setItem(fileName,", "localStorage.setItem('" + P + "' + fileName,") edit(js, "localStorage.getItem(fileName)", "localStorage.getItem('" + P + "' + fileName)", 2) edit(js, "IsHoverOverGitHubUrl: function (mouse, buildType, width, height) {", "IsHoverOverGitHubUrl: function (mouse, buildType, width, height) {\n return false;") # opcional: a piada do texto de instrucoes vira uma frase neutra edit(js, "Unfortunately, the devs are complete morons and the level design \\nis terrible. Good luck!", "Unfortunately, the level design in this game \\nis terrible. Good luck!") elif slug == 'tux-planet-2': js = 'TuxPlanet2.js' edit(js, 'window.open(clickUrl, "_blank");', 'void 0;') edit(js, "localStorage.setItem(namespace,", "localStorage.setItem(\"" + P + "\" + namespace,") edit(js, "localStorage.getItem(namespace)", "localStorage.getItem(\"" + P + "\" + namespace)") edit(js, "isHover = 50 <= mouseX", "isHover = false && 50 <= mouseX") elif slug in ('symbiosis-chess', 'queen-sac'): edit('GameInitializer.js', "browserWindow.localStorage.setItem(key,", "browserWindow.localStorage.setItem(\"" + P + "\" + key,") edit('GameInitializer.js', "browserWindow.localStorage.getItem(key)", "browserWindow.localStorage.getItem(\"" + P + "\" + key)") elif slug == 'chess-comp-stomp-with-hacks': js = 'ChessCompStompWithHacks.js' edit(js, "window.open(window.bridgeClickUrl, '_blank');", "void 0;") edit(js, "localStorage.setItem(fileName,", "localStorage.setItem('" + P + "' + fileName,") edit(js, "localStorage.getItem(fileName)", "localStorage.getItem('" + P + "' + fileName)", 2) edit(js, "IsHoverOverGitHubUrl: function (mouseInput, height) {", "IsHoverOverGitHubUrl: function (mouseInput, height) {\n return false;") # o repositorio nao traz os .flac que o jogo pede (so os .ogg): usa os .ogg, senao musica e sons ficam mudos edit(js, '.flac")', '.ogg")', 13) elif slug == 'dt-danmaku-2': pass # sem links, sem saves else: sys.exit('slug desconhecido') print(slug, 'ok')