From bbfc8ff295ba21e979dbc512f3d30e3febef7e57 Mon Sep 17 00:00:00 2001 From: Mark Wolfman Date: Mon, 26 Mar 2018 23:50:26 -0500 Subject: [PATCH] Added saving throws and skills. --- dungeonsheets/character.py | 38 ++++++++++++++++----- dungeonsheets/make_sheets.py | 63 ++++++++++++++++++++++++++++++++++- dungeonsheets/stats.py | 46 +++++++++++++++++++++++-- examples/rogue.pdf | Bin 215044 -> 224689 bytes examples/rogue.py | 16 ++++++--- tests/test_character.py | 1 + tests/test_stats.py | 30 +++++++++++++++-- 7 files changed, 175 insertions(+), 19 deletions(-) diff --git a/dungeonsheets/character.py b/dungeonsheets/character.py index 91193a3..551b53a 100644 --- a/dungeonsheets/character.py +++ b/dungeonsheets/character.py @@ -2,7 +2,7 @@ import re -from .stats import Stat +from .stats import Ability, Skill from .dice import read_dice_str dice_re = re.compile('(\d+)d(\d+)') @@ -25,13 +25,33 @@ class Character(): # Hit points hp_max = 10 hit_dice_faces = 2 - # Base stats (ability scores - strength = Stat() - dexterity = Stat() - constitution = Stat() - intelligence = Stat() - wisdom = Stat() - charisma = Stat() + # Base stats (ability scores) + strength = Ability() + dexterity = Ability() + constitution = Ability() + intelligence = Ability() + wisdom = Ability() + charisma = Ability() + saving_throw_proficiencies = [] + # Skills + acrobatics = Skill(ability='dexterity') + animal_handling = Skill(ability='wisdom') + arcana = Skill(ability='intelligence') + athletics = Skill(ability='strength') + deception = Skill(ability='charisma') + history = Skill(ability='intelligence') + insight = Skill(ability='wisdom') + intimidation = Skill(ability='charisma') + investigation = Skill(ability='intelligence') + medicine = Skill(ability='wisdom') + nature = Skill(ability='intelligence') + perception = Skill(ability='wisdom') + performance = Skill(ability='charisma') + persuasian = Skill(ability='charisma') + religion = Skill(ability='intelligence') + sleight_of_hand = Skill(ability='dexterity') + stealth = Skill(ability='dexterity') + survival = Skill(ability='wisdom') # Inventory cp = 0 sp = 0 @@ -79,6 +99,7 @@ class Character(): class Barbarian(Character): class_name = 'Barbarian' hit_dice_faces = 12 + saving_throw_proficiencies = ['strength', 'constitution'] class Bard(Character): @@ -119,6 +140,7 @@ class Ranger(Character): class Rogue(Character): class_name = 'Rogue' hit_dice_faces = 8 + saving_throw_proficiencies = ['dexterity', 'intelligence'] class Sorceror(Character): diff --git a/dungeonsheets/make_sheets.py b/dungeonsheets/make_sheets.py index 916a00a..0de37eb 100644 --- a/dungeonsheets/make_sheets.py +++ b/dungeonsheets/make_sheets.py @@ -54,7 +54,7 @@ def create_fdf(character, fdfname): ('Race ', character.race), ('Alignment', character.alignment), ('XP', character.xp), - # Attributes + # Abilities ('ProfBonus', mod_str(character.proficiency_bonus)), ('STRmod', str(character.strength.value)), ('STR', mod_str(character.strength.modifier)), @@ -71,6 +71,33 @@ def create_fdf(character, fdfname): ('AC', character.armor_class), ('Initiative', mod_str(character.dexterity.modifier)), ('Speed', character.speed), + ('Passive', 10 + character.perception), + # Saving throws (proficiencies handled later) + ('ST Strength', mod_str(character.strength.saving_throw)), + ('ST Dexterity', mod_str(character.dexterity.saving_throw)), + ('ST Constitution', mod_str(character.constitution.saving_throw)), + ('ST Intelligence', mod_str(character.intelligence.saving_throw)), + ('ST Wisdom', mod_str(character.wisdom.saving_throw)), + ('ST Charisma', mod_str(character.charisma.saving_throw)), + # Skills (proficiencies handled below) + ('Acrobatics', mod_str(character.acrobatics)), + ('Animal', mod_str(character.animal_handling)), + ('Arcana', mod_str(character.arcana)), + ('Athletics', mod_str(character.athletics)), + ('Deception ', mod_str(character.deception)), + ('History ', mod_str(character.history)), + ('Insight', mod_str(character.insight)), + ('Intimidation', mod_str(character.intimidation)), + ('Investigation ', mod_str(character.investigation)), + ('Medicine', mod_str(character.medicine)), + ('Nature', mod_str(character.nature)), + ('Perception ', mod_str(character.perception)), + ('Performance', mod_str(character.performance)), + ('Persuasion', mod_str(character.persuasian)), + ('Religion', mod_str(character.religion)), + ('SleightofHand', mod_str(character.sleight_of_hand)), + ('Stealth ', mod_str(character.stealth)), + ('Survival', mod_str(character.survival)), # Hit points ('HDTotal', character.hit_dice), ('HPMax', character.hp_max), @@ -81,6 +108,40 @@ def create_fdf(character, fdfname): ('GP', character.gp), ('PP', character.pp), ] + # Check boxes for proficiencies + ST_boxes = { + 'strength': 'Check Box 11', + 'dexterity': 'Check Box 18', + 'constitution': 'Check Box 19', + 'intelligence': 'Check Box 20', + 'wisdom': 'Check Box 21', + 'charisma': 'Check Box 22', + } + for ability in character.saving_throw_proficiencies: + fields.append((ST_boxes[ability], 'Yes')) + skill_boxes = { + 'acrobatics': 'Check Box 23', + 'animal_handling': 'Check Box 24', + 'arcana': 'Check Box 25', + 'athletics': 'Check Box 26', + 'deception': 'Check Box 27', + 'history': 'Check Box 28', + 'insight': 'Check Box 29', + 'intimidation': 'Check Box 30', + 'investigation': 'Check Box 31', + 'medicine': 'Check Box 32', + 'nature': 'Check Box 33', + 'perception': 'Check Box 34', + 'performance': 'Check Box 35', + 'persuasian': 'Check Box 36', + 'religion': 'Check Box 37', + 'sleight_of_hand': 'Check Box 38', + 'stealth': 'Check Box 39', + 'survival': 'Check Box 40', + } + for skill in character.skill_proficiencies: + fields.append((skill_boxes[skill], 'Yes')) + # Create the actual FDF file fdf = forge_fdf("", fields, [], [], []) fdf_file = open(fdfname, "wb") fdf_file.write(fdf) diff --git a/dungeonsheets/stats.py b/dungeonsheets/stats.py index 00bd20e..d14abc8 100644 --- a/dungeonsheets/stats.py +++ b/dungeonsheets/stats.py @@ -11,15 +11,55 @@ def mod_str(modifier): -class Stat(): +class Ability(): value = 10 + ability_name = None + character = None def __init__(self, value=10): self.value = value + def __set_name__(self, character, name): + self.ability_name = name + + def __get__(self, character, Character): + self.character = character + return self + + def __set__(self, obj, val): + self.value = val + @property def modifier(self): return math.floor((self.value - 10) / 2) - def __set__(self, obj, val): - self.value = val + @property + def saving_throw(self): + modifier = self.modifier + # Check for proficiency + if self.ability_name is not None: + is_proficient = (self.ability_name in self.character.saving_throw_proficiencies) + if is_proficient: + modifier += self.character.proficiency_bonus + # Return the value + return modifier + + +class Skill(): + """An ability-based skill, such as athletics.""" + + def __init__(self, ability): + self.ability_name = ability + + def __set_name__(self, character, name): + self.skill_name = name + self.character = character + + def __get__(self, character, owner): + ability = getattr(character, self.ability_name) + modifier = ability.modifier + # Check for proficiency + is_proficient = self.skill_name in character.skill_proficiencies + if is_proficient: + modifier += character.proficiency_bonus + return modifier diff --git a/examples/rogue.pdf b/examples/rogue.pdf index b307fd9a2a58a37f713b0a26e8ff6d734910e70f..5a45ebce44ea178e04e600e2c5dd17300db834a1 100644 GIT binary patch delta 38662 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 Rgi)Z2qAp!dKIfF8{|9wvRgVAw delta 35710 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