mirror of
https://github.com/Threnklyn/dungeon-sheets.git
synced 2026-06-06 21:01:26 +02:00
Added spell proficiencies and an example warlock character sheet.
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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
@@ -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 spell’s range.
|
the spell’s 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 sphere’s damage, and the sphere stops moving
|
throw against the sphere’s 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 can’t be
|
into the immediate future. For the duration, the target can’t 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.
@@ -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
@@ -54,7 +54,7 @@ personality_traits = """I use polysyllabic words that convey the impression of
|
|||||||
erudition. Also, I’ve spent so long in the temple that I have little
|
erudition. Also, I’ve 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 life’s work so far,
|
bonds = """The tome I carry with me is the record of my life’s work so far,
|
||||||
|
|||||||
Reference in New Issue
Block a user