#!/usr/bin/env python3 """Monta a arvore de arquivos do Cataclysm: Dark Days Ahead que vai para o cataclysm-tiles.data. prepare-data.py e a arvore da tag 0.I-1 (do tarball original ou do pruned que o fredygames.com hospeda; os dois dao a mesma saida). A saida tem data/ e gfx/, como a pasta de uma instalacao do jogo, e vira a raiz (/) do sistema de arquivos do jogo no navegador. Entra (todo o conteudo sob CC BY-SA 3.0, com as fontes sob as licencas delas): data/core, credits, font, fontdata.json, json, mods, motd, names, raw, title (a mesma lista do build-scripts/prepare-web.sh do proprio jogo) e gfx/. Fica de fora, na regra "na duvida, fica de fora" (licenca ou propriedade de terceiros): - data/mods/MMA (Mythical Martial Arts: estilos de luta tirados de franquias de terceiros, como Pokemon, Zelda, Star Wars e Battle Angel Alita); - data/mods/Backrooms (baseado na lenda de internet "The Backrooms", que nasceu de uma foto de terceiros sem licenca livre); - data/mods/Xedra_Evolved (montado como homenagem a The X-Files, "Agent Mulder in the apocalypse") e as pastas mod_interactions/xedra_evolved de outros mods, que so servem a ele. Estes tambem nao estao no tarball pruned. Fica de fora so por tamanho ou por estar obsoleto (licenca em ordem, continuam no tarball): - os mods marcados como "obsolete" no modinfo.json (o prepare-web.sh do jogo faz o mesmo), menos o dda_tutorial: ele so esta marcado assim para nao aparecer na lista de mods, e o "Tutorial Game" do menu principal precisa dele; - data/mods/MA (Massachusetts, 12 MB; o prepare-web.sh tambem tira); - gfx/Ultica_iso (18 MB de PNG; o prepare-web.sh tambem tira); - data/sound (este build nao tem som), data/screenshots, data/xdg, data/changelog.txt e o resto que o jogo nao le. """ import json import os import shutil import sys DATA_ITEMS = ["core", "credits", "font", "fontdata.json", "json", "mods", "motd", "names", "raw", "title"] EXCLUDED_MODS = {"MMA", "Backrooms", "Xedra_Evolved"} # licenca/propriedade de terceiros SIZE_MODS = {"MA"} # so tamanho KEEP_OBSOLETE = {"dda_tutorial"} # "obsolete" so para sumir da lista; o Tutorial Game usa EXCLUDED_INTERACTIONS = {"xedra_evolved"} EXCLUDED_GFX = {"Ultica_iso"} def is_obsolete(mod_dir): with open(os.path.join(mod_dir, "modinfo.json"), encoding="utf-8") as f: info = json.load(f) for entry in info if isinstance(info, list) else [info]: if entry.get("type") == "MOD_INFO" and entry.get("obsolete"): return True return False def ignore_junk(_dir, names): return [n for n in names if n == ".DS_Store"] def main(): if len(sys.argv) != 3: sys.exit(__doc__) src, out = sys.argv[1], sys.argv[2] if os.path.exists(out): shutil.rmtree(out) os.makedirs(os.path.join(out, "data")) for item in DATA_ITEMS: s = os.path.join(src, "data", item) d = os.path.join(out, "data", item) if os.path.isdir(s): shutil.copytree(s, d, ignore=ignore_junk) else: shutil.copyfile(s, d) mods = os.path.join(out, "data", "mods") for name in sorted(os.listdir(mods)): path = os.path.join(mods, name) if not os.path.isdir(path): continue if name in EXCLUDED_MODS or name in SIZE_MODS: shutil.rmtree(path) print(f"mod fora: {name}") elif name not in KEEP_OBSOLETE and is_obsolete(path): shutil.rmtree(path) print(f"mod obsoleto fora: {name}") for name in sorted(os.listdir(mods)): inter = os.path.join(mods, name, "mod_interactions") if os.path.isdir(inter): for target in sorted(os.listdir(inter)): if target in EXCLUDED_INTERACTIONS: shutil.rmtree(os.path.join(inter, target)) print(f"mod_interactions fora: {name}/{target}") shutil.copytree(os.path.join(src, "gfx"), os.path.join(out, "gfx"), ignore=ignore_junk) for name in sorted(EXCLUDED_GFX): shutil.rmtree(os.path.join(out, "gfx", name)) print(f"tileset fora: {name}") if __name__ == "__main__": main()