diff --git a/dungeonsheets/character.py b/dungeonsheets/character.py index a3112ce..b85d40a 100644 --- a/dungeonsheets/character.py +++ b/dungeonsheets/character.py @@ -124,6 +124,9 @@ class Character(): # Create temporary spell _spells.append(spells.create_spell(name=spell_name, level=9)) # raise AttributeError(msg) + # Sort by name + _spells.sort(key=lambda spell: spell.name) + # Save list of spells to character atribute if attr == 'spells': # Instantiate them all for the spells list self.spells = tuple(S() for S in _spells) diff --git a/dungeonsheets/make_sheets.py b/dungeonsheets/make_sheets.py index 74c611a..48dbbf9 100644 --- a/dungeonsheets/make_sheets.py +++ b/dungeonsheets/make_sheets.py @@ -110,7 +110,6 @@ def create_spells_pdf(character, basename, flatten=False): # # Uncomment to post field names instead: # for field in field_names: # fields.append((field, field)) - fields.append(('Check Box 3083', True)) # Make the actual pdf dirname = os.path.dirname(os.path.abspath(__file__)) src_pdf = os.path.join(dirname, 'blank-spell-sheet-default.pdf') diff --git a/dungeonsheets/spells.py b/dungeonsheets/spells.py index b4f3306..c3cf007 100644 --- a/dungeonsheets/spells.py +++ b/dungeonsheets/spells.py @@ -1325,10 +1325,33 @@ class ChillTouch(Spell): components = ('V', 'S') materials = "" duration = "1 round" - magic_school = "Necromany" + magic_school = "Necromancy" classes = ('Sorceror', 'Warlock', 'Wizard') +class ChromaticOrb(Spell): + """You hurl a 4-inch-diameter sphere of energy at a creature that you + can see within range. You choose acid, cold, fire, lightning, + poison, or thunder for the type of orb you create, and then make a + ranged spell attack against the target. If the attack hits, the + creature takes 3d8 damage of the type you chose. + + **At Higher Levels.** When you cast this spell using a spell slot of + 2nd level or higher, the damage increases by 1d8 for each slot + level above 1st. + + """ + name = "Chromatic Orb" + level = 1 + casting_time = "1 action" + casting_range = "90 feet" + components = ('V', 'S', 'M') + materials = "A diamond worth at least 50 gp" + duration = "Instantaneous" + magic_school = "Evocation" + classes = ('Sorceror', 'Wizard') + + class CircleOfDeath(Spell): """A sphere of negative energy ripples out in a 60-foot- radius sphere from a point within range. Each creature in that area must make a @@ -1347,7 +1370,7 @@ class CircleOfDeath(Spell): components = ('V', 'S', 'M') materials = "the powder of a crushed black pearl worth at least 500 gp" duration = "Instantaneous" - magic_school = "Necromany" + magic_school = "Necromancy" classes = ('Sorceror', 'Warlock', 'Wizard') @@ -3440,6 +3463,52 @@ class Passwall(Spell): classes = ('Wizard',) +class PhantasmalForce(Spell): + """You craft an illusion that takes root in the mind of a creature + that you can see within range. The target must make an + Intelligence saving throw. On a failed save, you create a + phantasmal object, creature or other visible phenomenon of your + choice that is no larger than a 10-foot cube and that is + perceivable only to the target for the duration. This spell has no + effect on undead or constructs. + + The phantasm includes sound, temperature, and other stimuli, also + evident only to the creature. The target can use its action to + examine the phantasm with an Intelligence (Investigation) check + against your spell save DC. If the check succeeds, the target + realizes that the phantasm is an illusion, and the spell + ends. While a target is affected by the spell, the target treats + the phantasm as if it were real. The target rationalizes any + illogical outcomes from interacting with the phantasm. For + example, a target attempting to walk across a phantasmal bridge + that spans a chasm falls once it steps onto the bridge. If the + target survives the fall, it still believes that the bridge exists + and comes up with some other explanation for its fall-it was + pushed, it slipped, or a strong wind might have knocked it off. + + An affected target is so convinced of the phantasm's reality that + it can even take damage from the illusion. A phantasm created to + appear as a creature can attack the target. Similarly, a phantasm + created to appear as fire, a pool of acid, or lava can burn the + target. Each round on your turn, the phantasm can deal 1d6 psychic + damage to the target if it is in the phantasm's area or within 5 + feet of the phantasm, provided that the illusion is of a creature + or hazard that could logically deal damage, such as by + attacking. The target perceives the damage as a type appropriate + to the illusion. + + """ + name = "Phantasmal Force" + level = 2 + casting_time = "1 action" + casting_range = "60 feet" + components = ('V', 'S', 'M') + materials = "A bit of fleece" + duration = "Concentration, up to 1 minute" + magic_school = "Illusion" + classes = ('Bard', 'Sorceror', 'Wizard') + + class PoisonSpray(Spell): """You extend your hand toward a creature you can see within range and project a puff of noxious gas from your palm. The creature must diff --git a/setup.py b/setup.py index 0acaf57..b836d4b 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ def read(fname): setup(name='dungeonsheets', - version='0.2.1', + version='0.2.2', description='Dungeons and Dragons 5e Character Tools', long_description=read('README.rst'), long_description_content_type='text/x-rst',