from simple_term_menu import TerminalMenu from tabulate import tabulate import logging import sys, re LOGGING = logging.getLogger(__name__) class CharacterCreater: @classmethod def make_dict_list_into_table(cls, dict_list:dict, change_by_key=None, ignore_keys:list[str]=[]): dict_keys = list(dict_list.keys()) keys = list(dict_list[dict_keys[0]].keys()) table = [dict_keys] for key in keys: row = [] if not key in ignore_keys: row.append(key) for element in dict_list.values(): if change_by_key != None: element[key] = change_by_key(key, element) row.append(element[key]) table.append(row) return tabulate(table, headers='firstrow', tablefmt='grid') @classmethod def change_character_key(cls, key, element): if key == "fixed_type": if not element[key]: return None return element[key] @classmethod def select_a_species(cls, player_config:dict, block_by_fixed_type:bool=False, current_selected:dict=False): if not block_by_fixed_type: select_species = player_config["species"] else: select_species = { k:v for k, v in player_config["species"].items() if v["combineble"] == False } if current_selected: select_species["Current Selected"] = current_selected print(CharacterCreater.make_dict_list_into_table(select_species, change_by_key=lambda key, element: CharacterCreater.change_character_key(key, element))) select_species = [ x for x in select_species.keys() if x != "Current Selected" ] m = TerminalMenu(select_species, title='Select a Species') selection = m.show() characte_species = player_config["species"][select_species[selection]] characte_species["name"] = select_species[selection] if not characte_species["fixed_type"] and not block_by_fixed_type: types = [ x["name"] for x in player_config["types"] ] m = TerminalMenu(types, title='Select a Type') selection = m.show() characte_type = (types[selection]) else: characte_type = characte_species["fixed_type"] if characte_species["combineble"]: combineble_species = True else: combineble_species = False return { "species": characte_species, "type": characte_type, "combineble": combineble_species } @classmethod def create_character(cls, player_config:dict, message:str): print(message) while True: try: characte_name = input("Enter Character Name: ") if re.match("[a-zA-Z]", characte_name): break except KeyboardInterrupt as e: LOGGING.debug(e) sys.exit(1) characte_species = CharacterCreater.select_a_species(player_config) if not characte_species["combineble"]: combineble_species = False else: combineble_species = CharacterCreater.select_a_species(player_config, block_by_fixed_type=True, current_selected=characte_species["species"])["species"] return CharacterCreater.cleanup({ "name": characte_name, "species": characte_species, "type": characte_species["type"], "combineble_species": combineble_species }) @classmethod def cleanup(cls, player_config:dict): if player_config["species"]["species"]: player_config["species"] = player_config["species"]["species"] if player_config["combineble_species"]: del player_config["combineble_species"]["combineble"] del player_config["combineble_species"]["fixed_type"] return player_config