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 0000000..489d91b Binary files /dev/null and b/examples/shifter_2.png differ 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 + + '''