#!/usr/bin/python3 from adventurers import * import random # Player Class Selector class ClassSelector(): def __init__(self, player: Adventurer) -> None: self.player = player # https://stackoverflow.com/questions/3862310/how-to-find-all-the-subclasses-of-a-class-given-its-name # pull classes that do not have requirements self.available_classes = [cls for cls in Adventurer.__subclasses__() if not cls.requirements] # pull classes that do have requirements self.classes_with_reqs = [cls for cls in Adventurer.__subclasses__() if cls.requirements] # run function to randomly select an adventurer class self.selected_class = self.selection() def return_class_by_best_attribute(self): # for adventurer classes in available classes, return the one where that classes' prime requisite is equal to the players best attribute return [adv_class for adv_class in self.available_classes if adv_class.prime_requisite == self.player.get_best_prime_attribute()][0] def return_classes_with_requirements(self): p_attrs = self.player.get_attributes() possible_classes = [] for c in self.classes_with_reqs: match_count = 0 for r in c.requirements: if p_attrs[r] >= c.requirements[r]: match_count += 1 if match_count >= len(c.requirements): possible_classes.append(c) return possible_classes def selection(self): best_prime_attribute = self.player.get_best_prime_attribute() # create an array of possible player classes, add the best choice per player's best core attributes possible_classes = [ self.return_class_by_best_attribute() ] possible_classes += self.return_classes_with_requirements() # randomly select class selected_class = random.choice(possible_classes) return selected_class class PartyGenerator(): def __init__(self, party_size: int) -> None: self.size = party_size self.adventurers = [] self.adventurer_types = [] def gen_party(self): while len(self.adventurers) < self.size: new_player = Adventurer() attempts = 0 while new_player.player_class not in self.adventurer_types: attempts += 1 selected_class = ClassSelector(new_player).selection() new_player = selected_class(new_player.level, new_player.get_attributes()) # i couldnt randomly generate a scenario where a character couldn't be added, but it seems possible, so this is the hard cut off if (new_player.player_class not in self.adventurer_types) or (attempts > 10): self.adventurers.append(new_player) self.adventurer_types.append(new_player.player_class) def get_character_sheets(self): sheet_string = "" character_sheets = [] for c in self.adventurers: character_sheets.append(c.character_sheet()) return character_sheets def __str__(self): return f"{self.adventurers}" def returnParty(party_size): new_party = PartyGenerator(party_size) new_party.gen_party() return new_party def main(): adventurer_party = returnParty(party_size=5) for adv in adventurer_party.adventurers: for line in adv.vertical_sheet: print(f"{line}") print() if __name__ == "__main__": main()