cleaning up code

This commit is contained in:
Zachary Watts
2026-05-03 22:32:50 -04:00
parent 2173733463
commit fbe69be2ac
7 changed files with 117 additions and 74 deletions

View File

@@ -10,6 +10,28 @@ def roll_dice(count, sides):
# Player Character Classes
class Adventurer:
ability_score_modifiers = {
'strength' : { 3 : { 'melee' : -3, 'open doors': 1 }, 5 : { 'melee' : -2, 'open doors': 1 }, 8 : { 'melee' : -1, 'open doors': 1 },
12 : { 'melee' : 0, 'open doors': 2 }, 15 : { 'melee' : 1, 'open doors': 3 }, 17 : { 'melee' : 2, 'open doors': 4 },
18 : { 'melee' : 3, 'open doors': 5 } },
'intelligence' : { 3 : { 'languages' : 'native, broken speech', 'literacy': 'illiterate' }, 5 : { 'languages' : 'native', 'literacy': 'illiterate' },
8 : { 'languages' : 'native', 'literacy': 'basic' }, 12 : { 'languages' :'native', 'literacy': 'literate' },
15 : { 'languages' : 'native +1 additional', 'literacy': 'literate'}, 17 : { 'languages' : 'native +2 additional', 'literacy': 'literate' },
18 : { 'languages' : 'native +3 additional', 'literacy': 'literate' } },
'wisdom' : { 3 : { 'magic saves' : -3 }, 5 : { 'magic saves' : -2 }, 8 : { 'magic saves' : -1 }, 12 : { 'magic saves' : 0,},
15 : { 'magic saves' : 1 }, 17 : { 'magic saves' : 2 }, 18 : { 'magic saves' : 3 } },
'dexterity' : { 3 : { 'AC' : -3, 'missile': -3, 'initiative' : -2 }, 5 : { 'AC' : -2, 'missile': -2, 'initiative' : -1},
8 : { 'AC' : -1, 'missile': -1, 'initiative' : -1 }, 12 : { 'AC' : 0, 'missile': 0, 'initiative' : 0 },
15 : { 'AC' : 1, 'missile': 1, 'initiative' : 1 }, 17 : { 'AC' : 2, 'missile': 2, 'initiative' : 1 },
18 : { 'AC' : 3, 'missile': 3, 'initiative' : 2 } },
'constitution' : { 3 : { 'hit points' : -3 }, 5 : { 'hit points' : -2 }, 8 : { 'hit points' : -1 }, 12 : { 'hit points' : 0 },
15 : { 'hit points' : 1 }, 17 : { 'hit points' : 2 }, 18 : { 'hit points' : 3 } },
'charisma' : { 3 : { 'npc reactions' : -2, 'max retainers': 1, 'retainer loyalty' : 4 }, 5 : { 'npc reactions' : -2, 'max retainers': 2, 'retainer loyalty' : 5 },
8 : { 'npc reactions' : -1, 'max retainers': 3, 'retainer loyalty' : 6 }, 12 : { 'npc reactions' : 0, 'max retainers': 4, 'retainer loyalty' : 7 },
15 : { 'npc reactions' : 1, 'max retainers': 5, 'retainer loyalty' : 8 }, 17 : { 'npc reactions' : 1, 'max retainers': 6, 'retainer loyalty' : 9 },
18 : { 'npc reactions' : 2, 'max retainers': 7, 'retainer loyalty' : 10 } }
}
def __init__(self, c_id: str, level=1, attributes={}) -> None:
# using a get() method to pull an attribute else use a default value, https://python-academy.org/en/handbook/get
self.identifier = c_id
@@ -27,7 +49,7 @@ class Adventurer:
self.gold= roll_dice(3,6)
self.torches = roll_dice(1,6)
self.rations = roll_dice(1,6)
self.equipment = self.roll_equipment()
self.equipment = self.set_equipment()
# all armor, individual classes may have overrides
self.possible_armor = list(armor.keys())
# all weapons, individual classes may have overrides
@@ -43,21 +65,21 @@ class Adventurer:
self.thief_skills = None
self.turn_undead = None
def __str__(self):
def __str__(self) -> str:
return f"{self.player_class}"
def get_subclass_dict():
def get_subclass_dict() -> dict:
subclasses = {}
for subclass in Adventurer.__subclasses__():
subclasses[subclass.adv_class] = subclass
return subclasses
def get_json(self):
def get_json(self) -> dict:
char_dict = self.__dict__
char_json = json.dumps(char_dict)
return char_dict
def vertical_sheet(self):
def vertical_sheet(self) -> list:
sheet = []
sheet.append('{0: <28}'.format(f"| {self.player_class.title()} - Level {self.level}"))
for key, val in self.get_attributes().items():
@@ -89,7 +111,7 @@ class Adventurer:
sheet = [ line + "|" for line in sheet ]
return sheet
def full_sheet(self):
def full_sheet(self) -> list:
sheet = { 1: [], 2 : [] }
sheet[1].append('{0: <60}'.format(f"| Character Name:"))
sheet[1].append('{0: <60}'.format(f"| Player Name :"))
@@ -105,26 +127,27 @@ class Adventurer:
sheet[1].append('{0: <60}'.format(f"| Charisma:\t{self.charisma} SpellMod: {self.ac}"))
return sheet
def get_attributes(self):
def get_attributes(self) -> dict:
attribute_list = ['strength', 'intelligence', 'wisdom', 'dexterity', 'constitution', 'charisma']
return {k: self.__dict__[k] for k in attribute_list}
def get_best_prime_attribute(self):
def get_best_prime_attribute(self) -> str:
attribute_list = [ 'strength', 'intelligence', 'wisdom', 'dexterity' ]
prime_attributes = {k: self.__dict__[k] for k in attribute_list}
# return highest, found this at https://stackoverflow.com/a/280156
return max(prime_attributes, key=prime_attributes.get)
def roll_equipment(self):
def set_equipment(self):
equipment = [ 'backpack', 'tinderbox', 'waterskin' ]
random_items = [ random.choice(adventuring_gear) for i in range(2) ]
for item in random_items:
equipment += item.split("+")
while len(equipment) < 7:
equipment.append("")
for i in range(2):
item = ""
while item not in equipment:
item = random.choice(adventuring_gear)
if item not in equipment:
equipment.append(item)
return equipment
def select_spells(self, spell_list):
def select_spells(self, spell_list) -> list:
spell_book = []
for spell_level, count in self.spells.items():
if count != "-":
@@ -132,10 +155,11 @@ class Adventurer:
new_spell = ""
while new_spell not in spell_book:
new_spell = random.choice(spell_list[spell_level])
spell_book.append(new_spell)
if new_spell not in spell_book:
spell_book.append(new_spell)
return spell_book
def roll_all_hit_points(self):
def roll_all_hit_points(self) -> list:
hp_list = []
prev_hit_dice = 0
for i in range(self.__class__.max_level):
@@ -151,10 +175,10 @@ class Adventurer:
hp_list.append(hp_roll)
return hp_list
def get_class_progression_for_level(self):
def get_class_progression_for_level(self) -> list:
return list(filter(lambda d: d['level'] == self.level, self.__class__.progression))[0]
def set_level(self, new_level):
def set_level(self, new_level) -> None:
self.level = new_level
self.hp = sum(self.hp_rolls[:self.level])
if self.player_class in [ "magic user", "elf" ]:
@@ -163,8 +187,9 @@ class Adventurer:
if self.player_class == "cleric":
self.spells = Cleric.spells[self.level]
self.spell_book = self.select_spells(cleric_spells)
self.turn_undead = Cleric.turn_undead[self.level]
def set_attack_bonus(self):
def set_attack_bonus(self) -> int:
prog = self.get_class_progression_for_level()
thac0 = prog['thac0']
atk = 19 - thac0
@@ -321,7 +346,7 @@ class Cleric(Adventurer):
self.spells = Cleric.spells[self.level]
self.spell_book = self.select_spells(cleric_spells)
self.atk = self.set_attack_bonus()
self.turn_undead = Cleric.turn_undead
self.turn_undead = Cleric.turn_undead[self.level]
class Thief(Adventurer):
adv_class = "thief"