#!/usr/bin/env python3 import argparse import json import pathlib import xml.etree.ElementTree as ET from consts.species import PokemonSpecies argparser = argparse.ArgumentParser( prog='make_pokedex_message_banks_py', description='Compiles pokedex message files' ) argparser.add_argument('-s', '--source-dir', required=True, help='Path to the source directory (res/text/pokedex_message_banks)') argparser.add_argument('-o', '--output-dir', required=True, help='Path to the output directory (where the gmm files will be made)') args = argparser.parse_args() source_dir = pathlib.Path(args.source_dir) output_dir = pathlib.Path(args.output_dir) def Convert_weight(hectograms): conv = 4.536 lbs = round(hectograms/conv,1) if lbs == 1505.7: lbs = 1505.8 elif lbs == 740.7: lbs = 740.8 elif lbs == 1653.4: lbs = 1653.5 if lbs >= 1000: return f'{lbs} lbs.' if lbs >= 100: return f' {lbs} lbs.' if lbs >= 10: return f'  {lbs} lbs.' return f'   {lbs} lbs.' def Convert_Height(decimeters): conv = 3.937 feet = 0 inches = round(decimeters*conv) while inches >= 12: feet += 1 inches -= 12 if feet >= 100: return f'{feet}’{inches:02}”' if feet >= 10: return f' {feet}’{inches:02}”' return f'  {feet}’{inches:02}”' # variables NUM_POKEMON = len(PokemonSpecies) nameData = ['' for i in range(NUM_POKEMON)] nameArticles = ['' for i in range(NUM_POKEMON)] dexEntries = ['' for i in range(NUM_POKEMON-2)] heights = ['' for i in range(NUM_POKEMON-2)] heights_gira = ['' for i in range(NUM_POKEMON-2)] weights = ['' for i in range(NUM_POKEMON-2)] weights_gira = ['' for i in range(NUM_POKEMON-2)] nameNumber = ['' for i in range(NUM_POKEMON-2)] dexCategories = ['' for i in range(NUM_POKEMON-2)] # collect data for i, species in enumerate(PokemonSpecies): subdir = species.name subdir = subdir[8:].lower() if subdir == 'none': subdir = '000' with open(source_dir / '../pokemon' / subdir / 'data.json', 'r', encoding='utf-8') as data_file: pkdata = json.load(data_file) if subdir not in ['egg', 'bad_egg']: pokemonName = pkdata['name'].upper() else: pokemonName = pkdata['name'] nameData[i] = pokemonName if pokemonName[0] in ['A','E','I','O','U']: nameArticles[i] = 'an {COLOR 255}' + pokemonName + '{COLOR 0}' else: nameArticles[i] = 'a {COLOR 255}' + pokemonName + '{COLOR 0}' # eggs do not have dex entries if subdir in ['egg', 'bad_egg']: continue nameNumber[i] = f'{i:03} ' + pokemonName pkdexdata = pkdata['pokedex_data'] if subdir == 'giratina': heights_gira[i] = Convert_Height(pkdexdata[1]['height']) weights_gira[i] = Convert_weight(pkdexdata[1]['weight']) pkdexdata = pkdexdata[0] else: heights_gira[i] = Convert_Height(pkdexdata['height']) weights_gira[i] = Convert_weight(pkdexdata['weight']) dexEntries[i] = str(pkdexdata['entry_text']).replace('\n','\\n') dexCategories[i] = pkdexdata['category'] heights[i] = Convert_Height(pkdexdata['height']) weights[i] = Convert_weight(pkdexdata['weight']) if subdir == '000': nameNumber[i] = '----------' heights[i] = '???’??”' heights_gira[i] = '???’??”' weights[i] = '????.? lbs.' weights_gira[i] = '????.? lbs.' fileNames = [ 'message_bank_species_names.gmm', 'message_bank_species_names_with_articles.gmm', 'message_bank_species_dex_entry.gmm', 'message_bank_species_weight.gmm', 'message_bank_species_weight_gira.gmm', 'message_bank_species_height.gmm', 'message_bank_species_height_gira.gmm', 'message_bank_species_name_number_1.gmm', 'message_bank_species_name_number_2.gmm', 'message_bank_species_name_number_3.gmm', 'message_bank_species_category.gmm' ] fileKeys = [ '30764', '59681', '63572', '25297', '64639', '5013', '28660', '32249', '32250', '32230', '22840' ] fileNumber = [ 412, 413, 706, 707, 708, 709, 710, 712, 715, 716, 718 ] fileArrays = [ nameData, nameArticles, dexEntries, weights, weights_gira, heights, heights_gira, nameNumber, nameNumber, nameNumber, dexCategories ] fileData = [bytes() for i in range(len(fileNames))] emptyString = 'empty_string' # construct binaries for file in range(len(fileNames)): body = ET.Element('body') body.set('language', 'English') key = ET.SubElement(body, 'key') key.set('value', fileKeys[file]) for i in range(len(fileArrays[file])): row = ET.SubElement(body, 'row') row.set('id', f'pl_msg_{fileNumber[file]:08}_{i:05}') row.set('index', f'{i}') attribute = ET.SubElement(row, 'attribute') attribute.set('name', 'window_context_name') if (((fileNames[file] == 'message_bank_species_names_with_articles.gmm') or (fileNames[file] == 'message_bank_species_dex_entry.gmm')) and (i == 0)): attribute.text = 'garbage' language = ET.SubElement(row, 'language') language.set('name', 'English') language.text = emptyString language = ET.SubElement(row, 'language') language.set('name', '日本語') language.text = emptyString else: attribute.text = 'used' language = ET.SubElement(row, 'language') language.set('name', 'English') language.text = fileArrays[file][i] ET.indent(body, '\t') message_bank = ET.tostring(body, encoding='utf-8') message_bank = message_bank.decode('utf-8').replace(emptyString, '').encode('utf-8') fileData[file] = bytes('\n', encoding='utf-8') + message_bank + bytes('\n', encoding='utf-8') # save binaries for i in range(len(fileNames)): target_fname = output_dir / fileNames[i] with open(target_fname, 'wb+') as target_file: target_file.write(fileData[i])