"""Prepara os recursos do YSoccer para a edicao web (roda na raiz do projeto extraido e patchado, dentro de java/assets): - times: sai data/teams/1964-65 (clubes e selecao reais, com jogadores reais) e, de data/teams/CUSTOM, ficam so dez times de personagens historicos e de coisas (compositores, cientistas, moedas...); saem os de nomes de jogos comerciais, de pessoas vivas, de politica e de brincadeiras internas; - competicoes: saem as de clubes reais; entra uma liga nossa com os dez times (data/competitions/INVENTED); - saem os arquivos de importacao/exportacao de dados do SWOS (config/import*, config/export*, com nomes de clubes reais); - sons: saem as gravacoes de torcida, cantos, apito e abertura da partida (sem origem registrada); - fotos dos fundos de menu (images/backgrounds, de origem desconhecida) viram imagens geradas aqui; - sai a documentacao (docs/, que cita o SWOS), o projeto do TexturePacker e o que nao e carregado pelo jogo. Uso: fix-assets.py """ import json, math, os, shutil, sys from PIL import Image, ImageDraw assets = sys.argv[1] def rm(path): p = os.path.join(assets, path) if os.path.isdir(p): shutil.rmtree(p) elif os.path.exists(p): os.remove(p) KEEP = ["composers", "electronics", "german_scientists", "inventors", "jurists", "kings_and_emper.", "money", "painters", "philosophers", "poets"] # 1. times rm("data/teams/1964-65") custom = os.path.join(assets, "data/teams/CUSTOM") for f in sorted(os.listdir(custom)): if not any(f == "team.%s.json" % k for k in KEEP): os.remove(os.path.join(custom, f)) left = sorted(os.listdir(custom)) assert len(left) == len(KEEP), left # os arquivos de CUSTOM trazem "index" em cada jogador de linha, campo que Player nao tem: o libGDX Json do navegador # recusa ("Field not found: index"). Tira a chave (o resto do arquivo fica igual). for f in left: path = os.path.join(custom, f) data = json.load(open(path, encoding="utf-8")) for p in data["players"]: p.pop("index", None) with open(path, "w", encoding="utf-8", newline="\n") as out: json.dump(data, out, indent=2, ensure_ascii=False) out.write("\n") # 2. competicoes rm("data/competitions") os.makedirs(os.path.join(assets, "data/competitions/INVENTED")) league = [{ "name": "ACADEMY LEAGUE", "numberOfTeams": len(KEEP), "rounds": 2, "pointsForAWin": 3, "substitutions": 3, "benchSize": 5, "time": "DAY", "weather": "BY_SEASON", "seasonStart": "SEPTEMBER", "seasonEnd": "JUNE", "files": { "folder": "CUSTOM", "league": "ACADEMY LEAGUE", "teams": ["CUSTOM/team.%s.json" % k for k in KEEP] } }] with open(os.path.join(assets, "data/competitions/INVENTED/leagues.json"), "w", newline="\n") as f: json.dump(league, f, indent=2) f.write("\n") # 3. importacao/exportacao for f in os.listdir(os.path.join(assets, "data/config")): if f.startswith("import") or f.startswith("export"): os.remove(os.path.join(assets, "data/config", f)) # 4. sons for s in ["celebration", "chant", "crowd", "end", "home_goal", "intro", "whistle"]: rm("sounds/%s.ogg" % s) # 5. fundos de menu gerados (1024x768): degrade vertical + malha de hexagonos + faixas, uma cor por tela PALETTES = { "menu_main": ((8, 18, 50), (20, 70, 120)), "menu_competition": ((14, 40, 30), (30, 110, 70)), "menu_friendly": ((10, 30, 55), (35, 95, 120)), "menu_training": ((40, 28, 12), (120, 85, 30)), "menu_controls": ((38, 14, 52), (100, 40, 130)), "menu_game_options": ((18, 22, 54), (50, 70, 140)), "menu_match_options": ((14, 26, 58), (40, 80, 150)), "menu_match_presentation": ((6, 16, 40), (30, 60, 110)), "menu_set_team": ((44, 20, 14), (130, 60, 40)), "menu_edit": ((30, 30, 36), (80, 84, 100)), "menu_edit_team": ((34, 24, 16), (96, 70, 44)), "menu_edit_players": ((40, 14, 40), (112, 40, 100)), "menu_network": ((12, 30, 34), (36, 100, 110)), } W, H = 1024, 768 def background(c0, c1, seed): img = Image.new("RGB", (W, H)) px = img.load() for y in range(H): t = y / (H - 1) row = tuple(int(c0[i] + (c1[i] - c0[i]) * t) for i in range(3)) for x in range(W): px[x, y] = row lay = Image.new("RGBA", (W, H), (0, 0, 0, 0)) d = ImageDraw.Draw(lay) r = 90 dx, dy = r * 1.5, r * math.sqrt(3) / 2 for col in range(-1, int(W / dx) + 2): for row in range(-1, int(H / (2 * dy)) + 2): cx = col * dx cy = row * 2 * dy + (dy if col % 2 else 0) pts = [(cx + r * math.cos(math.radians(60 * k + 30 * 0)), cy + r * math.sin(math.radians(60 * k))) for k in range(6)] d.polygon(pts, outline=(255, 255, 255, 22)) d.rectangle((0, 150 + seed * 3, W, 156 + seed * 3), fill=(255, 255, 255, 60)) d.rectangle((0, 610 - seed * 3, W, 616 - seed * 3), fill=(255, 255, 255, 40)) img = Image.alpha_composite(img.convert("RGBA"), lay).convert("RGB") return img for i, (name, (c0, c1)) in enumerate(PALETTES.items()): p = os.path.join(assets, "images/backgrounds", name + ".jpg") assert os.path.exists(p), name background(c0, c1, i).save(p, "JPEG", quality=88, optimize=False) # 6. o que o jogo nao carrega rm("docs") rm("images/texture_packs.tpproj") print("ok", len(os.listdir(os.path.join(assets, "images/backgrounds"))), "fundos")