From f2949521d7ede23fe44b8e11c15ab2f189ba1d0e Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Sat, 19 Mar 2022 12:31:03 -0300 Subject: [PATCH 01/22] Included companions and weight management --- dungeonsheets/character.py | 66 ++++++++++- dungeonsheets/dice.py | 35 ++++-- dungeonsheets/equipment_reader.py | 188 ++++++++++++++++++++++++++++++ dungeonsheets/make_sheets.py | 25 +++- dungeonsheets/stats.py | 60 +++++++++- 5 files changed, 361 insertions(+), 13 deletions(-) create mode 100644 dungeonsheets/equipment_reader.py diff --git a/dungeonsheets/character.py b/dungeonsheets/character.py index f931759..f0cf4c4 100644 --- a/dungeonsheets/character.py +++ b/dungeonsheets/character.py @@ -25,6 +25,7 @@ from dungeonsheets.content_registry import find_content from dungeonsheets.weapons import Weapon from dungeonsheets.content import Creature from dungeonsheets.dice import combine_dice +from dungeonsheets.equipment_reader import equipment_weight_parser dice_re = re.compile(r"(\d+)d(\d+)") @@ -86,6 +87,10 @@ class Character(Creature): attacks_and_spellcasting = "" class_list = list() _background = None + _companions = [] + _carrying_capacity = 0 + _carrying_weight = 0 + equipment_weight_dict = {} # Characteristics personality_traits = ( @@ -747,17 +752,38 @@ class Character(Creature): featS = featS[:N] + ["(...)"] featS += info_list return "\n\n".join(featS) + + @property + def carrying_capacity(self): + _ccModD = {"tiny":0.5, "small":1, "medium":1, + "large":2, "huge":4, "gargantum":8} + cc_mod = _ccModD[self.race.size.lower()] + return 15*self.strength.value*cc_mod + + @property + def carrying_weight(self): + weight = equipment_weight_parser(self.equipment, + self.equipment_weight_dict) + weight += sum([w.weight for w in self.weapons]) + weight += self.armor.weight + if self.shield: + weight += 6 + weight += sum([self.cp, self.sp, self.ep, self.gp, self.pp])/50 + return round(weight, 2) @property def equipment_text(self): eq_list = [] - if hasattr(self, "magic_items"): + if hasattr(self, "magic_items") and len(self.magic_items) > 0: eq_list += ["**Magic Items**"] eq_list += [item.name for item in self.magic_items] - if hasattr(self, "equipment"): + if hasattr(self, "equipment") and len(self.equipment.strip()) > 0: eq_list += ["**Other Equipment**"] eq_list += [text.strip() for text in self.equipment.split("\n") if not(text.isspace())] + cw, cc = self.carrying_weight, self.carrying_capacity + eq_list += [f"**Weight:** {cw} lb\n\n**Capacity:** {cc} lb"] + return "\n\n".join(eq_list) @property @@ -961,6 +987,42 @@ class Character(Creature): if hasattr(self, "Druid"): self.Druid.wild_shapes = new_shapes + @property + def ranger_beast(self): + if hasattr(self, "Ranger"): + return self.Ranger.ranger_beast + else: + return None + + @ranger_beast.setter + def ranger_beast(self, beast): + msg = ( + f"Companion '{beast}' not found. Please add it to" + " ``monsters.py``" ) + beast = self._resolve_mechanic(beast, monsters.Monster, msg) + self.Ranger.ranger_beast = (beast, self.proficiency_bonus) + + @property + def companions(self): + """Return the list of companions and summonables""" + companions = [compa for compa in self._companions] + if self.ranger_beast: + companions.append(self.ranger_beast) + return companions + + @companions.setter + def companions(self, compas): + companions_list = [] + # Retrieve the actual monster classes if possible + for compa in compas: + msg = ( + f"Companion '{compa}' not found. Please add it to" + " ``monsters.py``" ) + new_compa = self._resolve_mechanic(compa, monsters.Monster, msg) + companions_list.append(new_compa) + # Save the updated list for later + self._companions = companions_list + @property def infusions_text(self): if hasattr(self, "Artificer"): diff --git a/dungeonsheets/dice.py b/dungeonsheets/dice.py index 2fe47e7..2a64a1c 100644 --- a/dungeonsheets/dice.py +++ b/dungeonsheets/dice.py @@ -5,27 +5,38 @@ from itertools import groupby from dungeonsheets.exceptions import DiceError -dice_re = re.compile(r"(\d+)d(\d+)", flags=re.I) +dice_re = re.compile(r"(\d+)d(\d+)([+-]\d+)*", flags=re.I) dice_part_re = re.compile(r"[0-9d]+", flags=re.I) -Dice = namedtuple("Dice", ("num", "faces")) +Dice = namedtuple("Dice", ("num", "faces", "modifier")) def read_dice_str(dice_str): - """Interpret a D&D dice string, eg. 3d10. + """Interpret a D&D dice string, eg. 3d10+2. Returns ------- dice : tuple - A named tuple with the scheme (num, faces), so '3d10' return - (num=3, faces=10) + A named tuple with the scheme (num, faces), so '3d10-2' return + (num=3, faces=10, modifier=-2) """ + dice_str = dice_str.replace(" ", "").replace("\n", "") match = dice_re.match(dice_str) if match is None: raise DiceError(f"Cannot interpret dice string {dice_str}") - dice = Dice(num=int(match.group(1)), faces=int(match.group(2))) + num, faces = int(match.group(1)), int(match.group(2)) + if match.group(3) is None: + modifier = 0 + else: + modifier = int(match.group(3)) + dice = Dice(num, faces, modifier) return dice +def _dice_mean(dice, force_min=True): + """Support function for calculating dice string mean.""" + dmg_min = dice.num + dice.modifier + dmg_max = dice.num*dice.faces + dice.modifier + return (dmg_max - dmg_min)/2.0 + dmg_min def combine_dice(dice_str): """Condense a dice string into its simplest representation. @@ -56,10 +67,20 @@ def combine_dice(dice_str): new_dice_str = " + ".join(new_parts) return new_dice_str - def roll(a, b=None): """roll(20) means roll 1d20, roll(2, 6) means roll 2d6""" if b is None: return random.randint(1, a) else: return sum([random.randint(1, b) for _ in range(a)]) + +def dice_roll_mean(dice_text): + """Takes a dice string like '3d6 +3' and returns its average roll.""" + dice = read_dice_str(dice_text) + return round(_dice_mean(dice)) + +if __name__ == "__main__": + ds = "10d12+10" + v = read_dice_str(ds) + print(v) + print(_dice_mean(v)) \ No newline at end of file diff --git a/dungeonsheets/equipment_reader.py b/dungeonsheets/equipment_reader.py new file mode 100644 index 0000000..9201101 --- /dev/null +++ b/dungeonsheets/equipment_reader.py @@ -0,0 +1,188 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Tue Feb 15 22:41:46 2022 + +@author: mauricio +""" +import warnings +import re +from dungeonsheets.weapons import simple_weapons, martial_weapons, firearms +from dungeonsheets.armor import all_armors + +all_weapons = simple_weapons + martial_weapons + firearms +item_reader = re.compile(r"(\d*)(\s*)(.+)") +gear_weight = {"abacus":2, + "vial of acid":1, + "flask of alchemist's fire":1, + "arrows":1/20, + "arrow":1/20, + "bowgun needles": 1/50, + "crosbow bolts":1.5/20, + "sling bullets":1.5/20, + "antitoxin":0, + "crystal":1, + "orb":3, + "rod":2, + "staff":4, + "wand":1, + "backpack":5, + "ball bearings":2/1000, + "barrel":70, + "basked":2, + "bedroll":7, + "bell":0, + "blanket":3, + "block and tackle":5, + "book":5, + "glass bottle":2, + "bucket":2, + "caltrops":2/20, + "candle":0, + "crosbow bolt case":1, + "scroll case":1, + "map case":1, + "feet of chain":1, + "feet chain":1, + "chalk":0, + "chest":25, + "climber's kit":12, + "common clothes":3, + "costume":4, + "fine clothes":6, + "traveler's clothes":4, + "component pouch":2, + "crowbar": 5, + "sprig of mistletoe":0, + "totem":0, + "wooden staff":4, + "yew wand":1, + "fishing tackle":4, + "flask":1, + "tankard":1, + "grappling hook":4, + "hammer":3, + "knife":1, + "sacrificial knife":1, + "sledge hammer":10, + "healer's kit":3, + "amulet":1, + "emblem":0, + "reliquary":2, + "flask of holy water":1, + "hourglass":1, + "hunting trap":25, + "bottle of ink":0, + "ink pen":0, + "jug":4, + "pitcher":4, + "ladder":25, + "lamp":1, + "bullseye lantern":2, + "hooded lantern":2, + "lock":1, + "magnifying glass":0, + "manacles":6, + "mess kit":1, + "steel mirror":0.5, + "flask of oil":1, + "paper sheet":0, + "parchment":0, + "vial of perfume":0, + "miner's pick":10, + "piton":0.25, + "pitons":0.25, + "vial of poison":0, + "feet pole":7, + "iron pot":10, + "potion of healing":0.5, + "pouch":1, + "quiver":1, + "portable ram":35, + "days of rations":2, + "day of ration":2, + "robes":4, + "feet of hempen rope":10/50, + "feet hempen rope":10/50, + "feet of silk rope":5/50, + "feet silk rope":5/50, + "sack":0.5, + "merchant's scale":3, + "sealing wax":0, + "shovel":5, + "signal whistle":0, + "signet ring":0, + "soap":0, + "spell book":3, + "iron spikes":5/10, + "spyglass":1, + "two-person tent":20, + "tinderbox":1, + "torch":1, + "torches":1, + "vial":0, + "waterskin":5, + "wheatstone":1} + +tools_weight = {"alchemist's supplies":8, + "brewer's supplies":9, + "calligrapher's supplies":5, + "capenter's tools":6, + "cartographer's tools":6, + "cobbler's tools":5, + "cook's utensils":8, + "glassblower's tools":5, + "jeweler's tools":2, + "leatherworker's tools":5, + "mason's tools":8, + "painter's supplies":5, + "potter's tools":3, + "smith's tools":8, + "tinker's tools":10, + "weaver's tools":5, + "woodcarver's tools":5, + "disguise kit":3, + "forgery kit":5, + "dice set":0, + "set of bone dice":0, + "dragonchess set":0.5, + "playing card set":0, + "three-dragon ante set":0, + "herbalism kit":3, + "bagpipes":6, + "drum":3, + "dulcimer":10, + "flute":1, + "lute":2, + "lyre":2, + "horn":2, + "pan flute":2, + "shawm":1, + "viol":1, + "navigator's tools":2, + "poisoner's kit":2, + "thieves' tools":1} +gear_weight.update(tools_weight) +gear_weight.update({armor.name.lower():armor.weight for armor in all_armors}) +gear_weight.update({w.name.lower():w.weight for w in all_weapons}) + +def equipment_weight_parser(equipment, gear_dict={}): + if not equipment.strip(): + return 0 + gear_w = gear_weight.copy() + gear_w.update(gear_dict) + weight = 0 + for gear in equipment.split(','): + gear = gear.lower().strip().strip(".") + q, _, item = item_reader.match(gear).groups() + if q: + q = int(q) + else: + q = 1 + if not(item in gear_w.keys()): + msg = f'{item} not found in gear_weight dictionary, please add.' + warnings.warn(msg) + continue + weight = weight + q*gear_w[item] + return weight + diff --git a/dungeonsheets/make_sheets.py b/dungeonsheets/make_sheets.py index bc789dc..3ebf558 100644 --- a/dungeonsheets/make_sheets.py +++ b/dungeonsheets/make_sheets.py @@ -86,14 +86,20 @@ def create_monsters_content( monsters: Sequence[Union[monsters.Monster, str]], suffix: str, use_dnd_decorations: bool = False, + base_template: str = "monsters_template" ) -> str: # Convert strings to Monster objects - template = jinja_env.get_template(f"monsters_template.{suffix}") + template = jinja_env.get_template(base_template+f".{suffix}") spell_list = [Spell() for monster in monsters for Spell in monster.spells] return template.render(monsters=monsters, use_dnd_decorations=use_dnd_decorations, spell_list=spell_list) +def create_gm_spellbook(spell_list, suffix): + template = jinja_env.get_template(f"gm_spellbook_template.{suffix}") + return template.render(spells=spell_list) + + def create_party_summary_content( party: Sequence[Creature], summary_rst: str, @@ -282,6 +288,12 @@ def make_gm_sheet( monsters_, suffix=content_suffix, use_dnd_decorations=fancy_decorations ) ) + + # Add the GM Spellbook + spells = [Spell() for monster in monsters_ for Spell in monster.spells] + spells = set(spells) + content.append(create_gm_spellbook(spells, content_suffix)) + # Add the random tables tables = [ find_content(s, valid_classes=[random_tables.RandomTable]) @@ -414,6 +426,13 @@ def make_character_content( content.append( create_druid_shapes_content(character, content_suffix=content_format, use_dnd_decorations=fancy_decorations) ) + + # Create a list of companions + if len(getattr(character, "companions", [])) > 0: + content.append( + create_monsters_content(character.companions, suffix=content_format, + use_dnd_decorations=fancy_decorations, base_template="companions_template") + ) # Postamble, empty for HTML content.append( jinja_env.get_template(f"postamble.{content_format}").render( @@ -479,8 +498,8 @@ def make_character_sheet( character_props = readers.read_sheet_file(char_file) character = _char.Character.load(character_props) # Load image file if present - portrait_file="" - if character.portrait: + portrait_file = character.portrait + if portrait_file is True: portrait_file=char_file.stem + ".jpeg" # Set the fields in the FDF basename = char_file.stem diff --git a/dungeonsheets/stats.py b/dungeonsheets/stats.py index c610916..2d8e960 100644 --- a/dungeonsheets/stats.py +++ b/dungeonsheets/stats.py @@ -1,9 +1,11 @@ +import re import math from collections import namedtuple from math import ceil import logging from dungeonsheets.armor import HeavyArmor, NoArmor, NoShield +from dungeonsheets.dice import dice_roll_mean from dungeonsheets.features import ( AmbushMaster, Defense, @@ -28,7 +30,14 @@ from dungeonsheets.features import ( log = logging.getLogger(__name__) - +skill_text_locator = re.compile(r"\S+ [+-]\d+") +attack_text_locator = re.compile(r"attack:.*?damage", re.IGNORECASE|re.DOTALL) +attack = re.compile(r"attack:.*?to hit", re.IGNORECASE|re.DOTALL) +damage = re.compile(r"hit:.*?(\d+)d(\d+).*?damage", re.IGNORECASE|re.DOTALL) +damage_avg = re.compile(r"hit:.*?(\d+)", re.IGNORECASE|re.DOTALL) +damage_nodice = re.compile(r"hit:.*?damage", re.IGNORECASE|re.DOTALL) +modifier = re.compile(r"[+-].*?(\d+)", re.IGNORECASE|re.DOTALL) +single_damage = re.compile(r"(\d+)") def mod_str(modifier): """Converts a modifier to a string, eg 2 -> '+2'.""" @@ -325,3 +334,52 @@ class Initiative(NumericalInitiative): if has_advantage: ini += "(A)" return ini + +def _add_modifier(att_text, prof): + """Auxiliary function to add proficiency bonus prof + to att_text.""" + _att_bonus_re = modifier.search(att_text) + att_bonus_text = _att_bonus_re.group() + att_bonus = int(att_bonus_text.replace(" ", "").replace("\n", "")) + prof + return re.sub(modifier, "{:+d}".format(att_bonus), att_text) + +def skill_modifier(skills_text, prof): + """Modifies the skill text string adding the proficiency + bonus to its values.""" + skills_updated = [] + skill_list = re.findall(skill_text_locator, skills_text) + if not skill_list: + return "" + for sk in skill_list: + increased_skill = _add_modifier(sk, prof) + skills_updated.append(increased_skill) + return ", ".join(skills_updated) + +def att_dmg_modifier(text, prof): + """Modify the attack and damage rolls for a strip + of attack text description.""" + _att_re = attack.search(text) + if not _att_re: + raise ValueError("No attack info detected.") + att_text = _att_re.group() + new_att_text = _add_modifier(att_text, prof) + text = re.sub(attack, new_att_text, text) + _dmg_re = damage.search(text) + if _dmg_re: + dmg_text = _dmg_re.group() + new_dmg_text = _add_modifier(dmg_text, prof) + dmg_avg_value = dice_roll_mean(new_dmg_text) + _dmg_avg_re = damage_avg.search(new_dmg_text) + dmg_avg_text = _dmg_avg_re.group() + new_dmg_avg_text = re.sub("(\d+)", "{:d}".format(dmg_avg_value), + dmg_avg_text, 1) + new_dmg_text = re.sub(damage_avg, new_dmg_avg_text, new_dmg_text) + text = re.sub(damage, new_dmg_text, text) + else: + _dmg_re = damage_nodice.search(text) + dmg_text = _dmg_re.group() + _sdamage_re = single_damage.search(dmg_text) + sdamage = int(_sdamage_re.group()) + prof + new_dmg_text = re.sub(single_damage, "{:d}".format(sdamage), dmg_text) + text = re.sub(single_damage, new_dmg_text, text) + return text From 53c0f42622c651e25d6f69c493456a3870579df0 Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Sat, 19 Mar 2022 12:32:25 -0300 Subject: [PATCH 02/22] Included ranger_beast setter --- dungeonsheets/classes/ranger.py | 49 +++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/dungeonsheets/classes/ranger.py b/dungeonsheets/classes/ranger.py index 41756bc..dc68510 100644 --- a/dungeonsheets/classes/ranger.py +++ b/dungeonsheets/classes/ranger.py @@ -1,10 +1,16 @@ __all__ = ("Ranger", "RevisedRanger") +import re +import warnings from collections import defaultdict from dungeonsheets import features, spells, weapons from dungeonsheets.classes.classes import CharClass, SubClass - +from dungeonsheets.stats import ( + attack_text_locator, + att_dmg_modifier, + skill_modifier, +) # PHB class Hunter(SubClass): @@ -173,6 +179,7 @@ class MonsterSlayer(SubClass): class Ranger(CharClass): name = "Ranger" hit_dice_faces = 10 + _beast = None saving_throw_proficiencies = ("strength", "dexterity") primary_abilities = ("dexterity", "wisdom") _proficiencies_text = ( @@ -245,7 +252,45 @@ class Ranger(CharClass): 20: (0, 4, 3, 3, 3, 2, 0, 0, 0, 0), } - + @property + def ranger_beast(self): + return self._beast + + @ranger_beast.setter + def ranger_beast(self, beast_tuple): + """Takes a tuple (monster, proficiency) to setup a + companion with adjusted stats.""" + beast, prof_bonus = beast_tuple + desc_split = beast.description.split() + size = desc_split[0] + size_condition = size.lower() in ['tiny', 'small', 'medium'] + cr_condition = beast.challenge_rating <= .25 + if beast.is_beast and size_condition and cr_condition: + companion = beast + description, actions = beast.__doc__.split("# Actions") + if actions: + attacks_list = re.findall(attack_text_locator, actions) + start = 0 + new_actions = "" + for att_text in attacks_list: + new_att_text = att_dmg_modifier(att_text, prof_bonus) + position = actions.find(att_text, start) + action_change = actions[start:position] + new_att_text + start = position + len(att_text) + new_actions = new_actions + action_change + companion.__doc__ = description + "# Actions" + new_actions + companion.armor_class = beast.armor_class + prof_bonus + companion.skills = skill_modifier(beast.skills, prof_bonus) + companion.saving_throws = skill_modifier(beast.saving_throws, + prof_bonus) + companion.hp_max = max(beast.hp_max, 4*self.level) + self._beast = companion + else: + msg = ( + f"{beast.name} does not satisfy criteria to be Ranger's Companion." + ) + warnings.warn(msg) + # Revised Ranger class BeastConclave(SubClass): """Many rangers are more at home in the wilds than in civilization, to the From 0b513318c5738fbdf349e889c84abf2854ebf15e Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Sat, 19 Mar 2022 12:34:34 -0300 Subject: [PATCH 03/22] Included gm_spellbook and small changes to MSavage --- MSavage_template.tex | 205 +++++++++++++++++++++++++++++++++++++ companions_template.html | 91 ++++++++++++++++ companions_template.tex | 100 ++++++++++++++++++ gm_spellbook_template.html | 9 ++ gm_spellbook_template.tex | 41 ++++++++ 5 files changed, 446 insertions(+) create mode 100644 MSavage_template.tex create mode 100644 companions_template.html create mode 100644 companions_template.tex create mode 100644 gm_spellbook_template.html create mode 100644 gm_spellbook_template.tex diff --git a/MSavage_template.tex b/MSavage_template.tex new file mode 100644 index 0000000..f18ec3d --- /dev/null +++ b/MSavage_template.tex @@ -0,0 +1,205 @@ +\documentclass[letterpaper,openany,oneside,twocolumn]{book} + +\usepackage{fontspec} +\usepackage[justified]{dnd} +\usepackage{ifthen} +\usepackage{pstricks} + +\usepackage[UKenglish]{babel} + +\usepackage{dndtemplate} + +\setlength\oddsidemargin{\dimexpr(\paperwidth-\textwidth)/2 - 1in\relax} +\setlength\evensidemargin{\oddsidemargin} + +% Headline +\CharacterName{[[ char.name ]]} + +% adds only main class and total level to prevent overflow +\Class{[[ char.primary_class.name ]] [[ char.level ]]} +\Background{[[ char.background ]]} +\PlayerName{[[ char.player_name ]]} +\Race{[[ char.race ]]} +\Alignment{[[ char.alignment ]]} +\XP{[[ char.xp ]]} + +% Ability scores +\StrengthScore{[[ char.strength.value ]]} +\DexterityScore{[[ char.dexterity.value ]]} +\ConstitutionScore{[[ char.constitution.value ]]} +\IntelligenceScore{[[ char.intelligence.value ]]} +\WisdomScore{[[ char.wisdom.value ]]} +\CharismaScore{[[ char.charisma.value ]]} + +% Ability modifiers +\StrengthModifier{[[ "{:+d}".format(char.strength.modifier) ]]} +\DexterityModifier{[[ "{:+d}".format(char.dexterity.modifier) ]]} +\ConstitutionModifier{[[ "{:+d}".format(char.constitution.modifier) ]]} +\IntelligenceModifier{[[ "{:+d}".format(char.intelligence.modifier) ]]} +\WisdomModifier{[[ "{:+d}".format(char.wisdom.modifier) ]]} +\CharismaModifier{[[ "{:+d}".format(char.charisma.modifier) ]]} + +% Saving Throws +\StrengthSavingThrowModifier{[[ "{:+d}".format(char.strength.saving_throw) ]]} +\DexteritySavingThrowModifier{[[ "{:+d}".format(char.dexterity.saving_throw) ]]} +\ConstitutionSavingThrowModifier{[[ "{:+d}".format(char.constitution.saving_throw) ]]} +\IntelligenceSavingThrowModifier{[[ "{:+d}".format(char.intelligence.saving_throw) ]]} +\WisdomSavingThrowModifier{[[ "{:+d}".format(char.wisdom.saving_throw) ]]} +\CharismaSavingThrowModifier{[[ "{:+d}".format(char.charisma.saving_throw) ]]} + +\AcrobaticsSkillModifier{[[ "{:+d}".format(char.acrobatics.modifier) ]]} +\AnimalHandlingSkillModifier{[["{:+d}".format(char.animal_handling.modifier) ]]} +\ArcanaSkillModifier{[[ "{:+d}".format(char.arcana.modifier) ]]} +\AthleticsSkillModifier{[[ "{:+d}".format(char.athletics.modifier) ]]} +\DeceptionSkillModifier{[[ "{:+d}".format(char.deception.modifier) ]]} +\HistorySkillModifier{[[ "{:+d}".format(char.history.modifier) ]]} +\InsightSkillModifier{[[ "{:+d}".format(char.insight.modifier) ]]} +\IntimidationSkillModifier{[[ "{:+d}".format(char.intimidation.modifier) ]]} +\InvestigationSkillModifier{[[ "{:+d}".format(char.investigation.modifier) ]]} +\MedicineSkillModifier{[[ "{:+d}".format(char.medicine.modifier) ]]} +\NatureSkillModifier{[[ "{:+d}".format(char.nature.modifier) ]]} +\PerceptionSkillModifier{[[ "{:+d}".format(char.perception.modifier) ]]} +\PerformanceSkillModifier{[[ "{:+d}".format(char.performance.modifier) ]]} +\PersuasionSkillModifier{[[ "{:+d}".format(char.persuasion.modifier) ]]} +\ReligionSkillModifier{[[ "{:+d}".format(char.religion.modifier) ]]} +\SleightOfHandSkillModifier{[[ "{:+d}".format(char.sleight_of_hand.modifier) ]]} +\StealthSkillModifier{[[ "{:+d}".format(char.stealth.modifier) ]]} +\SurvivalSkillModifier{[[ "{:+d}".format(char.survival.modifier) ]]} + +% Prociciencies +\StrengthProficiency{[[ "strength" in char.saving_throw_proficiencies ]]} +\DexterityProficiency{[[ "dexterity" in char.saving_throw_proficiencies ]]} +\ConstitutionProficiency{[[ "constitution" in char.saving_throw_proficiencies ]]} +\IntelligenceProficiency{[[ "intelligence" in char.saving_throw_proficiencies ]]} +\WisdomProficiency{[[ "wisdom" in char.saving_throw_proficiencies ]]} +\CharismaProficiency{[[ "charisma" in char.saving_throw_proficiencies ]]} + +\AcrobaticsProficiency{[[ "acrobatics" in char.skill_proficiencies ]]} +\AnimalHandlingProficiency{[[ "animal_handling" in char.skill_proficiencies ]]} +\ArcanaProficiency{[[ "arcana" in char.skill_proficiencies ]]} +\AthleticsProficiency{[[ "athletics" in char.skill_proficiencies ]]} +\DeceptionProficiency{[[ "deception" in char.skill_proficiencies ]]} +\HistoryProficiency{[[ "history" in char.skill_proficiencies ]]} +\InsightProficiency{[[ "insight" in char.skill_proficiencies ]]} +\IntimidationProficiency{[[ "intimidation" in char.skill_proficiencies ]]} +\InvestigationProficiency{[[ "investigation" in char.skill_proficiencies ]]} +\MedicineProficiency{[[ "medicine" in char.skill_proficiencies ]]} +\NatureProficiency{[[ "nature" in char.skill_proficiencies ]]} +\PerceptionProficiency{[[ "perception" in char.skill_proficiencies ]]} +\PerformanceProficiency{[[ "performance" in char.skill_proficiencies ]]} +\PersuasionProficiency{[[ "persuasion" in char.skill_proficiencies ]]} +\ReligionProficiency{[[ "religion" in char.skill_proficiencies ]]} +\SleightOfHandProficiency{[[ "sleight_of_hand" in char.skill_proficiencies ]]} +\StealthProficiency{[[ "stealth" in char.skill_proficiencies ]]} +\SurvivalProficiency{[[ "survival" in char.skill_proficiencies ]]} + +\Inspiration{[% if char.inspiration %] $\star$ [% endif %]} +\Proficiency{[[ "{:+d}".format(char.proficiency_bonus) ]]} +\Perception{[[ 10 + char.perception.modifier ]]} + +\ArmorClass{[[ char.armor_class ]]} +\Initiative{[[ char.initiative ]]} +\Speed{[[ char.speed ]]} +\MaxHitPoints{[[ char.hp_max ]]} +[% if char.hp_current %]\CurrentHitPoints{[[ char.hp_current ]]}[% endif %] +[% if char.hp_temp %]\TemporaryHitPoints{[[ char.hp_temp ]]}[% endif %] +\MaxHitDice{[[ char.hit_dice.replace(" ","") ]]} +\CurrentHitDice{[[ char.hit_dice_current.replace(" ", "") ]]} + +\CP{[% if char.cp > 0 %][[ char.cp ]][% endif %]} +\SP{[% if char.sp > 0 %][[ char.sp ]][% endif %]} +\GP{[% if char.ep > 0 %][[ char.ep ]][% endif %]} +\EP{[% if char.gp > 0 %][[ char.gp ]][% endif %]} +\PP{[% if char.pp > 0 %][[ char.pp ]][% endif %]} + +[% for w in char.weapons %] +\AddWeapon{[[ w.name ]]}{[[ "{:+d}".format(w.attack_modifier) ]]}{[[ "{}/{}".format(w.damage, w.damage_type) ]]} +[% endfor %] + +\AttacksAdditional{ +[% if char.armor %]\textbf{Armor}: [[ char.armor ]] \\ [% endif %] +[% if char.shield %]\textbf{Shield}: [[ char.shield ]] \\ [% endif %] +[[- char.attacks_and_spellcasting| boxed -]] +} + +\OtherProficienciesLanguages{ +\textbf{Languages:} [[ char.languages ]] \\ +[%- for prof_type, values in char.proficiencies_by_type.items() %] +\textbf{[[ prof_type ]]}: [[ values ]] \\ +[%- endfor -%] +} + +\Equipment{[[ char.equipment_text| boxed ]]} + +\PersonalityTraits{ +[[ char.personality_traits ]] +} + +\Ideals{ +[[ char.ideals ]] +} + +\Bonds{ +[[ char.bonds ]] +} + +\Flaws{ +[[ char.flaws ]] +} + +\FeaturesTraits{ +[[ char.features_summary| boxed ]] +} + + +% Appearance + +\Age{[[ char.age ]]} +\Height{[[ char.height ]]} +\Weight{[[ char.weight ]]} +\Eyes{[[ char.eyes ]]} +\Skin{[[ char.skin ]]} +\Hair{[[ char.hair ]]} + +% background + +\CharacterAppearance{[[ portrait ]] +[[ char.appearance_text ]] +} +\AdditionalFeaturesAndTraits{ +[[ char.additional_description ]] +} +\Characterbackground{ +[[ char.backstory ]] +} +\Treasure{ +[[ char.treasure ]] +} +\AlliesAndOrganizations{ +[[ char.allies ]] +} +\OrganizationName{[[ char.org_name ]]} + +[% if char.is_spellcaster %] +%Magic +[[ char | spellsheetparser ]] +[% endif %] + + +\begin{document} +\newgeometry{left=0cm,right=0cm,top=0cm,bottom=0cm} +\onecolumn + + +% CHARACTER PAGE +\rendercharactersheet + +% BACKSTORY PAGE +\renderbackgroundsheet + +[% if char.is_spellcaster %] +% SPELLCASTING PAGE +\renderspellsheet +[% endif %] + +\end{document} \ No newline at end of file diff --git a/companions_template.html b/companions_template.html new file mode 100644 index 0000000..8a2df39 --- /dev/null +++ b/companions_template.html @@ -0,0 +1,91 @@ +

Companions

+ +[% for monster in monsters|sort(attribute='name') %] +
+

[[ monster.name ]]

+ + [% if monster.description %] +

[[ monster.description ]]

+ [% endif %] + + + + + + + + + + + + + +
Armor ClassHit PointsSpeed
[[ monster.armor_class ]][[ monster.hp_max ]] ([[ monster.hit_dice ]])[[ monster.speed ]][% if monster.swim_speed %], + [[ monster.swim_speed ]] swim[% endif %][% if monster.fly_speed %], + [[ monster.fly_speed ]] fly[% endif %][% if monster.burrow_speed %], + [[ monster.burrow_speed ]] burrow[% endif %]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
STRDEXCONINTWISCHA
[[ monster.strength.value ]][[ monster.dexterity.value ]][[ monster.constitution.value ]][[ monster.intelligence.value ]][[ monster.wisdom.value ]][[ monster.charisma.value ]]
([[ monster.strength.modifier|mod_str ]])([[ monster.dexterity.modifier|mod_str ]])([[ monster.constitution.modifier|mod_str ]])([[ monster.intelligence.modifier|mod_str ]])([[ monster.wisdom.modifier|mod_str ]])([[ monster.charisma.modifier|mod_str ]])
+ +
+ [% if monster.skills != "" %]
Skills
[[ monster.skills ]]
[% endif %] +
Senses
[% if monster.senses != "" %][[ monster.senses ]][% else %]--[% endif %]
+
Languages
[% if monster.languages != "" %][[ monster.languages ]][% else %]--[% endif %]
+ [% if monster.damage_resistances != "" %]
Damage Resistances
[[ monster.damage_resistances ]]
[% endif %] + [% if monster.damage_immunities != "" %]
Damage Immunities
[[ monster.damage_immunities ]]
[% endif %] + [% if monster.damage_vulnerabilities != "" %]
Damage Vulnerabilities
[[ monster.damage_vulnerabilities ]]
[% endif %] + [% if monster.condition_immunities != "" %]
Condition Immunuties
[[ monster.condition_immunities ]]
[% endif %] + [% if monster.saving_throws != "" %]
Saving Throws
[[ monster.saving_throws ]]
[% endif %] +
Challenge
[[ monster.challenge_rating ]] ([[ monster.challenge_rating | challenge_rating_to_xp ]] XP)
+
+ + [% if monster.spells | length > 0 %] +
+ [% for level, spells in monster.spells | groupby('level') %] +
[% if level == 0 %]Cantrips[% else %]Level [[ level ]][% endif %]
+
+ [% for spell in spells %][% if not loop.first %], [% endif %] + [[ spell.name ]][% endfor %] +
+ [% endfor %] +
+ [% endif %] + + [[ monster.__doc__ | rst_to_html(top_heading_level=2) ]] + +
+[% endfor %] + +

Monster Spells

+ +[% from "spellblock.html" import spellblock %] + +[% for spell in spell_list | sort(attribute="name") %] +[[ spellblock(spell, id_base="monster-spells") ]] +[% endfor %] diff --git a/companions_template.tex b/companions_template.tex new file mode 100644 index 0000000..2063651 --- /dev/null +++ b/companions_template.tex @@ -0,0 +1,100 @@ +\pdfbookmark[0]{Companions}{Companions} +\section*{Companions} + +[% if use_dnd_decorations %] + [% for monster in monsters|sort(attribute='name') %] + \pdfbookmark[1]{[[ monster.name ]]}{Companions - [[ monster.name ]]} + \begin{DndMonster}{[[ monster.name ]]} + \DndMonsterType{[[ monster.description ]]} + + % If you want to use commas in the key values, enclose the values in braces. + \DndMonsterBasics[ + armor-class = {[[ monster.armor_class ]]}, + hit-points = {[[ monster.hp_max ]] ([[ monster.hit_dice ]])}, + speed = {[[ monster.speed ]] ft.[% if monster.swim_speed %], [[ monster.swim_speed ]] ft. swim[% endif %][% if monster.fly_speed %], [[ monster.fly_speed ]] ft. fly[% endif %][% if monster.burrow_speed %], [[ monster.burrow_speed ]] ft. burrow[% endif %]}, + ] + + \DndMonsterAbilityScores[ + str = [[ monster.strength.value ]], + dex = [[ monster.dexterity.value ]], + con = [[ monster.constitution.value ]], + int = [[ monster.intelligence.value ]], + wis = [[ monster.wisdom.value ]], + cha = [[ monster.charisma.value ]], + ] + + \DndMonsterDetails[ + saving-throws = {[[ monster.saving_throws ]]}, + skills = {[[ monster.skills ]]}, + damage-vulnerabilities = {[[ monster.damage_vulnerabilities ]]}, + damage-resistances = {[[ monster.damage_resistances ]]}, + damage-immunities = {[[ monster.damage_immunities ]]}, + condition-immunities = {[[ monster.condition_immunities ]]}, + senses = {[[ monster.senses ]]}, + languages = {[% if monster.languages %][[ monster.languages ]][% else %] --- [% endif %]}, + challenge = {[[ monster.challenge_rating ]] ([[ monster.challenge_rating | challenge_rating_to_xp ]] XP)}, + ] + %\DndMonsterSection{Actions} + [[ monster.__doc__ | rst_to_latex(top_heading_level=2) ]] + \end{DndMonster} + [% endfor %] + +[% else %] + [% for monster in monsters|sort(attribute='name') %] + { + \pdfbookmark[1]{[[ monster.name ]]}{Companions - [[ monster.name ]]} + \section*{[[ monster.name ]]} + [% if monster.description %] + \subsection*{[[ monster.description ]]} + [% endif %] + + \begin{tabular}{c c c} + Armor Class & Hit Points & Speed \\ + \hline + [[ monster.armor_class ]] & + [[ monster.hp_max ]] ([[ monster.hit_dice ]]) & + [[ monster.speed ]] \\ + [% if monster.swim_speed %] + & & [[ monster.swim_speed ]] swim \\ + [% endif %] + [% if monster.fly_speed %] + & & [[ monster.fly_speed ]] fly \\ + [% endif %] + [% if monster.burrow_speed %] + & & [[ monster.burrow_speed ]] burrow \\ + [% endif %] + \end{tabular} + + \vspace{0.2cm} + + \begin{tabular}{c c c c c c} + STR & DEX & CON & INT & WIS & CHA \\ + \hline + [[ monster.strength.value ]] & [[ monster.dexterity.value ]] & [[ monster.constitution.value ]] & + [[ monster.intelligence.value ]] & [[ monster.wisdom.value ]] & [[ monster.charisma.value ]] \\ + ([[ monster.strength.modifier|mod_str ]]) & ([[ monster.dexterity.modifier|mod_str ]]) & + ([[ monster.constitution.modifier|mod_str ]]) & ([[ monster.intelligence.modifier|mod_str ]]) & + ([[ monster.wisdom.modifier|mod_str ]]) & ([[ monster.charisma.modifier|mod_str ]]) \\ + \end{tabular} + + \vspace{0.2cm} + + \begin{description} + [% if monster.skills != "" %]\item [Skills:] [[ monster.skills ]][% endif %] + \item [Senses:] [% if monster.senses != "" %][[ monster.senses ]][% else %]--[% endif %] + \item [Languages:] [% if monster.languages != "" %][[ monster.languages ]][% else %]--[% endif %] + [% if monster.damage_resistances != "" %]\item [Damage Resistances:] [[ monster.damage_resistances ]][% endif %] + [% if monster.damage_immunities != "" %]\item [Damage Immunities:] [[ monster.damage_immunities ]][% endif %] + [% if monster.damage_vulnerabilities != "" %]\item [Damage Vulnerabilities:] [[ monster.damage_vulnerabilities ]][% endif %] + [% if monster.condition_immunities != "" %]\item [Condition Immunuties:] [[ monster.condition_immunities ]][% endif %] + [% if monster.saving_throws != "" %]\item [Saving Throws:] [[ monster.saving_throws ]][% endif %] + \item [Challenge:] [[ monster.challenge_rating ]] ([[ monster.challenge_rating | challenge_rating_to_xp ]] XP) + \end{description} + + \vspace{0.2cm} + + [[ monster.__doc__ | rst_to_latex(top_heading_level=2) ]] + + } %\color + [% endfor %] +[% endif %] diff --git a/gm_spellbook_template.html b/gm_spellbook_template.html new file mode 100644 index 0000000..ba7020c --- /dev/null +++ b/gm_spellbook_template.html @@ -0,0 +1,9 @@ +

Spells

+ + +[% from "spellblock.html" import spellblock %] +[% for spl in spells %] + +[[ spellblock(spl, id_base="spells") ]] + +[% endfor %] diff --git a/gm_spellbook_template.tex b/gm_spellbook_template.tex new file mode 100644 index 0000000..e0cf40c --- /dev/null +++ b/gm_spellbook_template.tex @@ -0,0 +1,41 @@ +\pdfbookmark[0]{Spells}{Spells} +\section*{Spells} + +[% for spl in spells %] + \pdfbookmark[1]{[[ spl.name ]]}{Spells - [[ spl.name ]]} + [% if use_dnd_decorations %] + \DndSpellHeader + {[[ spl.name ]]} + {[% if spl.level > 0 %][[ ordinals[spl.level] ]]-level [[ spl.magic_school ]][% else %][[ spl.magic_school ]] Cantrip[% endif %] [% if spl.ritual %](\textit{ritual})[% endif %]} + {[[ spl.casting_time ]]} + {[[ spl.casting_range ]]} + {[[ spl.component_string ]]} + {[[ spl.duration ]]} + [% else %] + \section*{[[ spl.name ]]} + [% if spl.level > 0 %] % + \textit{[[ spl.magic_school ]] Level [[ spl.level ]]} % + [% else %] % + \textit{[[ spl.magic_school ]] Cantrip} % + [% endif %] % + [% if spl.ritual and spl.concentration %]% + (\textit{ritual}, \textit{concentration})% + [% elif spl.ritual %]% + (\textit{ritual})% + [% elif spl.concentration %]% + (\textit{concentration})% + [% endif %]% + %% \noindent + \begin{description} + \setlength{\itemsep}{\zerosep}% + \setlength{\parskip}{0pt}% + \item [Casting Time:] [[ spl.casting_time ]] \\ + \item [Duration:] [[ spl.duration ]] \\ + \item [Range:] [[ spl.casting_range ]] \\ + \item [Components:] [[ spl.component_string ]] + \end{description} + % \vspace{\zerosep} + [% endif %] + [[ spl.__doc__ | rst_to_latex(top_heading_level=1) ]] + +[% endfor %] From 9d9808b7e0362555178f01ae6a0d42cd3f732f11 Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Sat, 19 Mar 2022 12:35:11 -0300 Subject: [PATCH 04/22] Delete companions_template.html --- companions_template.html | 91 ---------------------------------------- 1 file changed, 91 deletions(-) delete mode 100644 companions_template.html diff --git a/companions_template.html b/companions_template.html deleted file mode 100644 index 8a2df39..0000000 --- a/companions_template.html +++ /dev/null @@ -1,91 +0,0 @@ -

Companions

- -[% for monster in monsters|sort(attribute='name') %] -
-

[[ monster.name ]]

- - [% if monster.description %] -

[[ monster.description ]]

- [% endif %] - - - - - - - - - - - - - -
Armor ClassHit PointsSpeed
[[ monster.armor_class ]][[ monster.hp_max ]] ([[ monster.hit_dice ]])[[ monster.speed ]][% if monster.swim_speed %], - [[ monster.swim_speed ]] swim[% endif %][% if monster.fly_speed %], - [[ monster.fly_speed ]] fly[% endif %][% if monster.burrow_speed %], - [[ monster.burrow_speed ]] burrow[% endif %]
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
STRDEXCONINTWISCHA
[[ monster.strength.value ]][[ monster.dexterity.value ]][[ monster.constitution.value ]][[ monster.intelligence.value ]][[ monster.wisdom.value ]][[ monster.charisma.value ]]
([[ monster.strength.modifier|mod_str ]])([[ monster.dexterity.modifier|mod_str ]])([[ monster.constitution.modifier|mod_str ]])([[ monster.intelligence.modifier|mod_str ]])([[ monster.wisdom.modifier|mod_str ]])([[ monster.charisma.modifier|mod_str ]])
- -
- [% if monster.skills != "" %]
Skills
[[ monster.skills ]]
[% endif %] -
Senses
[% if monster.senses != "" %][[ monster.senses ]][% else %]--[% endif %]
-
Languages
[% if monster.languages != "" %][[ monster.languages ]][% else %]--[% endif %]
- [% if monster.damage_resistances != "" %]
Damage Resistances
[[ monster.damage_resistances ]]
[% endif %] - [% if monster.damage_immunities != "" %]
Damage Immunities
[[ monster.damage_immunities ]]
[% endif %] - [% if monster.damage_vulnerabilities != "" %]
Damage Vulnerabilities
[[ monster.damage_vulnerabilities ]]
[% endif %] - [% if monster.condition_immunities != "" %]
Condition Immunuties
[[ monster.condition_immunities ]]
[% endif %] - [% if monster.saving_throws != "" %]
Saving Throws
[[ monster.saving_throws ]]
[% endif %] -
Challenge
[[ monster.challenge_rating ]] ([[ monster.challenge_rating | challenge_rating_to_xp ]] XP)
-
- - [% if monster.spells | length > 0 %] -
- [% for level, spells in monster.spells | groupby('level') %] -
[% if level == 0 %]Cantrips[% else %]Level [[ level ]][% endif %]
-
- [% for spell in spells %][% if not loop.first %], [% endif %] - [[ spell.name ]][% endfor %] -
- [% endfor %] -
- [% endif %] - - [[ monster.__doc__ | rst_to_html(top_heading_level=2) ]] - -
-[% endfor %] - -

Monster Spells

- -[% from "spellblock.html" import spellblock %] - -[% for spell in spell_list | sort(attribute="name") %] -[[ spellblock(spell, id_base="monster-spells") ]] -[% endfor %] From 9aa1f7e00404665e399a27dd6bc12212b8c5b32b Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Sat, 19 Mar 2022 12:35:36 -0300 Subject: [PATCH 05/22] Delete companions_template.tex --- companions_template.tex | 100 ---------------------------------------- 1 file changed, 100 deletions(-) delete mode 100644 companions_template.tex diff --git a/companions_template.tex b/companions_template.tex deleted file mode 100644 index 2063651..0000000 --- a/companions_template.tex +++ /dev/null @@ -1,100 +0,0 @@ -\pdfbookmark[0]{Companions}{Companions} -\section*{Companions} - -[% if use_dnd_decorations %] - [% for monster in monsters|sort(attribute='name') %] - \pdfbookmark[1]{[[ monster.name ]]}{Companions - [[ monster.name ]]} - \begin{DndMonster}{[[ monster.name ]]} - \DndMonsterType{[[ monster.description ]]} - - % If you want to use commas in the key values, enclose the values in braces. - \DndMonsterBasics[ - armor-class = {[[ monster.armor_class ]]}, - hit-points = {[[ monster.hp_max ]] ([[ monster.hit_dice ]])}, - speed = {[[ monster.speed ]] ft.[% if monster.swim_speed %], [[ monster.swim_speed ]] ft. swim[% endif %][% if monster.fly_speed %], [[ monster.fly_speed ]] ft. fly[% endif %][% if monster.burrow_speed %], [[ monster.burrow_speed ]] ft. burrow[% endif %]}, - ] - - \DndMonsterAbilityScores[ - str = [[ monster.strength.value ]], - dex = [[ monster.dexterity.value ]], - con = [[ monster.constitution.value ]], - int = [[ monster.intelligence.value ]], - wis = [[ monster.wisdom.value ]], - cha = [[ monster.charisma.value ]], - ] - - \DndMonsterDetails[ - saving-throws = {[[ monster.saving_throws ]]}, - skills = {[[ monster.skills ]]}, - damage-vulnerabilities = {[[ monster.damage_vulnerabilities ]]}, - damage-resistances = {[[ monster.damage_resistances ]]}, - damage-immunities = {[[ monster.damage_immunities ]]}, - condition-immunities = {[[ monster.condition_immunities ]]}, - senses = {[[ monster.senses ]]}, - languages = {[% if monster.languages %][[ monster.languages ]][% else %] --- [% endif %]}, - challenge = {[[ monster.challenge_rating ]] ([[ monster.challenge_rating | challenge_rating_to_xp ]] XP)}, - ] - %\DndMonsterSection{Actions} - [[ monster.__doc__ | rst_to_latex(top_heading_level=2) ]] - \end{DndMonster} - [% endfor %] - -[% else %] - [% for monster in monsters|sort(attribute='name') %] - { - \pdfbookmark[1]{[[ monster.name ]]}{Companions - [[ monster.name ]]} - \section*{[[ monster.name ]]} - [% if monster.description %] - \subsection*{[[ monster.description ]]} - [% endif %] - - \begin{tabular}{c c c} - Armor Class & Hit Points & Speed \\ - \hline - [[ monster.armor_class ]] & - [[ monster.hp_max ]] ([[ monster.hit_dice ]]) & - [[ monster.speed ]] \\ - [% if monster.swim_speed %] - & & [[ monster.swim_speed ]] swim \\ - [% endif %] - [% if monster.fly_speed %] - & & [[ monster.fly_speed ]] fly \\ - [% endif %] - [% if monster.burrow_speed %] - & & [[ monster.burrow_speed ]] burrow \\ - [% endif %] - \end{tabular} - - \vspace{0.2cm} - - \begin{tabular}{c c c c c c} - STR & DEX & CON & INT & WIS & CHA \\ - \hline - [[ monster.strength.value ]] & [[ monster.dexterity.value ]] & [[ monster.constitution.value ]] & - [[ monster.intelligence.value ]] & [[ monster.wisdom.value ]] & [[ monster.charisma.value ]] \\ - ([[ monster.strength.modifier|mod_str ]]) & ([[ monster.dexterity.modifier|mod_str ]]) & - ([[ monster.constitution.modifier|mod_str ]]) & ([[ monster.intelligence.modifier|mod_str ]]) & - ([[ monster.wisdom.modifier|mod_str ]]) & ([[ monster.charisma.modifier|mod_str ]]) \\ - \end{tabular} - - \vspace{0.2cm} - - \begin{description} - [% if monster.skills != "" %]\item [Skills:] [[ monster.skills ]][% endif %] - \item [Senses:] [% if monster.senses != "" %][[ monster.senses ]][% else %]--[% endif %] - \item [Languages:] [% if monster.languages != "" %][[ monster.languages ]][% else %]--[% endif %] - [% if monster.damage_resistances != "" %]\item [Damage Resistances:] [[ monster.damage_resistances ]][% endif %] - [% if monster.damage_immunities != "" %]\item [Damage Immunities:] [[ monster.damage_immunities ]][% endif %] - [% if monster.damage_vulnerabilities != "" %]\item [Damage Vulnerabilities:] [[ monster.damage_vulnerabilities ]][% endif %] - [% if monster.condition_immunities != "" %]\item [Condition Immunuties:] [[ monster.condition_immunities ]][% endif %] - [% if monster.saving_throws != "" %]\item [Saving Throws:] [[ monster.saving_throws ]][% endif %] - \item [Challenge:] [[ monster.challenge_rating ]] ([[ monster.challenge_rating | challenge_rating_to_xp ]] XP) - \end{description} - - \vspace{0.2cm} - - [[ monster.__doc__ | rst_to_latex(top_heading_level=2) ]] - - } %\color - [% endfor %] -[% endif %] From 9854a891d522e14bb380f2a33d10bd8f99b4c542 Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Sat, 19 Mar 2022 12:35:45 -0300 Subject: [PATCH 06/22] Delete gm_spellbook_template.html --- gm_spellbook_template.html | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 gm_spellbook_template.html diff --git a/gm_spellbook_template.html b/gm_spellbook_template.html deleted file mode 100644 index ba7020c..0000000 --- a/gm_spellbook_template.html +++ /dev/null @@ -1,9 +0,0 @@ -

Spells

- - -[% from "spellblock.html" import spellblock %] -[% for spl in spells %] - -[[ spellblock(spl, id_base="spells") ]] - -[% endfor %] From fb0f66aa105a95f2f27ccf0b19f673d320e8ba10 Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Sat, 19 Mar 2022 12:35:56 -0300 Subject: [PATCH 07/22] Delete gm_spellbook_template.tex --- gm_spellbook_template.tex | 41 --------------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 gm_spellbook_template.tex diff --git a/gm_spellbook_template.tex b/gm_spellbook_template.tex deleted file mode 100644 index e0cf40c..0000000 --- a/gm_spellbook_template.tex +++ /dev/null @@ -1,41 +0,0 @@ -\pdfbookmark[0]{Spells}{Spells} -\section*{Spells} - -[% for spl in spells %] - \pdfbookmark[1]{[[ spl.name ]]}{Spells - [[ spl.name ]]} - [% if use_dnd_decorations %] - \DndSpellHeader - {[[ spl.name ]]} - {[% if spl.level > 0 %][[ ordinals[spl.level] ]]-level [[ spl.magic_school ]][% else %][[ spl.magic_school ]] Cantrip[% endif %] [% if spl.ritual %](\textit{ritual})[% endif %]} - {[[ spl.casting_time ]]} - {[[ spl.casting_range ]]} - {[[ spl.component_string ]]} - {[[ spl.duration ]]} - [% else %] - \section*{[[ spl.name ]]} - [% if spl.level > 0 %] % - \textit{[[ spl.magic_school ]] Level [[ spl.level ]]} % - [% else %] % - \textit{[[ spl.magic_school ]] Cantrip} % - [% endif %] % - [% if spl.ritual and spl.concentration %]% - (\textit{ritual}, \textit{concentration})% - [% elif spl.ritual %]% - (\textit{ritual})% - [% elif spl.concentration %]% - (\textit{concentration})% - [% endif %]% - %% \noindent - \begin{description} - \setlength{\itemsep}{\zerosep}% - \setlength{\parskip}{0pt}% - \item [Casting Time:] [[ spl.casting_time ]] \\ - \item [Duration:] [[ spl.duration ]] \\ - \item [Range:] [[ spl.casting_range ]] \\ - \item [Components:] [[ spl.component_string ]] - \end{description} - % \vspace{\zerosep} - [% endif %] - [[ spl.__doc__ | rst_to_latex(top_heading_level=1) ]] - -[% endfor %] From 062adafe6aedb8aa349015aabe9669116266e630 Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Sat, 19 Mar 2022 12:37:28 -0300 Subject: [PATCH 08/22] Included gm_spellbook and updated MSavage form --- dungeonsheets/forms/MSavage_template.tex | 14 +-- dungeonsheets/forms/companions_template.html | 91 ++++++++++++++++ dungeonsheets/forms/companions_template.tex | 100 ++++++++++++++++++ .../forms/gm_spellbook_template.html | 9 ++ dungeonsheets/forms/gm_spellbook_template.tex | 41 +++++++ 5 files changed, 248 insertions(+), 7 deletions(-) create mode 100644 dungeonsheets/forms/companions_template.html create mode 100644 dungeonsheets/forms/companions_template.tex create mode 100644 dungeonsheets/forms/gm_spellbook_template.html create mode 100644 dungeonsheets/forms/gm_spellbook_template.tex diff --git a/dungeonsheets/forms/MSavage_template.tex b/dungeonsheets/forms/MSavage_template.tex index 4c378dd..f18ec3d 100644 --- a/dungeonsheets/forms/MSavage_template.tex +++ b/dungeonsheets/forms/MSavage_template.tex @@ -101,16 +101,16 @@ \Initiative{[[ char.initiative ]]} \Speed{[[ char.speed ]]} \MaxHitPoints{[[ char.hp_max ]]} -\CurrentHitPoints{[[ char.hp_current ]]} -\TemporaryHitPoints{[[ char.hp_temp ]]} +[% if char.hp_current %]\CurrentHitPoints{[[ char.hp_current ]]}[% endif %] +[% if char.hp_temp %]\TemporaryHitPoints{[[ char.hp_temp ]]}[% endif %] \MaxHitDice{[[ char.hit_dice.replace(" ","") ]]} \CurrentHitDice{[[ char.hit_dice_current.replace(" ", "") ]]} -\CP{[[ char.cp ]]} -\SP{[[ char.sp ]]} -\GP{[[ char.gp ]]} -\EP{[[ char.ep ]]} -\PP{[[ char.pp ]]} +\CP{[% if char.cp > 0 %][[ char.cp ]][% endif %]} +\SP{[% if char.sp > 0 %][[ char.sp ]][% endif %]} +\GP{[% if char.ep > 0 %][[ char.ep ]][% endif %]} +\EP{[% if char.gp > 0 %][[ char.gp ]][% endif %]} +\PP{[% if char.pp > 0 %][[ char.pp ]][% endif %]} [% for w in char.weapons %] \AddWeapon{[[ w.name ]]}{[[ "{:+d}".format(w.attack_modifier) ]]}{[[ "{}/{}".format(w.damage, w.damage_type) ]]} diff --git a/dungeonsheets/forms/companions_template.html b/dungeonsheets/forms/companions_template.html new file mode 100644 index 0000000..8a2df39 --- /dev/null +++ b/dungeonsheets/forms/companions_template.html @@ -0,0 +1,91 @@ +

Companions

+ +[% for monster in monsters|sort(attribute='name') %] +
+

[[ monster.name ]]

+ + [% if monster.description %] +

[[ monster.description ]]

+ [% endif %] + + + + + + + + + + + + + +
Armor ClassHit PointsSpeed
[[ monster.armor_class ]][[ monster.hp_max ]] ([[ monster.hit_dice ]])[[ monster.speed ]][% if monster.swim_speed %], + [[ monster.swim_speed ]] swim[% endif %][% if monster.fly_speed %], + [[ monster.fly_speed ]] fly[% endif %][% if monster.burrow_speed %], + [[ monster.burrow_speed ]] burrow[% endif %]
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
STRDEXCONINTWISCHA
[[ monster.strength.value ]][[ monster.dexterity.value ]][[ monster.constitution.value ]][[ monster.intelligence.value ]][[ monster.wisdom.value ]][[ monster.charisma.value ]]
([[ monster.strength.modifier|mod_str ]])([[ monster.dexterity.modifier|mod_str ]])([[ monster.constitution.modifier|mod_str ]])([[ monster.intelligence.modifier|mod_str ]])([[ monster.wisdom.modifier|mod_str ]])([[ monster.charisma.modifier|mod_str ]])
+ +
+ [% if monster.skills != "" %]
Skills
[[ monster.skills ]]
[% endif %] +
Senses
[% if monster.senses != "" %][[ monster.senses ]][% else %]--[% endif %]
+
Languages
[% if monster.languages != "" %][[ monster.languages ]][% else %]--[% endif %]
+ [% if monster.damage_resistances != "" %]
Damage Resistances
[[ monster.damage_resistances ]]
[% endif %] + [% if monster.damage_immunities != "" %]
Damage Immunities
[[ monster.damage_immunities ]]
[% endif %] + [% if monster.damage_vulnerabilities != "" %]
Damage Vulnerabilities
[[ monster.damage_vulnerabilities ]]
[% endif %] + [% if monster.condition_immunities != "" %]
Condition Immunuties
[[ monster.condition_immunities ]]
[% endif %] + [% if monster.saving_throws != "" %]
Saving Throws
[[ monster.saving_throws ]]
[% endif %] +
Challenge
[[ monster.challenge_rating ]] ([[ monster.challenge_rating | challenge_rating_to_xp ]] XP)
+
+ + [% if monster.spells | length > 0 %] +
+ [% for level, spells in monster.spells | groupby('level') %] +
[% if level == 0 %]Cantrips[% else %]Level [[ level ]][% endif %]
+
+ [% for spell in spells %][% if not loop.first %], [% endif %] + [[ spell.name ]][% endfor %] +
+ [% endfor %] +
+ [% endif %] + + [[ monster.__doc__ | rst_to_html(top_heading_level=2) ]] + +
+[% endfor %] + +

Monster Spells

+ +[% from "spellblock.html" import spellblock %] + +[% for spell in spell_list | sort(attribute="name") %] +[[ spellblock(spell, id_base="monster-spells") ]] +[% endfor %] diff --git a/dungeonsheets/forms/companions_template.tex b/dungeonsheets/forms/companions_template.tex new file mode 100644 index 0000000..2063651 --- /dev/null +++ b/dungeonsheets/forms/companions_template.tex @@ -0,0 +1,100 @@ +\pdfbookmark[0]{Companions}{Companions} +\section*{Companions} + +[% if use_dnd_decorations %] + [% for monster in monsters|sort(attribute='name') %] + \pdfbookmark[1]{[[ monster.name ]]}{Companions - [[ monster.name ]]} + \begin{DndMonster}{[[ monster.name ]]} + \DndMonsterType{[[ monster.description ]]} + + % If you want to use commas in the key values, enclose the values in braces. + \DndMonsterBasics[ + armor-class = {[[ monster.armor_class ]]}, + hit-points = {[[ monster.hp_max ]] ([[ monster.hit_dice ]])}, + speed = {[[ monster.speed ]] ft.[% if monster.swim_speed %], [[ monster.swim_speed ]] ft. swim[% endif %][% if monster.fly_speed %], [[ monster.fly_speed ]] ft. fly[% endif %][% if monster.burrow_speed %], [[ monster.burrow_speed ]] ft. burrow[% endif %]}, + ] + + \DndMonsterAbilityScores[ + str = [[ monster.strength.value ]], + dex = [[ monster.dexterity.value ]], + con = [[ monster.constitution.value ]], + int = [[ monster.intelligence.value ]], + wis = [[ monster.wisdom.value ]], + cha = [[ monster.charisma.value ]], + ] + + \DndMonsterDetails[ + saving-throws = {[[ monster.saving_throws ]]}, + skills = {[[ monster.skills ]]}, + damage-vulnerabilities = {[[ monster.damage_vulnerabilities ]]}, + damage-resistances = {[[ monster.damage_resistances ]]}, + damage-immunities = {[[ monster.damage_immunities ]]}, + condition-immunities = {[[ monster.condition_immunities ]]}, + senses = {[[ monster.senses ]]}, + languages = {[% if monster.languages %][[ monster.languages ]][% else %] --- [% endif %]}, + challenge = {[[ monster.challenge_rating ]] ([[ monster.challenge_rating | challenge_rating_to_xp ]] XP)}, + ] + %\DndMonsterSection{Actions} + [[ monster.__doc__ | rst_to_latex(top_heading_level=2) ]] + \end{DndMonster} + [% endfor %] + +[% else %] + [% for monster in monsters|sort(attribute='name') %] + { + \pdfbookmark[1]{[[ monster.name ]]}{Companions - [[ monster.name ]]} + \section*{[[ monster.name ]]} + [% if monster.description %] + \subsection*{[[ monster.description ]]} + [% endif %] + + \begin{tabular}{c c c} + Armor Class & Hit Points & Speed \\ + \hline + [[ monster.armor_class ]] & + [[ monster.hp_max ]] ([[ monster.hit_dice ]]) & + [[ monster.speed ]] \\ + [% if monster.swim_speed %] + & & [[ monster.swim_speed ]] swim \\ + [% endif %] + [% if monster.fly_speed %] + & & [[ monster.fly_speed ]] fly \\ + [% endif %] + [% if monster.burrow_speed %] + & & [[ monster.burrow_speed ]] burrow \\ + [% endif %] + \end{tabular} + + \vspace{0.2cm} + + \begin{tabular}{c c c c c c} + STR & DEX & CON & INT & WIS & CHA \\ + \hline + [[ monster.strength.value ]] & [[ monster.dexterity.value ]] & [[ monster.constitution.value ]] & + [[ monster.intelligence.value ]] & [[ monster.wisdom.value ]] & [[ monster.charisma.value ]] \\ + ([[ monster.strength.modifier|mod_str ]]) & ([[ monster.dexterity.modifier|mod_str ]]) & + ([[ monster.constitution.modifier|mod_str ]]) & ([[ monster.intelligence.modifier|mod_str ]]) & + ([[ monster.wisdom.modifier|mod_str ]]) & ([[ monster.charisma.modifier|mod_str ]]) \\ + \end{tabular} + + \vspace{0.2cm} + + \begin{description} + [% if monster.skills != "" %]\item [Skills:] [[ monster.skills ]][% endif %] + \item [Senses:] [% if monster.senses != "" %][[ monster.senses ]][% else %]--[% endif %] + \item [Languages:] [% if monster.languages != "" %][[ monster.languages ]][% else %]--[% endif %] + [% if monster.damage_resistances != "" %]\item [Damage Resistances:] [[ monster.damage_resistances ]][% endif %] + [% if monster.damage_immunities != "" %]\item [Damage Immunities:] [[ monster.damage_immunities ]][% endif %] + [% if monster.damage_vulnerabilities != "" %]\item [Damage Vulnerabilities:] [[ monster.damage_vulnerabilities ]][% endif %] + [% if monster.condition_immunities != "" %]\item [Condition Immunuties:] [[ monster.condition_immunities ]][% endif %] + [% if monster.saving_throws != "" %]\item [Saving Throws:] [[ monster.saving_throws ]][% endif %] + \item [Challenge:] [[ monster.challenge_rating ]] ([[ monster.challenge_rating | challenge_rating_to_xp ]] XP) + \end{description} + + \vspace{0.2cm} + + [[ monster.__doc__ | rst_to_latex(top_heading_level=2) ]] + + } %\color + [% endfor %] +[% endif %] diff --git a/dungeonsheets/forms/gm_spellbook_template.html b/dungeonsheets/forms/gm_spellbook_template.html new file mode 100644 index 0000000..ba7020c --- /dev/null +++ b/dungeonsheets/forms/gm_spellbook_template.html @@ -0,0 +1,9 @@ +

Spells

+ + +[% from "spellblock.html" import spellblock %] +[% for spl in spells %] + +[[ spellblock(spl, id_base="spells") ]] + +[% endfor %] diff --git a/dungeonsheets/forms/gm_spellbook_template.tex b/dungeonsheets/forms/gm_spellbook_template.tex new file mode 100644 index 0000000..e0cf40c --- /dev/null +++ b/dungeonsheets/forms/gm_spellbook_template.tex @@ -0,0 +1,41 @@ +\pdfbookmark[0]{Spells}{Spells} +\section*{Spells} + +[% for spl in spells %] + \pdfbookmark[1]{[[ spl.name ]]}{Spells - [[ spl.name ]]} + [% if use_dnd_decorations %] + \DndSpellHeader + {[[ spl.name ]]} + {[% if spl.level > 0 %][[ ordinals[spl.level] ]]-level [[ spl.magic_school ]][% else %][[ spl.magic_school ]] Cantrip[% endif %] [% if spl.ritual %](\textit{ritual})[% endif %]} + {[[ spl.casting_time ]]} + {[[ spl.casting_range ]]} + {[[ spl.component_string ]]} + {[[ spl.duration ]]} + [% else %] + \section*{[[ spl.name ]]} + [% if spl.level > 0 %] % + \textit{[[ spl.magic_school ]] Level [[ spl.level ]]} % + [% else %] % + \textit{[[ spl.magic_school ]] Cantrip} % + [% endif %] % + [% if spl.ritual and spl.concentration %]% + (\textit{ritual}, \textit{concentration})% + [% elif spl.ritual %]% + (\textit{ritual})% + [% elif spl.concentration %]% + (\textit{concentration})% + [% endif %]% + %% \noindent + \begin{description} + \setlength{\itemsep}{\zerosep}% + \setlength{\parskip}{0pt}% + \item [Casting Time:] [[ spl.casting_time ]] \\ + \item [Duration:] [[ spl.duration ]] \\ + \item [Range:] [[ spl.casting_range ]] \\ + \item [Components:] [[ spl.component_string ]] + \end{description} + % \vspace{\zerosep} + [% endif %] + [[ spl.__doc__ | rst_to_latex(top_heading_level=1) ]] + +[% endfor %] From 6f6905f1ce5b52a7da82040be71afa0a7b6cb4c5 Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Sat, 19 Mar 2022 15:09:04 -0300 Subject: [PATCH 09/22] tested version of character et al --- dungeonsheets/character.py | 4 ++-- dungeonsheets/dice.py | 7 +------ dungeonsheets/make_sheets.py | 2 +- 3 files changed, 4 insertions(+), 9 deletions(-) diff --git a/dungeonsheets/character.py b/dungeonsheets/character.py index f0cf4c4..3a6f411 100644 --- a/dungeonsheets/character.py +++ b/dungeonsheets/character.py @@ -1000,7 +1000,7 @@ class Character(Creature): f"Companion '{beast}' not found. Please add it to" " ``monsters.py``" ) beast = self._resolve_mechanic(beast, monsters.Monster, msg) - self.Ranger.ranger_beast = (beast, self.proficiency_bonus) + self.Ranger.ranger_beast = (beast(), self.proficiency_bonus) @property def companions(self): @@ -1019,7 +1019,7 @@ class Character(Creature): f"Companion '{compa}' not found. Please add it to" " ``monsters.py``" ) new_compa = self._resolve_mechanic(compa, monsters.Monster, msg) - companions_list.append(new_compa) + companions_list.append(new_compa()) # Save the updated list for later self._companions = companions_list diff --git a/dungeonsheets/dice.py b/dungeonsheets/dice.py index 2a64a1c..340a905 100644 --- a/dungeonsheets/dice.py +++ b/dungeonsheets/dice.py @@ -21,7 +21,7 @@ def read_dice_str(dice_str): """ dice_str = dice_str.replace(" ", "").replace("\n", "") - match = dice_re.match(dice_str) + match = dice_re.search(dice_str) if match is None: raise DiceError(f"Cannot interpret dice string {dice_str}") num, faces = int(match.group(1)), int(match.group(2)) @@ -79,8 +79,3 @@ def dice_roll_mean(dice_text): dice = read_dice_str(dice_text) return round(_dice_mean(dice)) -if __name__ == "__main__": - ds = "10d12+10" - v = read_dice_str(ds) - print(v) - print(_dice_mean(v)) \ No newline at end of file diff --git a/dungeonsheets/make_sheets.py b/dungeonsheets/make_sheets.py index 3ebf558..d181605 100644 --- a/dungeonsheets/make_sheets.py +++ b/dungeonsheets/make_sheets.py @@ -92,7 +92,7 @@ def create_monsters_content( template = jinja_env.get_template(base_template+f".{suffix}") spell_list = [Spell() for monster in monsters for Spell in monster.spells] return template.render(monsters=monsters, - use_dnd_decorations=use_dnd_decorations, spell_list=spell_list) + use_dnd_decorations=use_dnd_decorations, spell_list=spell_list) def create_gm_spellbook(spell_list, suffix): From b31e56dffec727c7770f33bc0993da4a485e9f0f Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Sat, 19 Mar 2022 15:20:13 -0300 Subject: [PATCH 10/22] Added tests for Companions and Weight features --- examples/HB_races.py | 218 +++++++++++++++++++++++++++++++ examples/kits.py | 20 +++ examples/shifter_2.png | Bin 0 -> 185424 bytes examples/sorcerer_ranger_test.py | 181 +++++++++++++++++++++++++ 4 files changed, 419 insertions(+) create mode 100644 examples/HB_races.py create mode 100644 examples/kits.py create mode 100644 examples/shifter_2.png create mode 100644 examples/sorcerer_ranger_test.py diff --git a/examples/HB_races.py b/examples/HB_races.py new file mode 100644 index 0000000..5115daa --- /dev/null +++ b/examples/HB_races.py @@ -0,0 +1,218 @@ +"""This file defines some homebrew mechanics that can be imported into +character sheets using ``dungeonsheets.import_homebrew``. See +``homebrew.py`` for an example of how these homebrew mechanics can be +used. + +""" + +from dungeonsheets import race +from dungeonsheets import features as feats +# from dungeonsheets import mecanics + +class WildCompanion(feats.Feature): + """You gain the ability to summon a spirit that assumes an animal form: + as an action, you can expend a use of your Wild Shape feature + to cast the *find familiar* spell, without material components. + + When you cast the spell in this way, the familiar + is a fey instead of a beast, and the familiar disapears after + a number of hours equal to half your druid level. + """ + + name = "Wild Companion" + source = "Class (Druid)" + +# shifters +class Shifting(feats.Feature): + """As a bonus action, you can assume a more bestial appearence. + This transformation lasts for 1 minute, until you die, or until + you revert to your normal appearence as a bonus action. When you shift, + you gain temporary hit points equal to your level + your Constitution + modifier (minimum of 1 temporary hit point). You also gain additional + benefits that depend on your shifter subrace. Once you shift, + you can't to so again until you finish a short or long rest. + """ + + name = "Beasthide Shifting" + source = "Race (Beasthide Shifter)" + +class BeasthideShifting(feats.Feature): + """Whenever you shift, you gain 1d6 additional temporary hit points. + While shifted, you have a +1 bonus to your Armor Class. + + """ + + name = "Beasthide Shifting (1x/SR)" + source = "Race (Beasthide Shifter)" + +class LongtoothShifting(feats.Feature): + """While shifted, you can use your elongated fangs to make an unarmed + strike as a bonus action. If you hit with your fangs, you can deal + piercing damage equal to 1d6 + your Strength modifier, instead + of the bludgeoning damage normal for an unarmed attack. + + """ + + name = "Longtooth Shifting (1x/SR)" + source = "Race (Longtooth Shifter)" + +class SwiftstrideShifting(feats.Feature): + """While shifted, your walking speed increases by 10 feet. Additionally, + you can move up to 10 feet as a reaction when a creature ends its turn + within 5 feet of you. This reactive movement doesn't provoke + opportunity attacks. + + """ + + name = "Swiftstride Shifting (1x/SR)" + source = "Race (Swiftstride Shifter)" + +class WildhuntShifting(feats.Feature): + """While shifted, you have advantage on Wisdom checks, and no creature + within 30 feet of you can make an attack roll with advantage against you, + unless you are incapacitated. + + """ + + name = "Wildhunt Shifting (1x/SR)" + source = "Race (Beasthide Shifter)" + +class NaturalAthlete(feats.Feature): + """You have proficiency in the Athletics skill. + """ + + name = "Natural Athlete" + source = "Race (Beasthide Shifter)" + +class Fierce(feats.Feature): + """You have proficiency in the Intimidation skill. + """ + + name = "Fierce" + source = "Race (Longtooth Shifter)" + +class Graceful(feats.Feature): + """You have proficiency in the Acrobatics skill. + """ + + name = "Graceful" + source = "Race (Swiftstride Shifter)" + +class NaturalTracker(feats.Feature): + """You have proficiency in the Survival skill. + """ + + name = "Natural Tracker" + source = "Race (Wildhunt Shifter)" + + +class _Shifter(race.Race): + name = "Shifter" + size = "medium" + speed = 30 + languages = ("Common", ) + features = (feats.Darkvision, Shifting) + + +class BeasthideShifter(_Shifter): + name = "Beasthide Shifter" + constitution_bonus = 2 + strength_bonus = 1 + features = _Shifter.features + (BeasthideShifting, NaturalAthlete) + +class LongtoothShifter(_Shifter): + name = "Longtooth Shifter" + constitution_bonus = 2 + strength_bonus = 1 + features = _Shifter.features + (LongtoothShifting, Fierce) + +class SwiftstrideShifter(_Shifter): + name = "Swiftstride Shifter" + dexterity_bonus = 2 + charisma_bonus = 1 + features = _Shifter.features + (SwiftstrideShifting, Graceful) + +class WildhuntShifter(_Shifter): + name = "Wildhunt Shifter" + constitution_bonus = 2 + strength_bonus = 1 + features = _Shifter.features + (WildhuntShifting, NaturalTracker) + +class DualMind(feats.Feature): + """You have advantage on all Wisdom saving throws. + """ + name = "Dual Mind" + source = "Race (Kalashtar)" + +class MentalDiscipline(feats.Feature): + """You have resistance to psychic damage. + """ + name = "Mental Discipline" + source = "Race (Kalashtar)" + +class MindLink(feats.Feature): + """You can speak telepathically to any creature you can see, provided + the crature is within a number of feet of you equal to 10 times your level. + You don't need to share a language with the creature for it to understand + your telepathic utterances, but the creature must be able to + understand at least one language. + + When you are using this trait to speak telepathically to a creature, + you can use your action to give that crature the ability to speak + telepatically with you for 1 hour or until you end this effect as an + action. To use this ability, the creature must be able to see you and must + be within this trait's range. You can give this ability to only + one creature at a time; giving it to another creature takes it away from + another creature who has it.""" + name = "Mind Link" + source = "Race (Kalashtar)" + +class SeveredFromDreams(feats.Feature): + """Kalashtar sleep, but they don't connect to the plane of dreams + as other creatures do. Instead, their minds draw from the memoires + of their otherworldly spirit while they sleep. As such, + you are immune to spells that require you to dream, like *dream*, + but not to spells and other magical effects that put you to sleep. + """ + name = "Severed from Dreams" + source = "Race (Kalashtar)" + +class Kalashtar(race.Race): + name = "Kalashtar" + size = "medium" + speed = 30 + charisma_bonus = 1 + wisdom_bonus = 2 + languages = ("Common", "Quori", ) + features = (DualMind, MentalDiscipline, MindLink, SeveredFromDreams) + +class PoisonResiliense(feats.Feature): + """You have advantage on saving throws you make to avoid or end the + poisoned condition on yourself. You also have resistance to poison damage. + """ + name = "Poison Resilience" + source = "Race (Yuan-Ti)" + +class SerpentineSpellcasting(feats.Feature): + """You know the poison spray cantrip. You can cast animal friendship an + unlimited number of times with this trait, but you can target only + snakes with it. Starting at 3rd level, you can also cast suggestion + with this trait. Once you cast it, you can't do so again until you + finish a long rest. You can also cast it using any spell slots you + have of 2nd level or higher. + + Intelligence, Wisdom, or Charisma is your spellcasting ability + for these spells when you cast them with this trait + (choose when you select this race). + """ + +class Yuan_Ti(race.Race): + name = "Yuan-Ti" + size = "medium" + speed = 30 + languages = ("Common", ) + features = (feats.Darkvision, feats.MagicResistance, PoisonResiliense, + SerpentineSpellcasting) + + + diff --git a/examples/kits.py b/examples/kits.py new file mode 100644 index 0000000..0d6c198 --- /dev/null +++ b/examples/kits.py @@ -0,0 +1,20 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Tue Feb 22 01:04:23 2022 + +@author: mauricio +""" + +explorers_pack = """backpack, bedroll, mess kit, tinderbox, {torches} torches, +{rations} days of rations, waterskin, {rope} feet of hempen rope""" +dungeoneers_pack = """backpack, crowbar, hammer, {pitons} pitons, +{torches} torches, tinderbox, {rations} days of rations, waterskin, +{rope} feet of hempen rope""" +priests_pack = """backpack, blanket, {candles} candles, tinderbox, alms box, +{incense} blocks of incense, censer, vestments, {rations} days of rations, +waterskin""" +scholars_pack = """backpack, book of lore, bottle of ink, ink pen, +{parchment} sheets of parchment, little bag of sand, small knife""" +entertainers_pack = """backpack, bedroll, {costumes} costumes, +{candles} candles, {rations} days of rations, waterskin, disguise kit""" diff --git a/examples/shifter_2.png b/examples/shifter_2.png new file mode 100644 index 0000000000000000000000000000000000000000..489d91b7f0f47d004b98126f8b3a271c01753c58 GIT binary patch literal 185424 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 FV1i{dJbM5D literal 0 HcmV?d00001 diff --git a/examples/sorcerer_ranger_test.py b/examples/sorcerer_ranger_test.py new file mode 100644 index 0000000..9ef7002 --- /dev/null +++ b/examples/sorcerer_ranger_test.py @@ -0,0 +1,181 @@ +"""This file describes the heroic adventurer DooDee. +It's used primarily for saving characters from create-character, +where there will be many missing sections. +Modify this file as you level up and then re-generate the character +sheet by running ``makesheets`` from the command line. +""" + +# To add your own content, write a .py file with your definitions. +# Then, import here using the 'import_homebrew' function. +from dungeonsheets import import_homebrew +HB_races = import_homebrew("HB_races.py") +kits = import_homebrew("kits.py") + +dungeonsheets_version = '0.17.1' +name = "DooDee" +player_name = "George Martin" + +# Be sure to list Primary class first +classes = ['Druid', 'Ranger', 'Sorceror'] # ex: ['Wizard'] or ['Rogue', 'Fighter'] +levels = [5, 3, 1] # ex: [10] or [3, 2] +subclasses = ["Circle of the Moon", "Beast Master", None ] # ex: ['Necromacy'] or ['Thief', None] +background = "Hermit" +race = HB_races.WildhuntShifter +alignment = "Lawful Neutral" + +xp = 14587 +hp_max = 77 +# hp_temp = 5 +# hp_current = 31 +inspiration = 1 # integer inspiration value + +# Ability Scores +strength = 10 +dexterity = 17 +constitution = 14 +intelligence = 16 +wisdom = 14 +charisma = 12 + +# Select what skills you're proficient with +skill_proficiencies = ('insight', 'perception', + 'medicine', 'survival', 'religion') + +# Any skills you have "expertise" (Bard/Rogue) in +skill_expertise = () + +# Named features / feats that aren't part of your classes, race, or background. +# Also include Eldritch Invocations and features you make multiple selection of +# (like Maneuvers for Fighter, Metamagic for Sorcerors, Trick Shots for +# Gunslinger, etc.) +# Example: +# features = ('Tavern Brawler',) # take the optional Feat from PHB +features = (HB_races.WildCompanion, "Sharpshooter") + +# If selecting among multiple feature options: ex Fighting Style +# Example (Fighting Style): +# feature_choices = ('Archery',) +feature_choices = ("Archery",) + +# Weapons/other proficiencies not given by class/race/background +weapon_proficiencies = () # ex: ('shortsword', 'quarterstaff') +_proficiencies_text = ("Cartographer's tools", ) # ex: ("thieves' tools",) + +# Proficiencies and languages +languages = """Common, Druidic, Elven, Draconic""" + +# Inventory +# Get yourself some money +cp = 0 +sp = 95 +ep = 12 +gp = 140 +pp = 0 + +# Put your equipped weapons and armor here +weapons = ("Longbow", 'Quarterstaff','dagger') # Example: ('shortsword', 'longsword') +magic_items = () # Example: ('ring of protection',) +armor = "Hide Armor" # Eg "leather armor" +shield = "" # Eg "shield" + +# The equipment goes here. A total weight will be automatically +# calculated and added. +equipment = kits.explorers_pack.format(rations=9, torches=3, + pitons=10, rope=50) + \ + ", human skin mask, sacrificial knife." + +# If the weight of an item is undetermined, you can include it +# in the equipment_weight_dict +equipment_weight_dict = {"human skin mask":0.5} + +attacks_and_spellcasting = \ +""" +Quarterstaff with Shillelagh: +5 to hit, 1d8+3/b +""" + +# List of known spells +# Example: spells_prepared = ('magic missile', 'mage armor') +spells_prepared = ("Shillelagh", "Druidcraft", "Cure Wounds", "Faerie Fire", + "Entangle", "Thunderwave", "Fog Cloud", "Barkskin") + + +# Which spells have not been prepared +__spells_unprepared = ("Speak with animals", "Charm Person", + "Animal Friendship", "Create or Destroy Water", + "Goodberry", "Purify Food and Drink", "Find Familiar") + +# all spells known +spells = spells_prepared + __spells_unprepared + +# Wild shapes for Druid +wild_shapes = ("Ape", "Wolf", "Mastiff", "Giant Spider", "Tiger", + "Dire Wolf", "Brown Bear","Cat") # Ex: ('ape', 'wolf', 'ankylosaurus') +# List any monsters whose reference can come at hand +# for spells like Find Familiar +companions = ["owl", "poisonous snake"] + +# Rangers Beast for Beast Master +ranger_beast = "Panther" + +# Backstory +# Describe your backstory here +personality_traits = """ +I am introspective. +""" + +ideals = """I search for nature balance.""" + +bonds = """My friends from my village.""" + +flaws = """ + I lose my temper when I see animal corpses as trophies.""" + +features_and_traits = """""" + +portrait = 'shifter_2.png' +age = 15 +height = "1,77m" +weight = "72kg" +eyes = "Black" +skin = "Brown" +hair = "Brown" + + +# optionally, if you set portrait to false, you can include a text +# in the appearance box using the 'appearece_text' variable: +# appearance_text = +additional_description = \ + ''' +Find it better to avoid conflict. +''' + +backstory = \ + ''' + +Born at Makudan Village, helped many other +shifters to overcome the vampire known as Strahd. + +''' + +treasure = \ + ''' + A Dire Wolf tooth + + ''' + +allies = \ + ''' + His childhood friend Krenak + + His elder master Caiubi; + + Druids of Rakshak + + Druids of Makudan + ''' + +org_name = \ + ''' + Druids of Makudan + + ''' From 4c32e7eed769c68d5a1f0722448314d34ede63af Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Sat, 19 Mar 2022 15:25:45 -0300 Subject: [PATCH 11/22] Delete MSavage_template.tex --- MSavage_template.tex | 205 ------------------------------------------- 1 file changed, 205 deletions(-) delete mode 100644 MSavage_template.tex diff --git a/MSavage_template.tex b/MSavage_template.tex deleted file mode 100644 index f18ec3d..0000000 --- a/MSavage_template.tex +++ /dev/null @@ -1,205 +0,0 @@ -\documentclass[letterpaper,openany,oneside,twocolumn]{book} - -\usepackage{fontspec} -\usepackage[justified]{dnd} -\usepackage{ifthen} -\usepackage{pstricks} - -\usepackage[UKenglish]{babel} - -\usepackage{dndtemplate} - -\setlength\oddsidemargin{\dimexpr(\paperwidth-\textwidth)/2 - 1in\relax} -\setlength\evensidemargin{\oddsidemargin} - -% Headline -\CharacterName{[[ char.name ]]} - -% adds only main class and total level to prevent overflow -\Class{[[ char.primary_class.name ]] [[ char.level ]]} -\Background{[[ char.background ]]} -\PlayerName{[[ char.player_name ]]} -\Race{[[ char.race ]]} -\Alignment{[[ char.alignment ]]} -\XP{[[ char.xp ]]} - -% Ability scores -\StrengthScore{[[ char.strength.value ]]} -\DexterityScore{[[ char.dexterity.value ]]} -\ConstitutionScore{[[ char.constitution.value ]]} -\IntelligenceScore{[[ char.intelligence.value ]]} -\WisdomScore{[[ char.wisdom.value ]]} -\CharismaScore{[[ char.charisma.value ]]} - -% Ability modifiers -\StrengthModifier{[[ "{:+d}".format(char.strength.modifier) ]]} -\DexterityModifier{[[ "{:+d}".format(char.dexterity.modifier) ]]} -\ConstitutionModifier{[[ "{:+d}".format(char.constitution.modifier) ]]} -\IntelligenceModifier{[[ "{:+d}".format(char.intelligence.modifier) ]]} -\WisdomModifier{[[ "{:+d}".format(char.wisdom.modifier) ]]} -\CharismaModifier{[[ "{:+d}".format(char.charisma.modifier) ]]} - -% Saving Throws -\StrengthSavingThrowModifier{[[ "{:+d}".format(char.strength.saving_throw) ]]} -\DexteritySavingThrowModifier{[[ "{:+d}".format(char.dexterity.saving_throw) ]]} -\ConstitutionSavingThrowModifier{[[ "{:+d}".format(char.constitution.saving_throw) ]]} -\IntelligenceSavingThrowModifier{[[ "{:+d}".format(char.intelligence.saving_throw) ]]} -\WisdomSavingThrowModifier{[[ "{:+d}".format(char.wisdom.saving_throw) ]]} -\CharismaSavingThrowModifier{[[ "{:+d}".format(char.charisma.saving_throw) ]]} - -\AcrobaticsSkillModifier{[[ "{:+d}".format(char.acrobatics.modifier) ]]} -\AnimalHandlingSkillModifier{[["{:+d}".format(char.animal_handling.modifier) ]]} -\ArcanaSkillModifier{[[ "{:+d}".format(char.arcana.modifier) ]]} -\AthleticsSkillModifier{[[ "{:+d}".format(char.athletics.modifier) ]]} -\DeceptionSkillModifier{[[ "{:+d}".format(char.deception.modifier) ]]} -\HistorySkillModifier{[[ "{:+d}".format(char.history.modifier) ]]} -\InsightSkillModifier{[[ "{:+d}".format(char.insight.modifier) ]]} -\IntimidationSkillModifier{[[ "{:+d}".format(char.intimidation.modifier) ]]} -\InvestigationSkillModifier{[[ "{:+d}".format(char.investigation.modifier) ]]} -\MedicineSkillModifier{[[ "{:+d}".format(char.medicine.modifier) ]]} -\NatureSkillModifier{[[ "{:+d}".format(char.nature.modifier) ]]} -\PerceptionSkillModifier{[[ "{:+d}".format(char.perception.modifier) ]]} -\PerformanceSkillModifier{[[ "{:+d}".format(char.performance.modifier) ]]} -\PersuasionSkillModifier{[[ "{:+d}".format(char.persuasion.modifier) ]]} -\ReligionSkillModifier{[[ "{:+d}".format(char.religion.modifier) ]]} -\SleightOfHandSkillModifier{[[ "{:+d}".format(char.sleight_of_hand.modifier) ]]} -\StealthSkillModifier{[[ "{:+d}".format(char.stealth.modifier) ]]} -\SurvivalSkillModifier{[[ "{:+d}".format(char.survival.modifier) ]]} - -% Prociciencies -\StrengthProficiency{[[ "strength" in char.saving_throw_proficiencies ]]} -\DexterityProficiency{[[ "dexterity" in char.saving_throw_proficiencies ]]} -\ConstitutionProficiency{[[ "constitution" in char.saving_throw_proficiencies ]]} -\IntelligenceProficiency{[[ "intelligence" in char.saving_throw_proficiencies ]]} -\WisdomProficiency{[[ "wisdom" in char.saving_throw_proficiencies ]]} -\CharismaProficiency{[[ "charisma" in char.saving_throw_proficiencies ]]} - -\AcrobaticsProficiency{[[ "acrobatics" in char.skill_proficiencies ]]} -\AnimalHandlingProficiency{[[ "animal_handling" in char.skill_proficiencies ]]} -\ArcanaProficiency{[[ "arcana" in char.skill_proficiencies ]]} -\AthleticsProficiency{[[ "athletics" in char.skill_proficiencies ]]} -\DeceptionProficiency{[[ "deception" in char.skill_proficiencies ]]} -\HistoryProficiency{[[ "history" in char.skill_proficiencies ]]} -\InsightProficiency{[[ "insight" in char.skill_proficiencies ]]} -\IntimidationProficiency{[[ "intimidation" in char.skill_proficiencies ]]} -\InvestigationProficiency{[[ "investigation" in char.skill_proficiencies ]]} -\MedicineProficiency{[[ "medicine" in char.skill_proficiencies ]]} -\NatureProficiency{[[ "nature" in char.skill_proficiencies ]]} -\PerceptionProficiency{[[ "perception" in char.skill_proficiencies ]]} -\PerformanceProficiency{[[ "performance" in char.skill_proficiencies ]]} -\PersuasionProficiency{[[ "persuasion" in char.skill_proficiencies ]]} -\ReligionProficiency{[[ "religion" in char.skill_proficiencies ]]} -\SleightOfHandProficiency{[[ "sleight_of_hand" in char.skill_proficiencies ]]} -\StealthProficiency{[[ "stealth" in char.skill_proficiencies ]]} -\SurvivalProficiency{[[ "survival" in char.skill_proficiencies ]]} - -\Inspiration{[% if char.inspiration %] $\star$ [% endif %]} -\Proficiency{[[ "{:+d}".format(char.proficiency_bonus) ]]} -\Perception{[[ 10 + char.perception.modifier ]]} - -\ArmorClass{[[ char.armor_class ]]} -\Initiative{[[ char.initiative ]]} -\Speed{[[ char.speed ]]} -\MaxHitPoints{[[ char.hp_max ]]} -[% if char.hp_current %]\CurrentHitPoints{[[ char.hp_current ]]}[% endif %] -[% if char.hp_temp %]\TemporaryHitPoints{[[ char.hp_temp ]]}[% endif %] -\MaxHitDice{[[ char.hit_dice.replace(" ","") ]]} -\CurrentHitDice{[[ char.hit_dice_current.replace(" ", "") ]]} - -\CP{[% if char.cp > 0 %][[ char.cp ]][% endif %]} -\SP{[% if char.sp > 0 %][[ char.sp ]][% endif %]} -\GP{[% if char.ep > 0 %][[ char.ep ]][% endif %]} -\EP{[% if char.gp > 0 %][[ char.gp ]][% endif %]} -\PP{[% if char.pp > 0 %][[ char.pp ]][% endif %]} - -[% for w in char.weapons %] -\AddWeapon{[[ w.name ]]}{[[ "{:+d}".format(w.attack_modifier) ]]}{[[ "{}/{}".format(w.damage, w.damage_type) ]]} -[% endfor %] - -\AttacksAdditional{ -[% if char.armor %]\textbf{Armor}: [[ char.armor ]] \\ [% endif %] -[% if char.shield %]\textbf{Shield}: [[ char.shield ]] \\ [% endif %] -[[- char.attacks_and_spellcasting| boxed -]] -} - -\OtherProficienciesLanguages{ -\textbf{Languages:} [[ char.languages ]] \\ -[%- for prof_type, values in char.proficiencies_by_type.items() %] -\textbf{[[ prof_type ]]}: [[ values ]] \\ -[%- endfor -%] -} - -\Equipment{[[ char.equipment_text| boxed ]]} - -\PersonalityTraits{ -[[ char.personality_traits ]] -} - -\Ideals{ -[[ char.ideals ]] -} - -\Bonds{ -[[ char.bonds ]] -} - -\Flaws{ -[[ char.flaws ]] -} - -\FeaturesTraits{ -[[ char.features_summary| boxed ]] -} - - -% Appearance - -\Age{[[ char.age ]]} -\Height{[[ char.height ]]} -\Weight{[[ char.weight ]]} -\Eyes{[[ char.eyes ]]} -\Skin{[[ char.skin ]]} -\Hair{[[ char.hair ]]} - -% background - -\CharacterAppearance{[[ portrait ]] -[[ char.appearance_text ]] -} -\AdditionalFeaturesAndTraits{ -[[ char.additional_description ]] -} -\Characterbackground{ -[[ char.backstory ]] -} -\Treasure{ -[[ char.treasure ]] -} -\AlliesAndOrganizations{ -[[ char.allies ]] -} -\OrganizationName{[[ char.org_name ]]} - -[% if char.is_spellcaster %] -%Magic -[[ char | spellsheetparser ]] -[% endif %] - - -\begin{document} -\newgeometry{left=0cm,right=0cm,top=0cm,bottom=0cm} -\onecolumn - - -% CHARACTER PAGE -\rendercharactersheet - -% BACKSTORY PAGE -\renderbackgroundsheet - -[% if char.is_spellcaster %] -% SPELLCASTING PAGE -\renderspellsheet -[% endif %] - -\end{document} \ No newline at end of file From 313b580e3f05a9361bb3afaa0fd7305d98870821 Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Wed, 30 Mar 2022 01:03:25 -0300 Subject: [PATCH 12/22] Added char files for testing Companions and Weight --- examples/kits.py | 34 ++++++++++++++++++++++++++++---- examples/sorcerer_ranger_test.py | 5 +++-- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/examples/kits.py b/examples/kits.py index 0d6c198..c306091 100644 --- a/examples/kits.py +++ b/examples/kits.py @@ -6,15 +6,41 @@ Created on Tue Feb 22 01:04:23 2022 @author: mauricio """ -explorers_pack = """backpack, bedroll, mess kit, tinderbox, {torches} torches, -{rations} days of rations, waterskin, {rope} feet of hempen rope""" + + +burglars_pack = """backpack, {ball_bearings} ball bearings, +{string} feet of string, bell, {candles} candles, crowbar, hammer, +{pitons} pitons, hooded lantern, +{oil} flasks of oil, {rations} days of rations, tinderbox, waterskin, +{rope} feet of hempen rope.""" +diplomats_pack = """chest, {cases} cases for maps and scrolls, +fine clothes, bottle of ink, ink pen, lamp, {oil} flasks of oil, +{paper} paper sheet, vial of perfume, sealing wax, soap.""" dungeoneers_pack = """backpack, crowbar, hammer, {pitons} pitons, {torches} torches, tinderbox, {rations} days of rations, waterskin, {rope} feet of hempen rope""" +entertainers_pack = """backpack, bedroll, {costumes} costumes, +{candles} candles, {rations} days of rations, waterskin, disguise kit""" +explorers_pack = """backpack, bedroll, mess kit, tinderbox, {torches} torches, +{rations} days of rations, waterskin, {rope} feet of hempen rope""" priests_pack = """backpack, blanket, {candles} candles, tinderbox, alms box, {incense} blocks of incense, censer, vestments, {rations} days of rations, waterskin""" scholars_pack = """backpack, book of lore, bottle of ink, ink pen, {parchment} sheets of parchment, little bag of sand, small knife""" -entertainers_pack = """backpack, bedroll, {costumes} costumes, -{candles} candles, {rations} days of rations, waterskin, disguise kit""" + + +if __name__ == "__main__": + from dungeonsheets.equipment_reader import equipment_weight_parser + quantities = {"ball_bearings":350, "string": 23, "candles": 4, + "pitons":18, "oil":3, "rations":2, "rope":15, + "cases":3, "paper":5, "torches":7, "costumes":2, + "incense":3, "parchment":17} + for kit in (burglars_pack, diplomats_pack, dungeoneers_pack, + entertainers_pack, explorers_pack, priests_pack, + scholars_pack): + equip = kit.format(**quantities) + print("EQUIPMENT: " + equip) + equip_weight = equipment_weight_parser(equip) + print("WEIGHT: " + str(equip_weight) + " lbs.") + print("="*15) diff --git a/examples/sorcerer_ranger_test.py b/examples/sorcerer_ranger_test.py index 9ef7002..3ae548b 100644 --- a/examples/sorcerer_ranger_test.py +++ b/examples/sorcerer_ranger_test.py @@ -8,6 +8,7 @@ sheet by running ``makesheets`` from the command line. # To add your own content, write a .py file with your definitions. # Then, import here using the 'import_homebrew' function. from dungeonsheets import import_homebrew +# from dungeonsheets.equipment_reader import explorers_pack HB_races = import_homebrew("HB_races.py") kits = import_homebrew("kits.py") @@ -82,7 +83,7 @@ shield = "" # Eg "shield" # calculated and added. equipment = kits.explorers_pack.format(rations=9, torches=3, pitons=10, rope=50) + \ - ", human skin mask, sacrificial knife." + ", human skin mask, sacrificial knife, 10 arrows." # If the weight of an item is undetermined, you can include it # in the equipment_weight_dict @@ -112,7 +113,7 @@ wild_shapes = ("Ape", "Wolf", "Mastiff", "Giant Spider", "Tiger", "Dire Wolf", "Brown Bear","Cat") # Ex: ('ape', 'wolf', 'ankylosaurus') # List any monsters whose reference can come at hand # for spells like Find Familiar -companions = ["owl", "poisonous snake"] +companions = ["owl", "poisonous snake", "panther"] # Rangers Beast for Beast Master ranger_beast = "Panther" From 94655735e39e7e6a4c08abca7166f53ed891c291 Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Wed, 30 Mar 2022 01:07:25 -0300 Subject: [PATCH 13/22] Fixed small bugs with big effects Fixed the character_potrait variable in make_sheets. Tested OK with .json files in example. --- dungeonsheets/character.py | 3 ++- dungeonsheets/equipment_reader.py | 17 +++++++++++++++++ dungeonsheets/make_sheets.py | 2 ++ dungeonsheets/weapons.py | 2 +- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/dungeonsheets/character.py b/dungeonsheets/character.py index 3a6f411..dae7263 100644 --- a/dungeonsheets/character.py +++ b/dungeonsheets/character.py @@ -765,7 +765,8 @@ class Character(Creature): weight = equipment_weight_parser(self.equipment, self.equipment_weight_dict) weight += sum([w.weight for w in self.weapons]) - weight += self.armor.weight + if self.armor: + weight += self.armor.weight if self.shield: weight += 6 weight += sum([self.cp, self.sp, self.ep, self.gp, self.pp])/50 diff --git a/dungeonsheets/equipment_reader.py b/dungeonsheets/equipment_reader.py index 9201101..2b4d5aa 100644 --- a/dungeonsheets/equipment_reader.py +++ b/dungeonsheets/equipment_reader.py @@ -13,8 +13,12 @@ from dungeonsheets.armor import all_armors all_weapons = simple_weapons + martial_weapons + firearms item_reader = re.compile(r"(\d*)(\s*)(.+)") gear_weight = {"abacus":2, + "alms box":3, "vial of acid":1, "flask of alchemist's fire":1, + "flasks of alchemist's fire":1, + "flask of oil":1, + "flasks of oil":1, "arrows":1/20, "arrow":1/20, "bowgun needles": 1/50, @@ -34,14 +38,20 @@ gear_weight = {"abacus":2, "bell":0, "blanket":3, "block and tackle":5, + "block of incense":1/20, + "blocks of incense":1/20, + "censer":1/25, "book":5, + "book of lore":5, "glass bottle":2, "bucket":2, "caltrops":2/20, "candle":0, + "candles":0, "crosbow bolt case":1, "scroll case":1, "map case":1, + "cases for maps and scrolls":1, "feet of chain":1, "feet chain":1, "chalk":0, @@ -49,6 +59,7 @@ gear_weight = {"abacus":2, "climber's kit":12, "common clothes":3, "costume":4, + "costumes":4, "fine clothes":6, "traveler's clothes":4, "component pouch":2, @@ -63,6 +74,7 @@ gear_weight = {"abacus":2, "grappling hook":4, "hammer":3, "knife":1, + "small knife":1, "sacrificial knife":1, "sledge hammer":10, "healer's kit":3, @@ -88,6 +100,7 @@ gear_weight = {"abacus":2, "flask of oil":1, "paper sheet":0, "parchment":0, + "sheets of parchment":0, "vial of perfume":0, "miner's pick":10, "piton":0.25, @@ -97,6 +110,7 @@ gear_weight = {"abacus":2, "iron pot":10, "potion of healing":0.5, "pouch":1, + "little bag of sand":1, "quiver":1, "portable ram":35, "days of rations":2, @@ -105,6 +119,7 @@ gear_weight = {"abacus":2, "feet of hempen rope":10/50, "feet hempen rope":10/50, "feet of silk rope":5/50, + "feet of string":1/50, "feet silk rope":5/50, "sack":0.5, "merchant's scale":3, @@ -121,6 +136,7 @@ gear_weight = {"abacus":2, "torch":1, "torches":1, "vial":0, + "vestments":3, "waterskin":5, "wheatstone":1} @@ -162,6 +178,7 @@ tools_weight = {"alchemist's supplies":8, "navigator's tools":2, "poisoner's kit":2, "thieves' tools":1} + gear_weight.update(tools_weight) gear_weight.update({armor.name.lower():armor.weight for armor in all_armors}) gear_weight.update({w.name.lower():w.weight for w in all_weapons}) diff --git a/dungeonsheets/make_sheets.py b/dungeonsheets/make_sheets.py index d181605..894e584 100644 --- a/dungeonsheets/make_sheets.py +++ b/dungeonsheets/make_sheets.py @@ -501,6 +501,8 @@ def make_character_sheet( portrait_file = character.portrait if portrait_file is True: portrait_file=char_file.stem + ".jpeg" + elif portrait_file is False: + portrait_file="" # Set the fields in the FDF basename = char_file.stem char_base = basename + "_char" diff --git a/dungeonsheets/weapons.py b/dungeonsheets/weapons.py index da01a0c..7a51921 100644 --- a/dungeonsheets/weapons.py +++ b/dungeonsheets/weapons.py @@ -385,7 +385,7 @@ class Shortsword(MartialWeapon, MeleeWeapon): cost = "10 gp" base_damage = "1d6" damage_type = "p" - weight = 0 + weight = 2 properties = "Finesse, light" is_finesse = True ability = "strength" From 8c0322651c0a72aead7ceb5c6c1b384ddab6923f Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Wed, 30 Mar 2022 01:11:22 -0300 Subject: [PATCH 14/22] Added tests for dice and equpment parser --- tests/test_character.py | 21 +++++++++++++++++++++ tests/test_dice.py | 20 +++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/tests/test_character.py b/tests/test_character.py index 77e4a15..e321659 100644 --- a/tests/test_character.py +++ b/tests/test_character.py @@ -233,6 +233,27 @@ class TestCharacter(TestCase): # Try passing an Armor object directly char.wield_shield(Shield) self.assertEqual(char.armor_class, 15) + + def test_carrying_weight(self): + char = Character(race="lightfoot halfling", strength=12) + # Check carrying capacity + self.assertEqual(char.carrying_capacity, 180) + # Check the armor weight is included + char.wear_armor(LeatherArmor()) + self.assertEqual(char.carrying_weight, 10) + # Check the shield weight is included + char = Character() + char.wield_shield("shield") + self.assertEqual(char.carrying_weight, 6) + # Check the weight weapons at hand are included + char = Character() + char.wield_weapon("shortsword") + char.wield_weapon("dagger") + self.assertEqual(char.carrying_weight, 3) + # Check the listed equipment is included + char = Character() + char.equipment = "blanket, crowbar" + self.assertEqual(char.carrying_weight, 8) def test_speed(self): # Check that the speed pulls from the character's race diff --git a/tests/test_dice.py b/tests/test_dice.py index 10910a8..0af8fb6 100644 --- a/tests/test_dice.py +++ b/tests/test_dice.py @@ -15,6 +15,11 @@ class TestDice(TestCase): out = dice.read_dice_str("15d10") self.assertEqual(out.faces, 10) self.assertEqual(out.num, 15) + # Modifier + out = dice.read_dice_str("2d20 + 5") + self.assertEqual(out.faces, 20) + self.assertEqual(out.num, 2) + self.assertEqual(out.modifier, 5) # Check a bad value with self.assertRaises(DiceError): dice.read_dice_str("Ed15") @@ -23,7 +28,20 @@ class TestDice(TestCase): self.assertEqual(dice.combine_dice("1d8 + 6 + 2d8 + 12"), "3d8 + 18") self.assertEqual(dice.combine_dice("1d8 + 1d5 + 2d8 + 1d5"), "2d5 + 3d8") - + def test_dice_mean(self): + dd = dice.read_dice_str("1d10") + dd_mean = dice._dice_mean(dd) + self.assertEqual(dd_mean, 5.5) + dd = dice.read_dice_str("2d20+4") + dd_mean = dice._dice_mean(dd) + self.assertEqual(dd_mean, 25) + + def test_dice_roll_mean(self): + dd_mean = dice.dice_roll_mean("1d6") + self.assertEqual(dd_mean, 4) + dd_mean = dice.dice_roll_mean("2d20+2") + self.assertEqual(dd_mean, 23) + def test_simple_rolling(self): num_tests = 100 for _ in range(num_tests): From 00a582125a7bfc2fdf6f389587cd1f2195f99101 Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Sun, 3 Apr 2022 20:38:17 -0300 Subject: [PATCH 15/22] Added Beast Master and Equipment tests --- tests/test_character.py | 25 +++++++++++++++++++++++++ tests/test_equipment_reader.py | 17 +++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 tests/test_equipment_reader.py diff --git a/tests/test_character.py b/tests/test_character.py index e321659..74627fc 100644 --- a/tests/test_character.py +++ b/tests/test_character.py @@ -8,7 +8,9 @@ from dungeonsheets.character import ( Character, Wizard, Druid, + Ranger ) +from dungeonsheets.monsters import Panther from dungeonsheets.weapons import Weapon, Shortsword from dungeonsheets.magic_items import MagicItem from dungeonsheets.armor import Armor, LeatherArmor, Shield @@ -352,3 +354,26 @@ class DruidTestCase(TestCase): not_beast = monsters.Monster() not_beast.description = "monster" self.assertFalse(low_druid.can_assume_shape(not_beast)) + +class BeastMasterTestCase(TestCase): + + def test_ranger_beast(self): + char = Ranger(6, subclasses = ["Beast Master"]) + char.ranger_beast = "Panther" + # Test added proficiency to AC and skills + self.assertEqual(char.ranger_beast.armor_class, 15) + _text = char.ranger_beast.skills.lower().replace(" ", "") + self.assertTrue(_text == 'perception+7,stealth+9') + # Check attack and attack damage changed + _text = char.ranger_beast.__doc__ + _text = _text.lower().replace("\n", "").replace(" ", "") + self.assertTrue('hit:8(1d6+5)' in _text) + # Test HP changed + self.assertTrue(char.ranger_beast.hp_max == 24) + # Check HP gets the best option + char = Ranger(3, subclasses = ["Beast Master"]) + char.ranger_beast = "Panther" + self.assertEqual(char.ranger_beast.hp_max, 13) + + + diff --git a/tests/test_equipment_reader.py b/tests/test_equipment_reader.py new file mode 100644 index 0000000..3603e18 --- /dev/null +++ b/tests/test_equipment_reader.py @@ -0,0 +1,17 @@ +from unittest import TestCase +from dungeonsheets import equipment_reader as equip + +class TestEquipmentReader(TestCase): + + def test_equipment_weight_parser(self): + content = """backpack, bedroll, mess kit, tinderbox, 10 torches, + 9 days of rations, waterskin, 50 feet of hempen rope, Herbalism Kit, + component pouch""" + eq_weight = equip.equipment_weight_parser(content) + self.assertEqual(eq_weight, 62) + # Check additional equipment dict + equipment_weight_dict = {"human skin mask":0.5} + content = content + ", human skin mask" + eq_weight = equip.equipment_weight_parser(content, equipment_weight_dict) + self.assertEqual(eq_weight, 62.5) + \ No newline at end of file From 061ba5ece1d1cf79e00edcb99cb3a5123b2b2b54 Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Sun, 3 Apr 2022 20:39:09 -0300 Subject: [PATCH 16/22] small fix to MSavage_template --- dungeonsheets/forms/MSavage_template.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dungeonsheets/forms/MSavage_template.tex b/dungeonsheets/forms/MSavage_template.tex index f18ec3d..524043b 100644 --- a/dungeonsheets/forms/MSavage_template.tex +++ b/dungeonsheets/forms/MSavage_template.tex @@ -108,8 +108,8 @@ \CP{[% if char.cp > 0 %][[ char.cp ]][% endif %]} \SP{[% if char.sp > 0 %][[ char.sp ]][% endif %]} -\GP{[% if char.ep > 0 %][[ char.ep ]][% endif %]} -\EP{[% if char.gp > 0 %][[ char.gp ]][% endif %]} +\GP{[% if char.gp > 0 %][[ char.gp ]][% endif %]} +\EP{[% if char.ep > 0 %][[ char.ep ]][% endif %]} \PP{[% if char.pp > 0 %][[ char.pp ]][% endif %]} [% for w in char.weapons %] From d1d00b47c3d0b468dbdfbabb0b0c6b5eb38e18ba Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Sun, 3 Apr 2022 20:42:27 -0300 Subject: [PATCH 17/22] small changes to equipment_parser Included predefined packs and other items --- dungeonsheets/equipment_reader.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/dungeonsheets/equipment_reader.py b/dungeonsheets/equipment_reader.py index 2b4d5aa..9b890da 100644 --- a/dungeonsheets/equipment_reader.py +++ b/dungeonsheets/equipment_reader.py @@ -138,7 +138,10 @@ gear_weight = {"abacus":2, "vial":0, "vestments":3, "waterskin":5, - "wheatstone":1} + "wheatstone":1, + "moonstone":1/20, + "quartz":1/20, + "gemstone":1/20} tools_weight = {"alchemist's supplies":8, "brewer's supplies":9, @@ -183,6 +186,28 @@ gear_weight.update(tools_weight) gear_weight.update({armor.name.lower():armor.weight for armor in all_armors}) gear_weight.update({w.name.lower():w.weight for w in all_weapons}) +burglars_pack = """backpack, {ball_bearings} ball bearings, +{string} feet of string, bell, {candles} candles, crowbar, hammer, +{pitons} pitons, hooded lantern, +{oil} flasks of oil, {rations} days of rations, tinderbox, waterskin, +{rope} feet of hempen rope.""" +diplomats_pack = """chest, {cases} cases for maps and scrolls, +fine clothes, bottle of ink, ink pen, lamp, {oil} flasks of oil, +{paper} paper sheet, vial of perfume, sealing wax, soap.""" +dungeoneers_pack = """backpack, crowbar, hammer, {pitons} pitons, +{torches} torches, tinderbox, {rations} days of rations, waterskin, +{rope} feet of hempen rope""" +entertainers_pack = """backpack, bedroll, {costumes} costumes, +{candles} candles, {rations} days of rations, waterskin, disguise kit""" +explorers_pack = """backpack, bedroll, mess kit, tinderbox, {torches} torches, +{rations} days of rations, waterskin, {rope} feet of hempen rope""" +priests_pack = """backpack, blanket, {candles} candles, tinderbox, alms box, +{incense} blocks of incense, censer, vestments, {rations} days of rations, +waterskin""" +scholars_pack = """backpack, book of lore, bottle of ink, ink pen, +{parchment} sheets of parchment, little bag of sand, small knife""" + + def equipment_weight_parser(equipment, gear_dict={}): if not equipment.strip(): return 0 From fb042efae796775fcdb10015384551afe6442a8c Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Tue, 5 Apr 2022 19:12:16 -0300 Subject: [PATCH 18/22] added spell description to appear for race spells The spellsheets shouldn't be restricted to spellcasters. I suppose if a char gains access to a spell by a feature or any other means, the spellsheet should include it. So I changed a line in `make_sheets` so it calls for the proper method in case the char has any spell listed. Also, small changes were made to equipment_reader.py --- dungeonsheets/equipment_reader.py | 5 +++-- dungeonsheets/make_sheets.py | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dungeonsheets/equipment_reader.py b/dungeonsheets/equipment_reader.py index 9b890da..badfb61 100644 --- a/dungeonsheets/equipment_reader.py +++ b/dungeonsheets/equipment_reader.py @@ -15,6 +15,7 @@ item_reader = re.compile(r"(\d*)(\s*)(.+)") gear_weight = {"abacus":2, "alms box":3, "vial of acid":1, + "acid vials":1, "flask of alchemist's fire":1, "flasks of alchemist's fire":1, "flask of oil":1, @@ -190,10 +191,10 @@ burglars_pack = """backpack, {ball_bearings} ball bearings, {string} feet of string, bell, {candles} candles, crowbar, hammer, {pitons} pitons, hooded lantern, {oil} flasks of oil, {rations} days of rations, tinderbox, waterskin, -{rope} feet of hempen rope.""" +{rope} feet of hempen rope""" diplomats_pack = """chest, {cases} cases for maps and scrolls, fine clothes, bottle of ink, ink pen, lamp, {oil} flasks of oil, -{paper} paper sheet, vial of perfume, sealing wax, soap.""" +{paper} paper sheet, vial of perfume, sealing wax, soap""" dungeoneers_pack = """backpack, crowbar, hammer, {pitons} pitons, {torches} torches, tinderbox, {rations} days of rations, waterskin, {rope} feet of hempen rope""" diff --git a/dungeonsheets/make_sheets.py b/dungeonsheets/make_sheets.py index 894e584..2cd0ebf 100644 --- a/dungeonsheets/make_sheets.py +++ b/dungeonsheets/make_sheets.py @@ -412,7 +412,7 @@ def make_character_content( content.append( create_magic_items_content(character, content_suffix=content_format, use_dnd_decorations=fancy_decorations) ) - if character.is_spellcaster: + if len(getattr(character, 'spells', [])) > 0: content.append( create_spellbook_content(character, content_suffix=content_format, use_dnd_decorations=fancy_decorations) ) From 8e3669554aade6dec28212f764e55fb38f948ec7 Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Tue, 5 Apr 2022 23:39:02 -0300 Subject: [PATCH 19/22] Add files via upload From 52069b0fbf16ceb392a5096ddbb05d0d085a1354 Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Tue, 5 Apr 2022 23:39:36 -0300 Subject: [PATCH 20/22] Add files via upload --- dungeonsheets/forms/MSavage_template.tex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dungeonsheets/forms/MSavage_template.tex b/dungeonsheets/forms/MSavage_template.tex index 524043b..f2c1394 100644 --- a/dungeonsheets/forms/MSavage_template.tex +++ b/dungeonsheets/forms/MSavage_template.tex @@ -75,7 +75,7 @@ \CharismaProficiency{[[ "charisma" in char.saving_throw_proficiencies ]]} \AcrobaticsProficiency{[[ "acrobatics" in char.skill_proficiencies ]]} -\AnimalHandlingProficiency{[[ "animal_handling" in char.skill_proficiencies ]]} +\AnimalHandlingProficiency{[[ "animal handling" in char.skill_proficiencies ]]} \ArcanaProficiency{[[ "arcana" in char.skill_proficiencies ]]} \AthleticsProficiency{[[ "athletics" in char.skill_proficiencies ]]} \DeceptionProficiency{[[ "deception" in char.skill_proficiencies ]]} @@ -89,7 +89,7 @@ \PerformanceProficiency{[[ "performance" in char.skill_proficiencies ]]} \PersuasionProficiency{[[ "persuasion" in char.skill_proficiencies ]]} \ReligionProficiency{[[ "religion" in char.skill_proficiencies ]]} -\SleightOfHandProficiency{[[ "sleight_of_hand" in char.skill_proficiencies ]]} +\SleightOfHandProficiency{[[ "sleight of hand" in char.skill_proficiencies ]]} \StealthProficiency{[[ "stealth" in char.skill_proficiencies ]]} \SurvivalProficiency{[[ "survival" in char.skill_proficiencies ]]} From ed8a9f73e28b700f8aa6e9b86c9a17d598ae700c Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Wed, 6 Apr 2022 16:41:46 -0300 Subject: [PATCH 21/22] New name to come in terms with pytest --- examples/sorcerer_ranger.py | 182 ++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 examples/sorcerer_ranger.py diff --git a/examples/sorcerer_ranger.py b/examples/sorcerer_ranger.py new file mode 100644 index 0000000..3ae548b --- /dev/null +++ b/examples/sorcerer_ranger.py @@ -0,0 +1,182 @@ +"""This file describes the heroic adventurer DooDee. +It's used primarily for saving characters from create-character, +where there will be many missing sections. +Modify this file as you level up and then re-generate the character +sheet by running ``makesheets`` from the command line. +""" + +# To add your own content, write a .py file with your definitions. +# Then, import here using the 'import_homebrew' function. +from dungeonsheets import import_homebrew +# from dungeonsheets.equipment_reader import explorers_pack +HB_races = import_homebrew("HB_races.py") +kits = import_homebrew("kits.py") + +dungeonsheets_version = '0.17.1' +name = "DooDee" +player_name = "George Martin" + +# Be sure to list Primary class first +classes = ['Druid', 'Ranger', 'Sorceror'] # ex: ['Wizard'] or ['Rogue', 'Fighter'] +levels = [5, 3, 1] # ex: [10] or [3, 2] +subclasses = ["Circle of the Moon", "Beast Master", None ] # ex: ['Necromacy'] or ['Thief', None] +background = "Hermit" +race = HB_races.WildhuntShifter +alignment = "Lawful Neutral" + +xp = 14587 +hp_max = 77 +# hp_temp = 5 +# hp_current = 31 +inspiration = 1 # integer inspiration value + +# Ability Scores +strength = 10 +dexterity = 17 +constitution = 14 +intelligence = 16 +wisdom = 14 +charisma = 12 + +# Select what skills you're proficient with +skill_proficiencies = ('insight', 'perception', + 'medicine', 'survival', 'religion') + +# Any skills you have "expertise" (Bard/Rogue) in +skill_expertise = () + +# Named features / feats that aren't part of your classes, race, or background. +# Also include Eldritch Invocations and features you make multiple selection of +# (like Maneuvers for Fighter, Metamagic for Sorcerors, Trick Shots for +# Gunslinger, etc.) +# Example: +# features = ('Tavern Brawler',) # take the optional Feat from PHB +features = (HB_races.WildCompanion, "Sharpshooter") + +# If selecting among multiple feature options: ex Fighting Style +# Example (Fighting Style): +# feature_choices = ('Archery',) +feature_choices = ("Archery",) + +# Weapons/other proficiencies not given by class/race/background +weapon_proficiencies = () # ex: ('shortsword', 'quarterstaff') +_proficiencies_text = ("Cartographer's tools", ) # ex: ("thieves' tools",) + +# Proficiencies and languages +languages = """Common, Druidic, Elven, Draconic""" + +# Inventory +# Get yourself some money +cp = 0 +sp = 95 +ep = 12 +gp = 140 +pp = 0 + +# Put your equipped weapons and armor here +weapons = ("Longbow", 'Quarterstaff','dagger') # Example: ('shortsword', 'longsword') +magic_items = () # Example: ('ring of protection',) +armor = "Hide Armor" # Eg "leather armor" +shield = "" # Eg "shield" + +# The equipment goes here. A total weight will be automatically +# calculated and added. +equipment = kits.explorers_pack.format(rations=9, torches=3, + pitons=10, rope=50) + \ + ", human skin mask, sacrificial knife, 10 arrows." + +# If the weight of an item is undetermined, you can include it +# in the equipment_weight_dict +equipment_weight_dict = {"human skin mask":0.5} + +attacks_and_spellcasting = \ +""" +Quarterstaff with Shillelagh: +5 to hit, 1d8+3/b +""" + +# List of known spells +# Example: spells_prepared = ('magic missile', 'mage armor') +spells_prepared = ("Shillelagh", "Druidcraft", "Cure Wounds", "Faerie Fire", + "Entangle", "Thunderwave", "Fog Cloud", "Barkskin") + + +# Which spells have not been prepared +__spells_unprepared = ("Speak with animals", "Charm Person", + "Animal Friendship", "Create or Destroy Water", + "Goodberry", "Purify Food and Drink", "Find Familiar") + +# all spells known +spells = spells_prepared + __spells_unprepared + +# Wild shapes for Druid +wild_shapes = ("Ape", "Wolf", "Mastiff", "Giant Spider", "Tiger", + "Dire Wolf", "Brown Bear","Cat") # Ex: ('ape', 'wolf', 'ankylosaurus') +# List any monsters whose reference can come at hand +# for spells like Find Familiar +companions = ["owl", "poisonous snake", "panther"] + +# Rangers Beast for Beast Master +ranger_beast = "Panther" + +# Backstory +# Describe your backstory here +personality_traits = """ +I am introspective. +""" + +ideals = """I search for nature balance.""" + +bonds = """My friends from my village.""" + +flaws = """ + I lose my temper when I see animal corpses as trophies.""" + +features_and_traits = """""" + +portrait = 'shifter_2.png' +age = 15 +height = "1,77m" +weight = "72kg" +eyes = "Black" +skin = "Brown" +hair = "Brown" + + +# optionally, if you set portrait to false, you can include a text +# in the appearance box using the 'appearece_text' variable: +# appearance_text = +additional_description = \ + ''' +Find it better to avoid conflict. +''' + +backstory = \ + ''' + +Born at Makudan Village, helped many other +shifters to overcome the vampire known as Strahd. + +''' + +treasure = \ + ''' + A Dire Wolf tooth + + ''' + +allies = \ + ''' + His childhood friend Krenak + + His elder master Caiubi; + + Druids of Rakshak + + Druids of Makudan + ''' + +org_name = \ + ''' + Druids of Makudan + + ''' From 308e7e43b7adf7d11995242ca878a284d32743d8 Mon Sep 17 00:00:00 2001 From: bw-mutley Date: Wed, 6 Apr 2022 16:42:12 -0300 Subject: [PATCH 22/22] Delete sorcerer_ranger_test.py --- examples/sorcerer_ranger_test.py | 182 ------------------------------- 1 file changed, 182 deletions(-) delete mode 100644 examples/sorcerer_ranger_test.py diff --git a/examples/sorcerer_ranger_test.py b/examples/sorcerer_ranger_test.py deleted file mode 100644 index 3ae548b..0000000 --- a/examples/sorcerer_ranger_test.py +++ /dev/null @@ -1,182 +0,0 @@ -"""This file describes the heroic adventurer DooDee. -It's used primarily for saving characters from create-character, -where there will be many missing sections. -Modify this file as you level up and then re-generate the character -sheet by running ``makesheets`` from the command line. -""" - -# To add your own content, write a .py file with your definitions. -# Then, import here using the 'import_homebrew' function. -from dungeonsheets import import_homebrew -# from dungeonsheets.equipment_reader import explorers_pack -HB_races = import_homebrew("HB_races.py") -kits = import_homebrew("kits.py") - -dungeonsheets_version = '0.17.1' -name = "DooDee" -player_name = "George Martin" - -# Be sure to list Primary class first -classes = ['Druid', 'Ranger', 'Sorceror'] # ex: ['Wizard'] or ['Rogue', 'Fighter'] -levels = [5, 3, 1] # ex: [10] or [3, 2] -subclasses = ["Circle of the Moon", "Beast Master", None ] # ex: ['Necromacy'] or ['Thief', None] -background = "Hermit" -race = HB_races.WildhuntShifter -alignment = "Lawful Neutral" - -xp = 14587 -hp_max = 77 -# hp_temp = 5 -# hp_current = 31 -inspiration = 1 # integer inspiration value - -# Ability Scores -strength = 10 -dexterity = 17 -constitution = 14 -intelligence = 16 -wisdom = 14 -charisma = 12 - -# Select what skills you're proficient with -skill_proficiencies = ('insight', 'perception', - 'medicine', 'survival', 'religion') - -# Any skills you have "expertise" (Bard/Rogue) in -skill_expertise = () - -# Named features / feats that aren't part of your classes, race, or background. -# Also include Eldritch Invocations and features you make multiple selection of -# (like Maneuvers for Fighter, Metamagic for Sorcerors, Trick Shots for -# Gunslinger, etc.) -# Example: -# features = ('Tavern Brawler',) # take the optional Feat from PHB -features = (HB_races.WildCompanion, "Sharpshooter") - -# If selecting among multiple feature options: ex Fighting Style -# Example (Fighting Style): -# feature_choices = ('Archery',) -feature_choices = ("Archery",) - -# Weapons/other proficiencies not given by class/race/background -weapon_proficiencies = () # ex: ('shortsword', 'quarterstaff') -_proficiencies_text = ("Cartographer's tools", ) # ex: ("thieves' tools",) - -# Proficiencies and languages -languages = """Common, Druidic, Elven, Draconic""" - -# Inventory -# Get yourself some money -cp = 0 -sp = 95 -ep = 12 -gp = 140 -pp = 0 - -# Put your equipped weapons and armor here -weapons = ("Longbow", 'Quarterstaff','dagger') # Example: ('shortsword', 'longsword') -magic_items = () # Example: ('ring of protection',) -armor = "Hide Armor" # Eg "leather armor" -shield = "" # Eg "shield" - -# The equipment goes here. A total weight will be automatically -# calculated and added. -equipment = kits.explorers_pack.format(rations=9, torches=3, - pitons=10, rope=50) + \ - ", human skin mask, sacrificial knife, 10 arrows." - -# If the weight of an item is undetermined, you can include it -# in the equipment_weight_dict -equipment_weight_dict = {"human skin mask":0.5} - -attacks_and_spellcasting = \ -""" -Quarterstaff with Shillelagh: +5 to hit, 1d8+3/b -""" - -# List of known spells -# Example: spells_prepared = ('magic missile', 'mage armor') -spells_prepared = ("Shillelagh", "Druidcraft", "Cure Wounds", "Faerie Fire", - "Entangle", "Thunderwave", "Fog Cloud", "Barkskin") - - -# Which spells have not been prepared -__spells_unprepared = ("Speak with animals", "Charm Person", - "Animal Friendship", "Create or Destroy Water", - "Goodberry", "Purify Food and Drink", "Find Familiar") - -# all spells known -spells = spells_prepared + __spells_unprepared - -# Wild shapes for Druid -wild_shapes = ("Ape", "Wolf", "Mastiff", "Giant Spider", "Tiger", - "Dire Wolf", "Brown Bear","Cat") # Ex: ('ape', 'wolf', 'ankylosaurus') -# List any monsters whose reference can come at hand -# for spells like Find Familiar -companions = ["owl", "poisonous snake", "panther"] - -# Rangers Beast for Beast Master -ranger_beast = "Panther" - -# Backstory -# Describe your backstory here -personality_traits = """ -I am introspective. -""" - -ideals = """I search for nature balance.""" - -bonds = """My friends from my village.""" - -flaws = """ - I lose my temper when I see animal corpses as trophies.""" - -features_and_traits = """""" - -portrait = 'shifter_2.png' -age = 15 -height = "1,77m" -weight = "72kg" -eyes = "Black" -skin = "Brown" -hair = "Brown" - - -# optionally, if you set portrait to false, you can include a text -# in the appearance box using the 'appearece_text' variable: -# appearance_text = -additional_description = \ - ''' -Find it better to avoid conflict. -''' - -backstory = \ - ''' - -Born at Makudan Village, helped many other -shifters to overcome the vampire known as Strahd. - -''' - -treasure = \ - ''' - A Dire Wolf tooth - - ''' - -allies = \ - ''' - His childhood friend Krenak - - His elder master Caiubi; - - Druids of Rakshak - - Druids of Makudan - ''' - -org_name = \ - ''' - Druids of Makudan - - '''