"""Filtra src/data/levels.json do Breakout 71 para o FredyGames. O jogo traz ~620 fases de pixel art enviadas pela comunidade; muitas reproduzem personagens, logotipos, capas de albuns e marcas de terceiros (Mario, Pac-Man, Minecraft, Ghostbusters, logos de software, TV...). Aqui ficam so os icones da interface (icon:*), as fases abstratas, bandeiras, paisagens, animais e coisas do dia a dia, e as poucas fases das categorias "symbols", "portraits" e "games" que sao originais ou genericas. As categorias "symbols", "portraits" e "games" usam lista de permitidos; as demais, lista de removidos. Nome ausente do arquivo = erro (a lista tem que bater). uso: python3 -I filter-levels.py """ import json import sys ALLOW = { "symbols": [ "71 mini", "Smiley", "Small heart", "Marion", "Renan", "Dollar", "Yellow 71", "71 on white", "Blue 71", "Seventy one", "B71", "A", "B", "C", "D", "e", "You are here", "Play", "Note", "Fingerprint", "Noodlemire", "Crosshair", "S", "The Boys", "Taijitu", "Corporate dress", "Question mark", "Crosshair 2", "Rainbow", "5 min less", "Exclamation mark", "Arrow down", "Stonks", "Not stonks", "Pure Love", "Letters and Numbers", "Breakout LXXI", "S.P.Q.R", "QR Code", "Morse Code", "Cupids Arrow", "Atom", "dragons tower", "the forbidden level", "Breakout 71, negative space", "Tamil", "resonate", "Copyright", "Copyleft", "Degoogle", ], "portraits": [ "Sunny Face", "Face", "Zen monk", "Pumpkin", "L'Angélus", "Floaty Ghost", "The Skull", "Couple", "Bench proposal", "Bigoudène", "Hastati", "Spartans!", "Centurion", "Numidian cavalry", "Hydra & Hercules", "Minotaur", "Zeus", "Sisyphus", "Little Face", "greg1415", "match point", "solace", "friendly", "Yes Coach!", ], "games": [ "Gliders", "Inception", "Chess", "Tic Tac Toe", "miss", "invasion", "snakeout 71", "platformer", "dungeon crawling", "Zala", ], } DENY = { "abstract": [ "C.G.Jung RedBook pg94 V.1", "C.G.Jung RedBook pg94 V.2", "C.G.Jung RedBook pg93 V.1", "C.G.Jung RedBook pg159 V.1", ], "landscapes": [ "Bliss", "DeBÍ HaCER MáS NIVELeS", "good kid, m.A.A.d city", "Farming", "The Joy of Painting", ], "animals": [ "dog 21", "Elephant", "Orca", "Shark", "Bird", "Tux", "Pingwin", "Dog 8", "Colibri", "Parrot", "Fish", "GNU", "Toadshield", "Pumpkinhead and Black Cat", "Private Music by Deftones", "Squabble up kitty", ], "stills": [ "Sunglasses", "Balloon", "VLC", "Strawberry", "Steamed clams", "Twine", "Fossify Calendar", "Gamblecore", "To Pimp A Butterly", "Aeropress", "Bread", ], "flags": ["Free Speech Flag / 09 F9"], } path = sys.argv[1] levels = json.load(open(path, encoding="utf-8")) names = {} for l in levels: names.setdefault(l.get("category", ""), set()).add(l["name"]) for cat, lst in list(ALLOW.items()) + list(DENY.items()): missing = [n for n in lst if n not in names.get(cat, set())] if missing: sys.exit("nao achei em %s: %r" % (cat, missing)) kept = [] for l in levels: cat = l.get("category", "") n = l["name"] if n.startswith("icon:"): kept.append(l) elif cat in ALLOW: if n in ALLOW[cat]: kept.append(l) elif n not in DENY.get(cat, []): kept.append(l) # o credito (texto livre das fases) nao pode mandar para fora for l in kept: c = l.get("credit") or "" if "http" in c or "www." in c: l["credit"] = "" print("fases: %d -> %d" % (len(levels), len(kept))) json.dump(kept, open(path, "w", encoding="utf-8"), ensure_ascii=False, separators=(",", ":"))