Ability/Script
From Wildermyth Wiki
< Ability
This is a Python script to generate the Ability tables. Copy the code in the box below into a text file named abilityTable.py (or whatever you want) inside the Wildermyth directory. Then run it by calling python abilityTable.py from the command line. It will create a text file named abilityTable.txt with the appropriate wiki-formatted content.
abilityTable.py |
import json from glob import glob import re directory = 'assets/data/aspects' text_file = 'assets/text/aspects/aspects.properties' aspectNames = {} aspectBlurbs = {} with open(text_file,'r',encoding='utf8') as f: lines = f.readlines() for line in lines: if line[0] == '#': continue try: key,val = line.split('=') except: continue try: key_split = key.split('.') except: continue if len(key_split) == 2 and key_split[-1] == 'name': aspectNames[key_split[0]] = val[:-1] elif len(key_split) == 2 and key_split[-1] == 'blurb': aspectBlurbs[key_split[0]] = val[:-1] with open('version.txt','r',encoding='utf8') as f: lines = f.readlines() version = lines[0] decks = {'common':[],'warrior':[],'hunter':[],'mystic':[],'upgrade':[]} aspectfiles = glob(directory + '/*') for file in aspectfiles: with open(file) as f: data = json.load(f) for entry in data: for deck in decks: if entry.get('info', {}).get('abilityDeckUsage') == deck: decks[deck] += [entry] upgrades = [] for entry in decks['upgrade']: upgradeFor = entry.get('info', {}).get('upgradeForAbility') if upgradeFor is not None: for deck in decks: for base in decks[deck]: if base['id'] == upgradeFor: decks[deck] += [entry] break else: continue break else: upgrades += [entry] else: upgrades += [entry] decks['upgrade'] = upgrades for deck in decks: decks[deck] = sorted(decks[deck], key=lambda d: aspectNames[d['id']]) deck_blurbs = { 'common':'=== General Abilities ===\nThese abilities are available to all heroes.\n', 'warrior':'=== Warrior Abilities ===\nThese abilities are only available to [[Warrior]]s.\n', 'hunter':'=== Hunter Abilities ===\nThese abilities are only available to [[Hunter]]s.\n', 'mystic':'=== Mystic Abilities ===\nThese abilities are only available to [[Mystic]]s.\n', 'upgrade':'=== Theme Upgrades ===\nThese upgrades require specific [[theme]]s.', } string = '' def replace_tag(tag,new,string): while True: start = string.find('[%s]'%tag) if start < 0: break num = 1 for j in re.finditer(r'\[.*?\]',string[start+len(tag)+2:]): tag_ = string[start+len(tag)+2+j.start():start+len(tag)+2+j.end()][1:-1] if tag_ not in ['',tag]: num += 1 else: num -= 1 if num == 0: end = start+len(tag)+2+j.end() string = string[:start] + new + string[start+len(tag)+2:end-2-len(tag_)] + new + string[end:] break return string def parse(blurb): out = blurb out = replace_tag('b',"'''",out) out = replace_tag('blue',"",out) out = replace_tag('gray',"",out) out = out.replace('<self>','Hero') out = out.replace('<name>','Hero') out = re.sub(r'\<int.*?\>', 'x', out) out = re.sub(r'\<float.*?\>', 'x', out) out = re.sub(r'\<mf:.*?/.*?/(.*?)\>', '\g<1>', out) #out = re.sub(r'\[b\](.*?)\[.*?\]', "'''\g<1>'''", out) #out = re.sub(r'\[blue\](.*?)\[.*?\]', "\g<1>", out) #out = re.sub(r'\[gray\](.*?)\[.*?\]', "\g<1>", out) out = re.sub(r'\[:statusEffect\.(.*?)\](.*?)\[\]', '[[\g<1>|\g<2>]]', out) out = re.sub(r'\[statusEffect:(.*?)\](.*?)\[\]', '[[\g<1>|\g<2>]]', out) out = re.sub(r'\<self\..*?:.*?[^<]/(.*?)\>', '\g<1>', out) out = re.sub(r'\<self\..*?:.*?\>', '', out) out = re.sub(r'\<test:.*?:(.*?[^<])/.*?\>', '\g<1>', out) out = re.sub(r'\<test:.*?:.*?\>', '', out) out = re.sub(r'\(Current.*?\)', '', out) out = out.replace('\\n','<br />') out = out.replace('Bonus Damage','[[Bonus Damage]]') out = out.replace('Potency','[[Potency]]') out = out.replace('Stunt Chance','[[Stunt Chance]]') out = out.replace('Temp Health','[[Temp Health]]') out = out.replace('Temporary Health','[[Temporary Health]]') out = out.replace('Armor','[[Armor]]') out = out.replace('Warding','[[Warding]]') out = out.replace('Recovery Rate','[[Recovery Rate]]') out = out.replace('Retirement Age','[[Retirement Age]]') out = out.replace('bonus damage','[[bonus damage]]') out = out.replace('spell damage','[[spell damage]]') out = out.replace('armor','[[armor]]') out = out.replace('warding','[[warding]]') return out for deck in decks: string += deck_blurbs[deck] if deck != 'upgrade': string += '\n{| class="wikitable"\n! Name\n! Description\n|-\n' else: string += '\n{| class="wikitable sortable"\n! Name\n! Requires one of\n! Description\n|-\n' for entry in decks[deck]: name = aspectNames[entry['id']] blurb = aspectBlurbs[entry['id']] if name[-1] == '+': nameStr = '[[' + name[:-1] + ']]+' else: nameStr = '[[' + name + ']]' nameStr = nameStr.replace('/',']]/[[') string += '| %s\n'%(nameStr) if deck == 'upgrade': requirements = [] for req in entry.get('abilityRequiresOneAspectOf'): reqname = aspectNames[req] reqname = reqname.replace('(','') reqname = reqname.replace(')','') requirements += ['[[%s]]'%reqname] string += '| %s\n'%(', '.join(requirements)) string += '| %s\n|-\n'%parse(blurb) string += '|}\n\n' string += '<small>Last updated [[%s]] using [[/Script|this script]].</small>\n'%version[:-1] with open('abilityTable.txt', 'w') as f: f.write(string) |