Added spell proficiencies and an example warlock character sheet.

This commit is contained in:
Mark Wolfman
2018-04-02 00:01:17 -05:00
parent ab8df8819a
commit bab2413f4d
8 changed files with 183 additions and 21 deletions
+8 -1
View File
@@ -107,7 +107,14 @@ class Character():
self.race = MyRace() self.race = MyRace()
elif attr == 'spells': elif attr == 'spells':
# Create a list of actual spell objects # Create a list of actual spell objects
self.spells = tuple(findattr(spells, spell_name)() for spell_name in val) _spells = []
for spell_name in val:
try:
_spells.append(findattr(spells, spell_name)())
except AttributeError:
msg = f'Spell "{spell_name}" not defined. Please add it to ``spells.py``'
raise AttributeError(msg)
self.spells = tuple(_spells)
elif attr == 'spells_prepared': elif attr == 'spells_prepared':
# Create a list of actual spell objects # Create a list of actual spell objects
self.spells_prepared = tuple(findattr(spells, spell_name) self.spells_prepared = tuple(findattr(spells, spell_name)
+16 -1
View File
@@ -88,14 +88,29 @@ def create_spells_pdf(character, basename, flatten=False):
8: (10101, 10100, 10102, 10103, 10104, 10105, 10106, ), 8: (10101, 10100, 10102, 10103, 10104, 10105, 10106, ),
9: (10108, 10107, 10109, 101010, 101011, 101012, 101013), 9: (10108, 10107, 10109, 101010, 101011, 101012, 101013),
} }
prep_numbers = {
1: (251, 309, 3010, 3011, 3012, 3013, 3014, 3015, 3016, 3017, 3018, 3019, ),
2: (313, 310, 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, 3030, ),
3: (315, 314, 3031, 3032, 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, 3041, ),
4: (317, 316, 3042, 3043, 3044, 3045, 3046, 3047, 3048, 3049, 3050, 3051, 3052, ),
5: (319, 318, 3053, 3054, 3055, 3056, 3057, 3058, 3059, ),
6: (321, 320, 3060, 3061, 3062, 3063, 3064, 3065, 3066, ),
7: (323, 322, 3067, 3068, 3069, 3070, 3071, 3072, 3073, ),
8: (325, 324, 3074, 3075, 3076, 3077, 3078, ),
9: (327, 326, 3079, 3080, 3081, 3082, 3083, ),
}
for level in field_numbers.keys(): for level in field_numbers.keys():
spells = tuple(spl for spl in character.spells if spl.level == level) spells = tuple(spl for spl in character.spells if spl.level == level)
field_names = tuple(f'Spells {i}' for i in field_numbers[level]) field_names = tuple(f'Spells {i}' for i in field_numbers[level])
for spell, field in zip(spells, field_names): prep_names = tuple(f'Check Box {i}' for i in prep_numbers[level])
for spell, field, chk_field in zip(spells, field_names, prep_names):
fields.append((field, spell.name)) fields.append((field, spell.name))
is_prepared = any([isinstance(spell, Spl) for Spl in character.spells_prepared])
fields.append((chk_field, is_prepared))
# # Uncomment to post field names instead: # # Uncomment to post field names instead:
# for field in field_names: # for field in field_names:
# fields.append((field, field)) # fields.append((field, field))
fields.append(('Check Box 3083', True))
# Make the actual pdf # Make the actual pdf
dirname = os.path.dirname(os.path.abspath(__file__)) dirname = os.path.dirname(os.path.abspath(__file__))
src_pdf = os.path.join(dirname, 'blank-spell-sheet-default.pdf') src_pdf = os.path.join(dirname, 'blank-spell-sheet-default.pdf')
+97 -18
View File
@@ -1,6 +1,7 @@
class Spell(): class Spell():
"""A magical spell castable by a player character.""" """A magical spell castable by a player character."""
level = 0 level = 0
name = "Unknown spell"
casting_time = "1 action" casting_time = "1 action"
casting_range = "60 ft" casting_range = "60 ft"
components = ("V", "S") components = ("V", "S")
@@ -17,7 +18,7 @@ class Spell():
class AcidSplash(Spell): class AcidSplash(Spell):
"""You hurl a bubble of acid. Choose one creature within range, or """You hurl a bubble of acid. Choose one creature within range, or
choose two crealures within range that are within 5 feet of each choose two creatures within range that are within 5 feet of each
other. A target must succeed on a Dexterity saving throw or take other. A target must succeed on a Dexterity saving throw or take
1d6 acid damage. 1d6 acid damage.
@@ -26,8 +27,9 @@ class AcidSplash(Spell):
""" """
name = "Acid Splash" name = "Acid Splash"
classes = ('Sorceror', 'Wizard', ) level = 0
magic_school = "Conjuration" magic_school = "Conjuration"
classes = ('Sorceror', 'Wizard', )
class Aid(Spell): class Aid(Spell):
@@ -125,6 +127,7 @@ class AnimalFriendship(Spell):
slot level above 1st. slot level above 1st.
""" """
name = "Animal Friendship"
level = 1 level = 1
casting_time = "1 action" casting_time = "1 action"
casting_range = "30 ft" casting_range = "30 ft"
@@ -564,6 +567,7 @@ class ArmsOfHadar(Spell):
level above 1st. level above 1st.
""" """
name = "Arms of Hadar"
level = 1 level = 1
casting_time = "1 action" casting_time = "1 action"
casting_range = "Self (10-foot radius)" casting_range = "Self (10-foot radius)"
@@ -789,13 +793,14 @@ class BeaconOfHope(Spell):
healing. healing.
""" """
name = "Beacon of Hope"
level = 3 level = 3
casting_time = "1 action" casting_time = "1 action"
casting_range = "30 feet"
components = ('V', 'S') components = ('V', 'S')
materials = ""
duration = "Concentration, up to 1 minute" duration = "Concentration, up to 1 minute"
magic_school = "Abjuration" magic_school = "Abjuration"
classes = () classes = ('Cleric', )
class BladeBarrier(Spell): class BladeBarrier(Spell):
@@ -828,6 +833,7 @@ class BladeWard(Spell):
attacks. attacks.
""" """
name = "Blade Ward"
level = 0 level = 0
casting_time = "1 action" casting_time = "1 action"
components = ('V', 'S') components = ('V', 'S')
@@ -836,9 +842,7 @@ class BladeWard(Spell):
classes = ('Bard', 'Sorceror', 'Warlock', 'Wizard') classes = ('Bard', 'Sorceror', 'Warlock', 'Wizard')
class Bless(Spell): class Bless(Spell):
"""You bless up to three creatures of your choice within """You bless up to three creatures of your choice within
range. Whenever a target makes an attack roll or a saving throw range. Whenever a target makes an attack roll or a saving throw
before the spell ends, the target can roll a d4 and add the number before the spell ends, the target can roll a d4 and add the number
@@ -982,6 +986,7 @@ class ChillTouch(Spell):
(2d8), 11th level (3d8), and 17th level (4d8). (2d8), 11th level (3d8), and 17th level (4d8).
""" """
name = "Chill Touch"
level = 0 level = 0
casting_time = "1 action" casting_time = "1 action"
casting_range = "120 feet" casting_range = "120 feet"
@@ -1137,6 +1142,7 @@ class DancingLights(Spell):
the spells range. the spells range.
""" """
name = "Dancing Lights"
level = 0 level = 0
casting_time = "1 action" casting_time = "1 action"
casting_range = "120 feet" casting_range = "120 feet"
@@ -1524,7 +1530,32 @@ class Earthquake(Spell):
classes = () classes = ()
class ElementalWeapon(Spell):
"""A nonmagical weapon you touch becomes a magic weapon. Choose one of
the following damage types: acid, cold, fire, lightning, or
thunder. For the duration, the weapon has a +1 bonus to attack
rolls and deals an extra 1d4 damage of the chosen type when it
hits.
**At Higher Levels** When you cast this spell using a spell slot
of 5th or 6th level, the bonus to attack rolls increases to +2 and
the extra damage increases to 2d4. When you use a spell slot of
7th level or higher, the bonus increases to +3 and the extra
damage increases to 3d4.
"""
name = 'Elemental Weapon'
level = 3
casting_time = "1 action"
casting_range = "Touch"
components = ('V', 'S')
duration = "Concentration, up to 1 hour"
magic_school = "Transmutation"
classes = ('Paladin', )
class Etherealness(Spell): class Etherealness(Spell):
"""You step into the border regions of the Ethereal Plane, in the area """You step into the border regions of the Ethereal Plane, in the area
where it overlaps with your current plane. You remain in the where it overlaps with your current plane. You remain in the
Border Ethereal for the duration or until you use your action to Border Ethereal for the duration or until you use your action to
@@ -1722,26 +1753,33 @@ class FlamingSphere(Spell):
your choice within range and lasts for the duration. Any creature your choice within range and lasts for the duration. Any creature
that ends its turn within 5 feet of the sphere must make a that ends its turn within 5 feet of the sphere must make a
Dexterity saving throw. The creature takes 2d6 fire damage on a Dexterity saving throw. The creature takes 2d6 fire damage on a
failed save, or half as much damage on a successful one. As a failed save, or half as much damage on a successful one.
bonus action, you can move the sphere up to 30 feet. If you ram
the sphere into a creature, that creature must make the saving As a bonus action, you can move the sphere up to 30 feet. If you
ram the sphere into a creature, that creature must make the saving
throw against the spheres damage, and the sphere stops moving throw against the spheres damage, and the sphere stops moving
this turn. When you move the sphere, you can direct it over this turn.
barriers up to 5 feet tall and jump it across pits up to 10 feet
wide. The sphere ignites flammable objects not being worn or When you move the sphere, you can direct it over barriers up to 5
carried, and it sheds bright light in a 20-foot radius and dim feet tall and jump it across pits up to 10 feet wide. The sphere
light for an additional 20 feet. At Higher Levels. When you cast ignites flammable objects not being worn or carried, and it sheds
this spell using a spell slot of 3rd level or higher, the damage bright light in a 20-foot radius and dim light for an additional
increases by 1d6 for each slot level above 2nd. 20 feet.
**At Higher Levels** When you cast this spell using a spell slot
of 3rd level or higher, the damage increases by 1d6 for each slot
level above 2nd.
""" """
name = "Flaming Sphere"
level = 2 level = 2
casting_time = "1 action" casting_time = "1 action"
casting_range = "60 feet"
components = ('V', 'S', 'M') components = ('V', 'S', 'M')
materials = "a bit of tallow, a pinch of brimstone, and a dusting of powdered iron" materials = "a bit of tallow, a pinch of brimstone, and a dusting of powdered iron"
duration = "Concentration, up to 1 minute" duration = "Concentration, up to 1 minute"
magic_school = "Conjuration" magic_school = "Conjuration"
classes = () classes = ('Druid', 'Wizard', )
class Fly(Spell): class Fly(Spell):
@@ -1762,6 +1800,46 @@ class Fly(Spell):
classes = () classes = ()
class FindSteed(Spell):
"""You summon a spirit that assumes the form of an unusually
intelligent, strong and loyal steed, creating a long lasting bond
with it. Appearing in an unoccupied space within range, the steed
takes on a form that you choose: a warhorse, a pony, a camel, an
elk, or a mastiff. (Your DM might allow other animals to be
summoned as steeds.) The steed has the statistics of the chosen
form, though it is a celestial, fey or fiend (your choice) instead
of its normal type. Additionally if your steed has an intelligence
of 5 or less, its intelligence becomes 6, and it gains the ability
to understand one language of your choice that you speak.
The steed serves as a mount, both in combat and out, and you have
an instinctive bond with it that allows you to fight as a seamless
unit. While mounted on your steed, you can make any spell you cast
that targets only you also target your steed.
When the steed drops to 0 hit points, it disappears, leaving
behind no physical form. You can dismiss your steed at any time as
an action, causing it to disappear. In either case, casting this
spell again summons the same steed, restored to its hit point
maximum.
While the steed is within 1 mile of you, you can communicate with
it telepathically.
You cannot have more than one steed bonded by this spell at a
time. As an action, you can release the steed from its bond at any
time, causing it to disappear.
"""
name = "Find Steed"
level = 2
casting_time = "10 minutes"
components = ('V', 'S')
duration = "Instantaneous"
magic_school = "Conjuration"
classes = ('Paladin', )
class Foresight(Spell): class Foresight(Spell):
"""You touch a willing creature and bestow a limited ability to see """You touch a willing creature and bestow a limited ability to see
into the immediate future. For the duration, the target cant be into the immediate future. For the duration, the target cant be
@@ -1916,13 +1994,14 @@ class Guidance(Spell):
the ability check. The spell then ends. the ability check. The spell then ends.
""" """
name = "Guidance"
level = 0 level = 0
casting_time = "1 action" casting_time = "1 action"
components = ('V', 'S') components = ('V', 'S')
materials = "" materials = ""
duration = "Concentration, up to 1 minute" duration = "Concentration, up to 1 minute"
magic_school = "Divination" magic_school = "Divination"
classes = () classes = ('Cleric', 'Druid')
class GuidingBolt(Spell): class GuidingBolt(Spell):
Binary file not shown.
Binary file not shown.
+61
View File
@@ -0,0 +1,61 @@
name = 'Warlock'
character_class = 'wizard'
player_name = 'Mark'
background = "Criminal"
race = "Rock Gnome"
level = 5
alignment = "True neutral"
xp = 2790 * 3
hp_max = 28
# Ability Scores
strength = 11
dexterity = 14
constitution = 10
intelligence = 17
wisdom = 11
charisma = 8
skill_proficiencies = [
'deception',
'investigation',
'nature',
'stealth',
]
# Proficiencies and languages
languages = "Common, gnomish."
# Inventory
cp = 1792
sp = 987
ep = 44
gp = 803
pp = 3
weapons = ('lance', 'net')
equipment = (
"""Gallon of ale, red cloak, shortsword, longsword, jar of salt, vodka
(500mL), potion of vitality, wand of magic missiles (7/7),
component pouch, spellbook, backpack, bottle of ink, ink pen, 10
sheets of parchment, small knife, tome of historical lore, holy
symbol, prayer book, set of common clothes, pouch.""")
# List of known spells
spells = ('blade ward', 'guidance', 'mage hand', 'animal friendship',
'arms of hadar', 'find steed', 'flaming sphere', 'beacon of hope',
'elemental weapon')
# Which spells have been prepared (not including cantrips)
spells_prepared = ('blade ward', 'guidance', 'mage hand', 'animal friendship',
'arms of hadar', 'find steed', 'flaming sphere', 'beacon of hope',
'elemental weapon')
# Backstory
personality_traits = """"""
ideals = """"""
bonds = """"""
flaws = """"""
features_and_traits = (
"""""")
Binary file not shown.
+1 -1
View File
@@ -54,7 +54,7 @@ personality_traits = """I use polysyllabic words that convey the impression of
erudition. Also, Ive spent so long in the temple that I have little erudition. Also, Ive spent so long in the temple that I have little
experience dealing with people on a casual basis.""" experience dealing with people on a casual basis."""
ideals = """Knowledge. The path to power and self- improvement is through ideals = """Knowledge. The path to power and self-improvement is through
knowledge.""" knowledge."""
bonds = """The tome I carry with me is the record of my lifes work so far, bonds = """The tome I carry with me is the record of my lifes work so far,