"""CircleRC: adapta o projeto para a web e tira o que fala com servicos de terceiros. Rodado pelo build-circlerc.sh sobre o projeto do commit pinado: - a pasta Art/Icons (icones de marcas de redes sociais, que o README do autor diz serem dos donos delas) e o menu de links sociais (SocialMenu: GitHub, site, X, Bluesky, Mastodon, Threads, Instagram, Tumblr e YouTube, todos OS.shell_open) saem: SocialMenu.tscn vira um container vazio e SocialMenu.gd e apagado; - a tela Sobre (sv_about_menu) deixa de abrir links no navegador (open_links = true vira o padrao, false); - a coluna do ranking online some da selecao de fase e da tela de vitoria (LevelSelect.gd e VictoryMenu.gd); - a versao mostrada no menu passa de "dev" para o commit pinado (variavel CIRCLERC_VERSION, definida pelo script); - o id do jogo no Game Jolt sai do project.godot. As integracoes com Newgrounds e Game Jolt (autoloads, ranking online, medalhas) so ligam com as flags de exportacao "newgrounds" e "game_jolt", que o nosso preset nao usa; o ranking (LeaderboardService) fica no backend NONE e as telas dele se escondem. A pasta addons/gamejolt/example (exemplo do addon, nunca carregado) tambem sai. Uso: python3 -I adapt.py """ import os import re import shutil import sys project = sys.argv[1] def path(rel): return os.path.join(project, rel) def read(rel): return open(path(rel), encoding="utf-8").read() def write(rel, s): open(path(rel), "w", encoding="utf-8").write(s) def sub_once(s, old, new): assert s.count(old) == 1, (old, s.count(old)) return s.replace(old, new) # Icones de marcas e links sociais. shutil.rmtree(path("Art/Icons")) for f in ("SocialMenu.gd", "SocialMenu.gd.uid"): os.remove(path("UI/MainMenu/SocialMenu/" + f)) write( "UI/MainMenu/SocialMenu/SocialMenu.tscn", '[gd_scene format=3 uid="uid://dsip72if3djl1"]\n\n' '[node name="SocialMenu" type="MarginContainer" unique_id=134727907]\n' "anchors_preset = 4\nanchor_top = 0.5\nanchor_bottom = 0.5\ngrow_vertical = 2\n", ) # Sobre: sem links para o navegador. s = read("UI/MainMenu/About/About.tscn") s = sub_once(s, "open_links = true\n", "") write("UI/MainMenu/About/About.tscn", s) # Game Jolt: sem id de jogo. s = read("project.godot") s = sub_once(s, 'config/global/game_id="1102290"', 'config/global/game_id=""') write("project.godot", s) # Ranking online: sem backend ("Scores not supported on this platform"), entao a coluna do ranking some da selecao de # fase e da tela de vitoria. s = read("UI/MainMenu/LevelSelect/LevelSelect.gd") s = sub_once( s, "func _ready():\n", "func _ready():\n" "\t# Web build: no online leaderboards.\n" '\t$MarginContainer/VSplitContainer/HBoxContainer/VSeparator2.visible = false\n' '\t$MarginContainer/VSplitContainer/HBoxContainer/VBoxContainer2.visible = false\n', ) write("UI/MainMenu/LevelSelect/LevelSelect.gd", s) s = read("UI/VictoryMenu/VictoryMenu.gd") s = sub_once( s, "func _ready():\n", "func _ready():\n" "\t# Web build: no online leaderboards.\n" '\t$MarginContainer/HBoxContainer/HBoxContainer.visible = false\n', ) write("UI/VictoryMenu/VictoryMenu.gd", s) # Versao: o projeto traz "dev" (a tela mostraria "Development Version"); aqui mostra o commit. s = read("project.godot") s = sub_once(s, 'config/version="dev"', 'config/version="' + os.environ.get("CIRCLERC_VERSION", "dev") + '"') write("project.godot", s) # Cenas e recursos em texto no pacote: ao converter para binario, o Godot 4.7 sorteia um unique_id novo para os nos de # cenas que nao os trazem (Pencil*.tscn, Enemy.tscn...), e o .pck mudava a cada export. s = read("project.godot") s = sub_once(s, "[rendering]\n", "[editor]\n\nexport/convert_text_resources_to_binary=false\n\n[rendering]\n") write("project.godot", s) # Exemplos dos addons (nunca carregados). for d in ("addons/gamejolt/example",): if os.path.isdir(path(d)): shutil.rmtree(path(d))