d67e7a44cd
move files update character creater to allowing to stack classes
108 lines
3.4 KiB
Python
108 lines
3.4 KiB
Python
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):
|
|
print(CharacterCreater.make_dict_list_into_table(player_config["species"], change_by_key=lambda key, element: CharacterCreater.change_character_key(key, element)))
|
|
if not block_by_fixed_type:
|
|
select_species = list(player_config["species"].keys())
|
|
else:
|
|
select_species = list(player_config["species"].keys())[:-1]
|
|
|
|
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:
|
|
# TODO: Remove all combineble Classes
|
|
del player_config["species"][characte_species["species"]["name"]]
|
|
player_config["species"]["Current Selected"] = characte_species["species"]
|
|
combineble_species = CharacterCreater.select_a_species(player_config, block_by_fixed_type=True)["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
|