add scripts/rename-home.py

My oneshot script for renaming the HOME sprites from the web rip. In
case we need it in the future for re-ripping, and to record the form
identifiers i used since the new ones aren't in the DB yet.
This commit is contained in:
Andrew Ekstedt 2020-09-02 19:17:41 -07:00
parent dc9a2d8f13
commit b09929dfb6

279
scripts/rename-home.py Normal file
View file

@ -0,0 +1,279 @@
#!/usr/bin/env python3
#
# this is an unmaintained one-shot script, provided for reference only
# it may not work or do what you expected
#
# Usage: rename-home.py src -o dest
# Renames sprites from src dir to dest dir.
# files in src dir should be named as in the HOME unity3d assets.
# files in dest dir will be named according to veekun conventions.
form_names = {
25: ["", "original-cap", "hoenn-cap", "sinnoh-cap", "unova-cap", "kalos-cap", "alola-cap", "partner-cap", "partner"],
133: ["", "partner"],
201: ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
"n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z",
"exclamation", "question"],
351: ["", "sunny", "rainy", "snowy"],
382: ["", "primal"],
383: ["", "primal"],
386: ["normal", "attack", "defense", "speed"],
412: ["plant", "sandy", "trash"],
413: ["plant", "sandy", "trash"],
421: ["overcast", "sunshine"],
422: ["west", "east"],
423: ["west", "east"],
479: ["", "heat", "wash", "frost", "fan", "mow"],
487: ["altered", "origin"],
492: ["land", "sky"],
493: ["normal", "fighting", "flying", "poison", "ground",
"rock", "bug", "ghost", "steel", "fire", "water", "grass",
"electric", "psychic", "ice", "dragon", "dark", "fairy"],
550: ["red-striped", "blue-striped"],
555: ["standard", "zen", "standard-galar", "zen-galar"],
585: ["spring", "summer", "autumn", "winter"],
586: ["spring", "summer", "autumn", "winter"],
592: ["male", "female"],
593: ["male", "female"],
641: ["incarnate", "therian"],
642: ["incarnate", "therian"],
645: ["incarnate", "therian"],
646: ["", "white", "black"],
647: ["ordinary", "resolute"],
648: ["aria", "pirouette"],
649: ["", "douse", "shock", "burn", "chill"],
658: ["", "battle-bond", "ash"],
666: ["icy-snow", "polar", "tundra", "continental", "garden",
"elegant", "meadow", "modern", "marine", "archipelago",
"high-plains", "sandstorm", "river", "monsoon", "savanna",
"sun", "ocean", "jungle", "fancy", "poke-ball"],
669: ["red", "yellow", "orange", "blue", "white"],
670: ["red", "yellow", "orange", "blue", "white", "eternal"],
671: ["red", "yellow", "orange", "blue", "white"],
676: ["", "heart", "star", "diamond", "debutante",
"matron", "dandy", "la-reine", "kabuki", "pharaoh"],
678: ["male", "female"],
681: ["shield", "blade"],
710: ["average", "small", "large", "super"],
711: ["average", "small", "large", "super"],
716: ["neutral", "active"],
718: ["", '10', '10-power-construct', '50-power-construct', 'complete'],
720: ["", "unbound"],
741: ('baile', 'pom-pom', 'pau', 'sensu'),
744: ('', 'own-tempo'),
745: ('midday', 'midnight', 'dusk'),
746: ('solo', 'school'),
773: ('normal', 'fighting', 'flying', 'poison', 'ground', 'rock',
'bug', 'ghost', 'steel', 'fire', 'water', 'grass', 'electric',
'psychic', 'ice', 'dragon', 'dark', 'fairy',),
774: ('red-meteor', 'orange-meteor', 'yellow-meteor', 'green-meteor',
'blue-meteor', 'indigo-meteor', 'violet-meteor', 'red', 'orange',
'yellow', 'green', 'blue', 'indigo', 'violet',),
778: ('disguised', 'busted', 'totem-disguised', 'totem-busted'),
800: ["", "dusk", "dawn", "ultra"],
801: ("", 'original'),
845: ["", "gulping", "gorging"],
849: ["amped", "low-key"],
854: ["phony", "antique"],
855: ["phony", "antique"],
869: ["vanilla-cream", "ruby-cream", "matcha-cream", "mint-cream", "lemon-cream", "salted-cream", "ruby-swirl", "caramel-swirl", "rainbow-swirl"],
875: ["ice", "noice"],
876: ["male", "female"],
877: ["full-belly", "hangry"],
888: ["", "crowned-sword"],
889: ["", "crowned-shield"],
890: ["", "eternamax"],
892: ["single-strike", "rapid-strike"],
19: ["", "alola"],
20: ["", "alola", "totem-alola"],
26: ["", "alola"],
27: ["", "alola"],
28: ["", "alola"],
37: ["", "alola"],
38: ["", "alola"],
50: ["", "alola"],
51: ["", "alola"],
52: ["", "alola", "galar"],
53: ["", "alola"],
74: ["", "alola"],
75: ["", "alola"],
76: ["", "alola"],
88: ["", "alola"],
89: ["", "alola"],
103: ["", "alola"],
105: ["", "alola", "totem"],
735: ["", "totem"],
738: ["", "totem"],
743: ["", "totem"],
752: ["", "totem"],
754: ["", "totem"],
758: ["", "totem"],
777: ["", "totem"],
784: ["", "totem"],
77: ["", "galar"],
78: ["", "galar"],
79: ["", "galar"],
80: ["", "mega", "galar"],
83: ["", "galar"],
110: ["", "galar"],
122: ["", "galar"],
222: ["", "galar"],
263: ["", "galar"],
264: ["", "galar"],
554: ["", "galar"],
562: ["", "galar"],
618: ["", "galar"],
3: ["", "mega"],
6: ["", "mega-x", "mega-y"],
9: ["", "mega"],
15: ["", "mega"],
18: ["", "mega"],
65: ["", "mega"],
94: ["", "mega"],
115: ["", "mega"],
127: ["", "mega"],
130: ["", "mega"],
142: ["", "mega"],
150: ["", "mega-x", "mega-y"],
181: ["", "mega"],
208: ["", "mega"],
212: ["", "mega"],
214: ["", "mega"],
229: ["", "mega"],
248: ["", "mega"],
254: ["", "mega"],
257: ["", "mega"],
260: ["", "mega"],
282: ["", "mega"],
302: ["", "mega"],
303: ["", "mega"],
306: ["", "mega"],
308: ["", "mega"],
310: ["", "mega"],
319: ["", "mega"],
323: ["", "mega"],
334: ["", "mega"],
354: ["", "mega"],
359: ["", "mega"],
362: ["", "mega"],
373: ["", "mega"],
376: ["", "mega"],
380: ["", "mega"],
381: ["", "mega"],
384: ["", "mega"],
428: ["", "mega"],
475: ["", "mega"],
445: ["", "mega"],
448: ["", "mega"],
460: ["", "mega"],
531: ["", "mega"],
719: ["", "mega"],
}
sweets = ["strawberry", "berry", "love", "star", "clover", "flower", "ribbon"]
import os
import sys
import re
import argparse
import shutil
parser = argparse.ArgumentParser()
parser.add_argument('src')
parser.add_argument('-o', dest='dest')
args = parser.parse_args()
fn_re = re.compile("cap(?P<n>[0-9]{4})_f(?P<form>..)_s(?P<sex>.)(?:_128)?(?P<shiny>_r)?(?P<back>_b)?(?:_(?P<extra>[0-9]))?\.")
seen = set()
for file in sorted(os.listdir(args.src)):
m = fn_re.match(file)
if m is None:
print("WARNING: unmatched file", file, file=sys.stderr)
continue
n = int(m.group('n'))
form = int(m.group('form'))
if n in (414, 664, 665) and form > 0:
# 414 mothim - three identical forms
# 664 scatterbug - identical forms
# 665 spewpa - identical forms
continue
# 892 urshifu - form 81 = gigantamax single strike, form 82 = gigantamax rapid strike
if n == 892:
if form == 81:
form_name = 'gigantamax-single-strike'
elif form == 82:
form_name = 'gigantamax-rapid-strike'
else:
form_name = form_names[n][form]
# form 81 = gigantamax
elif form == 81:
form_name = 'gigantamax'
else:
try:
form_name = form_names[n][form]
except (KeyError, IndexError):
form_name = ""
if form > 0 and not form_name:
print("WARNING: no form name for", file, file=sys.stderr)
print("INFO:", m.group('n'), m.group('form'), m.group('sex'), m.group('back') or 'front', m.group('shiny') or 'normal', m.group('extra')or'', file=sys.stderr)
continue
dirs = []
if m.group('back'):
dirs += ['back']
if m.group('shiny'):
dirs += ['shiny']
if m.group('sex') == '1':
dirs += ['female']
# 869 alcremie: its form determines the type of cream, and extra determines the sweet
if n == 869:
if form == 81:
# gigantamax
pass
elif m.group('shiny'):
# shiny alcremie uses the same sprites for all flavors
form_name = sweets[int(m.group('extra'))]
else:
form_name = sweets[int(m.group('extra'))] + "-" + form_name
else:
if m.group('extra'):
print("WARNING: unhandled extra on", file, file=sys.stderr)
if form_name:
new_name = "{}-{}.png".format(n, form_name)
elif n == 0:
new_name = "egg.png"
else:
new_name = "{}.png".format(n)
if dirs:
new_name = '/'.join(dirs) + '/' + new_name
if new_name in seen:
print("WARNING: duplicate file", new_name, file=sys.stderr)
seen.add(new_name)
if args.dest:
if dirs:
os.makedirs('/'.join([args.dest] + dirs), exist_ok=True)
destfile = os.path.join(args.dest, new_name)
if os.path.exists(destfile):
print("ERROR: refusing to overwrite", destfile, file=sys.stderr)
sys.exit(1)
else:
shutil.copyfile(os.path.join(args.src, file), destfile)
else:
print("cp", file.ljust(25), new_name)