Fixed some docstrings for spells and features.

This commit is contained in:
Mark Wolfman
2021-04-08 13:36:58 -05:00
parent 4719ad4305
commit 2aa5afd538
39 changed files with 2643 additions and 2657 deletions
+255 -269
View File
@@ -11,27 +11,27 @@ class _SpecialistSpells(Feature):
_name = "Select One"
source = "Artificer"
_spells = {
3: [],
5: [],
9: [],
13: [],
17: []
}
3: [],
5: [],
9: [],
13: [],
17: []
}
spells_known = []
spells_prepared = []
@property
def name(self):
return "{:s} Spells".format(self._name)
return "{:s} Spells".format(self._name)
def __init__(self, owner=None):
if owner is not None:
level = owner.Artificer.level
for lvl, spl in self._spells.items():
if level >= lvl:
self.spells_known.extend(spl)
self.spells_prepared.extend(spl)
super().__init__(owner=owner)
if owner is not None:
level = owner.Artificer.level
for lvl, spl in self._spells.items():
if level >= lvl:
self.spells_known.extend(spl)
self.spells_prepared.extend(spl)
super().__init__(owner=owner)
# Alchemist
@@ -52,7 +52,6 @@ class ArtificerSpellcasting(Feature):
After you gain the Infuse Item feature at 2nd level, you can also use any
item bearing one of your infusions as a spellcasting focus.
"""
name = "Spellcasting"
source = "Artificer"
@@ -61,7 +60,6 @@ class ArtificerRitualCasting(Feature):
"""You can cast an artificer spell as a ritual if that spell has the ritual
tag and you have the spell prepared.
"""
name = "Ritual Casting"
source = "Artificer"
@@ -73,41 +71,40 @@ class FirearmProficiency(Feature):
your artificer has been exposed to the operation of such weapons, your
artificer is proficient with them.
"""
name = "Optional Rule: Firearm Proficiency"
source = "Artificer"
class MagicalTinkering(Feature):
"""At 1st level, you learn how to invest a spark of magic into mundane
objects. To use this ability, you must have tinker's tools or other
artisan's tools in hand. You then touch a Tiny nonmagical object as an
action and give it one of the following magical properties of your choice:
objects. To use this ability, you must have tinker's tools or
other artisan's tools in hand. You then touch a Tiny nonmagical
object as an action and give it one of the following magical
properties of your choice:
- The object sheds bright light in a 5-foot radius and dim light
for an additional 5 feet.
- Whenever tapped by a creature, the object emits a recorded
message that can be heard up to 10 feet away. You utter the
message when you bestow this property on the object, and the
recording can be no more than 6 seconds long.
- The object continuously emits your choice of an odor or a
nonverbal sound (wind, waves, chirping, or the like). The chosen
phenomenon is perceivable up to 10 feet away.
- A static visual effect appears on one of the object's
surfaces. This effect can be a picture, up to 25 words of text,
lines and shapes, or a mixture of these elements, as you
like. The chosen property lasts indefinitely. As an action, you
can touch the object and end the property early. You can bestow
magic on multiple objects, touching one object each time you use
this feature, though a single object can only bear one property
at a time. The maximum number of objects you can affect with
this feature at one time is equal to your Intelligence modifier
(minimum of one object). If you try to exceed your maximum, the
oldest property immediately ends, and then the new property
applies.
- The object sheds bright light in a 5-foot radius and dim light for an \
additional 5 feet.
- Whenever tapped by a creature, the object emits a recorded message that \
can be heard up to 10 feet away. You utter the message when you bestow \
this property on the object, and the recording can be no more than 6 \
seconds long.
- The object continuously emits your choice of an odor or a nonverbal sound \
(wind, waves, chirping, or the like). The chosen phenomenon is \
perceivable up to 10 feet away.
- A static visual effect appears on one of the object's surfaces. This \
effect can be a picture, up to 25 words of text, lines and shapes, or a \
mixture of these elements, as you like. The chosen property lasts \
indefinitely. As an action, you can touch the object and end the property \
early. You can bestow magic on multiple objects, touching one object each \
time you use this feature, though a single object can only bear one \
property at a time. The maximum number of objects you can affect with \
this feature at one time is equal to your Intelligence modifier (minimum \
of one object). If you try to exceed your maximum, the oldest property \
immediately ends, and then the new property applies.
"""
name = "Magical Tinkering"
source = "Artificer"
@@ -116,67 +113,69 @@ class InfuseItem(Feature):
"""At 2nd level, you gain the ability to imbue mundane items with certain
magical infusions. The magic items you create with this feature are
effectively prototypes of permanent items.
**Infusions known**
When you gain this feature, pick four artificer infusions
to learn, choosing from the "Artificer Infusions" section at the end of the
class's description. You learn additional infusions of your choice when you
reach certain levels in this class, as shown in the Infusions Known column
of the Artificer table. Whenever you gain a level in this class, you can
re­place one of the artificer infusions you learned with a new one.
**Infusing an item**
Whenever you finish a long rest, you can touch a non­magical object and
imbue it with one of your artificer in­fusions, turning it into a magic
item. An infusion works on only certain kinds of objects, as specified in
the infusion's description. If the item requires attunement, you can
attune yourself to it the instant you infuse the item. If you decide to
attune to the item later, you must do so using the normal process for
attunement (see "Attunement" in chapter 7 of the Dungeon Master's Guide).
Your infusion remains in an item indefinitely, but when you die, the
infusion vanishes after a number of days have passed equal to your
Intelligence modifier (minimum of 1 day). The infusion also vanishes if you
give up your knowledge of the infusion for another one. You can infuse more
than one nonmagical object at the end of a long rest; the maximum number of
objects appears in the Infused Items column of the Artificer table. You
must touch each of the objects, and each of your infusions can be in only
one object at a time. Moreover, no object can bear more than one of your
infusions at a time. If you try to exceed your maximum number of
in­fusions, the oldest infusion immediately ends, and then the new
infusion applies.
Infusions known
When you gain this feature, pick four artificer infusions to
learn, choosing from the "Artificer Infusions" section at the
end of the class's description. You learn additional infusions
of your choice when you reach certain levels in this class, as
shown in the Infusions Known column of the Artificer
table. Whenever you gain a level in this class, you can re­place
one of the artificer infusions you learned with a new one.
Infusing an item
Whenever you finish a long rest, you can touch a non­magical
object and imbue it with one of your artificer in­fusions,
turning it into a magic item. An infusion works on only certain
kinds of objects, as specified in the infusion's description. If
the item requires attunement, you can attune yourself to it the
instant you infuse the item. If you decide to attune to the item
later, you must do so using the normal process for attunement
(see "Attunement" in chapter 7 of the Dungeon Master's Guide).
Your infusion remains in an item indefinitely, but when you die,
the infusion vanishes after a number of days have passed equal
to your Intelligence modifier (minimum of 1 day). The infusion
also vanishes if you give up your knowledge of the infusion for
another one. You can infuse more than one nonmagical object at
the end of a long rest; the maximum number of objects appears in
the Infused Items column of the Artificer table. You must touch
each of the objects, and each of your infusions can be in only
one object at a time. Moreover, no object can bear more than one
of your infusions at a time. If you try to exceed your maximum
number of in­fusions, the oldest infusion immediately ends, and
then the new infusion applies.
"""
_name = "Infuse Item"
source = "Artificer"
_infusions = {
# level: (infusions known, infused items)
2: (4, 2),
3: (4, 2),
4: (4, 2),
5: (4, 2),
6: (6, 3),
7: (6, 3),
8: (6, 3),
9: (6, 3),
10: (8, 4),
11: (8, 4),
12: (8, 4),
13: (8, 4),
14: (10, 5),
15: (10, 5),
16: (10, 5),
17: (10, 5),
18: (12, 6),
19: (12, 6),
20: (12, 6),
}
# level: (infusions known, infused items)
2: (4, 2),
3: (4, 2),
4: (4, 2),
5: (4, 2),
6: (6, 3),
7: (6, 3),
8: (6, 3),
9: (6, 3),
10: (8, 4),
11: (8, 4),
12: (8, 4),
13: (8, 4),
14: (10, 5),
15: (10, 5),
16: (10, 5),
17: (10, 5),
18: (12, 6),
19: (12, 6),
20: (12, 6),
}
@property
def name(self):
known_infusions = self._infusions[self.owner.Artificer.level][0]
infused_items = self._infusions[self.owner.Artificer.level][1]
name_ext = " ({:d} Infusions Known, {:d} Infused Items)"
return self._name + name_ext.format(known_infusions, infused_items)
known_infusions = self._infusions[self.owner.Artificer.level][0]
infused_items = self._infusions[self.owner.Artificer.level][1]
name_ext = " ({:d} Infusions Known, {:d} Infused Items)"
return self._name + name_ext.format(known_infusions, infused_items)
class ArtificerSpecialist(Feature):
@@ -185,7 +184,6 @@ class ArtificerSpecialist(Feature):
class's description. Your choice grants you features at 5th level and again
at 9th and 15th level.
"""
name = "Artificer Specialist"
source = "Artificer"
@@ -198,7 +196,6 @@ class TheRightToolForTheJob(Feature):
Though the product of magic, the tools are nonmagical, and they vanish when
you use this feature again.
"""
name = "The Right Tool For The Job"
source = "Artificer"
@@ -207,22 +204,22 @@ class ToolExpertise(Feature):
"""Starting at 6th level, your proficiency bonus is doubled for any ability
check you make that uses your proficiency with a tool.
"""
name = "Tool Expertise"
source = "Artificer"
class FlashOfGenius(Feature):
"""Starting at 7th level, you gain the ability to come up with solutions
under pressure. When you or another creature you can see within 30 feet of
you makes an ability check or a saving throw, you can use your reaction to
add your Intelligence modifier to the roll.
"""Starting at 7th level, you gain the ability to come up with
solutions under pressure. When you or another creature you can see
within 30 feet of you makes an ability check or a saving throw,
you can use your reaction to add your Intelligence modifier to the
roll.
You can use this feature a number of times equal to your
Intelligence modifier (minimum of once). You regain all expended
uses when you finish a long rest.
You can use this feature a number of times equal to your Intelligence
modifier (minimum of once). You regain all expended uses when you finish a
long rest.
"""
name = "Flash Of Genius"
source = "Artificer"
@@ -230,46 +227,45 @@ class FlashOfGenius(Feature):
class MagicItemAdept(Feature):
"""When you reach 10th level, you achieve a profound understanding of how
to use and make magic items:
- You can attune to up to four magic items at once.
- If you craft a magic item with a rarity of common or uncommon, it takes
you a quarter of the normal time, and it costs you half as much of the
usual gold.
- If you craft a magic item with a rarity of common or uncommon,
it takes you a quarter of the normal time, and it costs you half
as much of the usual gold.
"""
name = "Magic Item Adept"
source = "Artificer"
class SpellStoringItem(Feature):
"""At 11th level, you learn how to store a spell in an object. Whenever you
finish a long rest, you can touch one simple or martial weapon or one item
that you can use as a spellcasting focus, and you store a spell in it,
choosing a 1st- or 2nd-level spell from the artificer spell list that
requires 1 action to cast (you needn't have it prepared).
While holding the object, a creature can take an action to produce the
spell's effect from it, using your spellcasting ability modifier. If the
spell requires concentration, the creature must concentrate. The spell
stays in the object until it's been used a number of times equal to twice
your Intelligence modifier (minimum of twice) or until you use this fe
ature again to store a spell in an object.
"""At 11th level, you learn how to store a spell in an
object. Whenever you finish a long rest, you can touch one simple
or martial weapon or one item that you can use as a spellcasting
focus, and you store a spell in it, choosing a 1st- or 2nd-level
spell from the artificer spell list that requires 1 action to cast
(you needn't have it prepared).
While holding the object, a creature can take an action to produce
the spell's effect from it, using your spellcasting ability
modifier. If the spell requires concentration, the creature must
concentrate. The spell stays in the object until it's been used a
number of times equal to twice your Intelligence modifier (minimum
of twice) or until you use this fe ature again to store a spell in
an object.
"""
name = "Spell-Storing Item"
source = "Artificer"
class MagicItemSavant(Feature):
"""At 14th level, your skill with magic items deepens more:
- You can attune to up to five magic items at once.
- You ignore all class, race, spell, and level requirements on attuning to
or using a magic item.
- You ignore all class, race, spell, and level requirements on
attuning to or using a magic item.
"""
name = "Magic Item Savant"
source = "Artificer"
@@ -278,7 +274,6 @@ class MagicItemMaster(Feature):
"""Starting at 18th level, you can attune to up to six magic items at
once.
"""
name = "Magic Item Master"
source = "Artificer"
@@ -286,15 +281,14 @@ class MagicItemMaster(Feature):
class SoulOfArtifice(Feature):
"""At 20th level, you develop a mystical connection to your magic items,
which you can draw on for protection:
- You gain a +1 bonus to all saving throws per magic item you are currently
attuned to.
- If you're reduced to 0 hit points but not killed out­right, you can use
your reaction to end one of your artificer infusions, causing you to drop
to 1 hit point instead of 0.
- If you're reduced to 0 hit points but not killed out­right, you
can use your reaction to end one of your artificer infusions,
causing you to drop to 1 hit point instead of 0.
"""
name = "Soul of Artifice"
source = "Artificer"
@@ -305,7 +299,6 @@ class AlchemistToolProficiency(Feature):
with alchemist's supplies. If you already have this proficiency, you gain
proficiency with one other type of artisan's tools of your choice.
"""
name = "Tool Proficiency"
source = "Artificer (Alchemist)"
@@ -316,15 +309,14 @@ class AlchemistSpells(_SpecialistSpells):
table. These spells count as artificer spells for you, but they don't count
against the number of artificer spells you prepare.
"""
_name = "Alchemist"
_spells = {
3: [spells.HealingWord, spells.RayOfSickness],
5: [spells.FlamingSphere, spells.MelfsAcidArrow],
9: [spells.GaseousForm, spells.MassHealingWord],
13: [spells.Blight, spells.DeathWard],
17: [spells.Cloudkill, spells.RaiseDead]
}
3: [spells.HealingWord, spells.RayOfSickness],
5: [spells.FlamingSphere, spells.MelfsAcidArrow],
9: [spells.GaseousForm, spells.MassHealingWord],
13: [spells.Blight, spells.DeathWard],
17: [spells.Cloudkill, spells.RaiseDead]
}
class ExperimentalElixir(Feature):
@@ -369,7 +361,6 @@ class ExperimentalElixir(Feature):
alter self spell. The drinker determines the transformation caused by the
spell, the effects of which last for 10 minutes.
"""
name = "Experimental Elixir"
source = "Artificer (Alchemist)"
@@ -382,7 +373,6 @@ class AlchemicalSavant(Feature):
be a damage roll that deals acid, fire, necrotic, or poison damage, and the
bonus equals your Intelligence modifier (minimum of +1).
"""
name = "Alchemical Savant"
source = "Artificer (Alchemist)"
@@ -392,16 +382,15 @@ class RestorativeReagents(Feature):
restorative reagents into some of your works:
- Whenever a creature drinks an experimental elixir you created, the
creature gains temporary hit points equal to 2d6 + your Intelligence
modifier (minimum of 1 temporary hit point).
creature gains temporary hit points equal to 2d6 + your Intelligence
modifier (minimum of 1 temporary hit point).
- You can cast lesser restoration without expending a spell slot and
without preparing the spell, provided you use alchemist's supplies as the
spellcasting focus. You can do so a number of times equal to your
Intelligence modifier (minimum of once), and you regain all expended uses
when you finish a long rest.
without preparing the spell, provided you use alchemist's supplies as the
spellcasting focus. You can do so a number of times equal to your
Intelligence modifier (minimum of once), and you regain all expended uses
when you finish a long rest.
"""
name = "Restorative Reagents"
source = "Artificer (Alchemist)"
@@ -412,15 +401,14 @@ class ChemicalMastery(Feature):
ailments:
- You gain resistance to acid damage and poison damage, and you are immune
to the poisoned condition.
to the poisoned condition.
- You can cast greater restoration and heal without expending a spell
slot, without preparing the spell, and without material components,
provided you use alchemist's supplies as the spellcasting focus. Once
you cast either spell with this feature, you can't cast that spell with
it again until you finish a long rest.
slot, without preparing the spell, and without material components,
provided you use alchemist's supplies as the spellcasting focus. Once
you cast either spell with this feature, you can't cast that spell with
it again until you finish a long rest.
"""
name = "Chemical Mastery"
source = "Artificer (Alchemist)"
@@ -432,15 +420,14 @@ class ArtilleristSpells(_SpecialistSpells):
Spells table. These spells count as artificer spells for you, but they
don't count against the number of artificer spells you prepare.
"""
_name = "Artillerist"
_spells = {
3: [spells.Shield, spells.Thunderwave],
5: [spells.ScorchingRay, spells.Shatter],
9: [spells.Fireball, spells.WindWall],
13: [spells.IceStorm, spells.WallOfFire],
17: [spells.ConeOfCold, spells.WallOfForce]
}
3: [spells.Shield, spells.Thunderwave],
5: [spells.ScorchingRay, spells.Shatter],
9: [spells.Fireball, spells.WindWall],
13: [spells.IceStorm, spells.WallOfFire],
17: [spells.ConeOfCold, spells.WallOfForce]
}
class ArtilleristToolProficiency(Feature):
@@ -448,7 +435,6 @@ class ArtilleristToolProficiency(Feature):
with woodcarver's tools. If you already have this proficiency, you gain
proficiency with one other type of artisan's tools of your choice.
"""
name = "Tool Proficiency"
source = "Artificer (Artillerist)"
@@ -498,25 +484,25 @@ class EldritchCannon(Feature):
number of temporary hit points equal to 1d8 + your Intelligence modifier
(minimum of +1)
"""
name = "Eldritch Cannon"
source = "Artificer (Artillerist)"
class ArcaneFirearm(Feature):
"""At 5th level, you know how to turn a wand, staff, or rod into an arcane
firearm, a conduit for your destructive spells. When you finish a long
rest, you can use wood­carver's tools to carve special sigils into a wand,
staff, or rod and thereby turn it into your arcane firearm. The sigils
disappear from the object if you later carve them on a different item. The
sigils otherwise last indefinitely.
You can use your arcane firearm as a spellcasting focus for your artificer
spells. When you cast an artificer spell through the firearm, roll a d8,
and you gain a bonus to one of the spell's damage rolls equal to the
number rolled.
"""At 5th level, you know how to turn a wand, staff, or rod into an
arcane firearm, a conduit for your destructive spells. When you
finish a long rest, you can use wood­carver's tools to carve
special sigils into a wand, staff, or rod and thereby turn it into
your arcane firearm. The sigils disappear from the object if you
later carve them on a different item. The sigils otherwise last
indefinitely.
You can use your arcane firearm as a spellcasting focus for your
artificer spells. When you cast an artificer spell through the
firearm, roll a d8, and you gain a bonus to one of the spell's
damage rolls equal to the number rolled.
"""
name = "Arcane Firearm"
source = "Artificer (Artillerist)"
@@ -524,16 +510,15 @@ class ArcaneFirearm(Feature):
class ExplosiveCannon(Feature):
"""Starting at 9th level, every eldritch cannon you create is more
destructive:
- The cannon's damage rolls all increase by 1d8.
- As an action, you can command the cannon to detonate if you are within 60
feet of it. Doing so destroys the cannon and forces each creature within
20 feet of it to make a Dexterity saving throw against your spell save
DC, taking 3d8 force damage on a failed save or half as much damage on a
successful one.
- As an action, you can command the cannon to detonate if you are
within 60 feet of it. Doing so destroys the cannon and forces
each creature within 20 feet of it to make a Dexterity saving
throw against your spell save DC, taking 3d8 force damage on a
failed save or half as much damage on a successful one.
"""
name = "Explosive Cannon"
source = "Artificer (Artillerist)"
@@ -541,46 +526,47 @@ class ExplosiveCannon(Feature):
class FortifiedPosition(Feature):
"""Starting at 15th level, you're a master at forming well-defended
emplacements using Eldritch Cannon:
- You and your allies have half cover while within 10 feet of a cannon you
create with Eldritch Cannon, as a result of a shimmering field of magical
protection that the cannon emits.
- You can now have two cannons at the same time. You can create two with
the same action (but not the same spell slot), and you can activate both
of them with the same bonus action. You determine whether the cannons are
identical to each other or different. You can't create a third cannon
while you have two.
- You and your allies have half cover while within 10 feet of a
cannon you create with Eldritch Cannon, as a result of a
shimmering field of magical protection that the cannon emits.
- You can now have two cannons at the same time. You can create
two with the same action (but not the same spell slot), and you
can activate both of them with the same bonus action. You
determine whether the cannons are identical to each other or
different. You can't create a third cannon while you have two.
"""
name = "Fortified Position"
source = "Artificer (Artillerist)"
# Battle Smith
class BattleSmithSpells(_SpecialistSpells):
"""Starting at 3rd level, you always have certain spells prepared after you
reach particular levels in this class, as shown in the Battle Smith Spells
table. These spells count as artificer spells for you, but they don't count
against the number of artificer spells you prepare.
"""Starting at 3rd level, you always have certain spells prepared
after you reach particular levels in this class, as shown in the
Battle Smith Spells table. These spells count as artificer spells
for you, but they don't count against the number of artificer
spells you prepare.
"""
_name = "Battle Smith"
_spells = {
3: [spells.Heroism, spells.Shield],
5: [spells.BrandingSmite, spells.WardingBond],
9: [spells.AuraOfVitality, spells.ConjureBarrage],
13: [spells.AuraOfPurity, spells.FireShield],
17: [spells.BanishingSmite, spells.MassCureWounds]
}
3: [spells.Heroism, spells.Shield],
5: [spells.BrandingSmite, spells.WardingBond],
9: [spells.AuraOfVitality, spells.ConjureBarrage],
13: [spells.AuraOfPurity, spells.FireShield],
17: [spells.BanishingSmite, spells.MassCureWounds]
}
class BattleSmithToolProficiency(Feature):
"""When you adopt this specialization at 3rd level, you gain proficiency
with smith's tools. If you already have this proficiency, you gain
proficiency with one other type of artisan's tools of your choice.
"""When you adopt this specialization at 3rd level, you gain
proficiency with smith's tools. If you already have this
proficiency, you gain proficiency with one other type of artisan's
tools of your choice.
"""
name = "Tool Proficiency"
source = "Artificer (Battle Smith)"
@@ -588,71 +574,72 @@ class BattleSmithToolProficiency(Feature):
class BattleReady(Feature):
"""When you reach 3rd level, your combat training and your experiments with
magic have paid off in two ways:
- You gain proficiency with martial weapons.
- When you attack with a magic weapon, you can use your Intelligence
modifier, instead of Strength or Dexterity modifier, for the attack and
damage rolls.
- When you attack with a magic weapon, you can use your
Intelligence modifier, instead of Strength or Dexterity
modifier, for the attack and damage rolls.
"""
name = "Battle Ready"
source = "Artificer (Battle Smith)"
class SteelDefender(Feature):
"""By 3rd level, your tinkering has borne you a faithful companion, a steel
defender. It is friendly to you and your companions, and it obeys your
commands. See this creature's game statistics in the steel defender stat
block. You determine the creature's appearance and whether it has two legs
or fo ur; your choice has no effect on its game statistics.
In combat, the steel defender shares your initiative count, but it takes
its turn immediately after yours. It can move and use its reaction on its
own, but the only action it takes on its turn is the Dodge action, unless
you take a bonus action on your turn to command it to take one of the
actions in its stat block or the Dash, Disengage, Help, Hide, or Search
action.
If the *mending* spell is cast on it, it regains 2d6 hit points. If it has
died within the last hour, you can use your smith's tools as an action to
revive it, provided you are within 5 feet of it and you expend a spell slot
of 1st level or higher. The steel defender returns to life after 1 minute
with all its hit points restored.
At the end of a long rest, you can create a new steel defender if you have
your smith's tools with you. If you already have a steel defender from this
feature, the first one immediately perishes.
"""By 3rd level, your tinkering has borne you a faithful companion, a
steel defender. It is friendly to you and your companions, and it
obeys your commands. See this creature's game statistics in the
steel defender stat block. You determine the creature's appearance
and whether it has two legs or four; your choice has no effect on
its game statistics.
In combat, the steel defender shares your initiative count, but it
takes its turn immediately after yours. It can move and use its
reaction on its own, but the only action it takes on its turn is
the Dodge action, unless you take a bonus action on your turn to
command it to take one of the actions in its stat block or the
Dash, Disengage, Help, Hide, or Search action.
If the *mending* spell is cast on it, it regains 2d6 hit
points. If it has died within the last hour, you can use your
smith's tools as an action to revive it, provided you are within 5
feet of it and you expend a spell slot of 1st level or higher. The
steel defender returns to life after 1 minute with all its hit
points restored.
At the end of a long rest, you can create a new steel defender if
you have your smith's tools with you. If you already have a steel
defender from this feature, the first one immediately perishes.
"""
name = "Steel Defender"
source = "Artificer (Battle Smith)"
class ExtraAttackBattleSmith(Feature):
"""Starting at 5th level, you can attack twice, rather than once, whenever
you take the Attack action on your turn.
"""Starting at 5th level, you can attack twice, rather than once,
whenever you take the Attack action on your turn.
"""
name = "Extra Attack"
source = "Artificer (Battle Smith)"
class ArcaneJolt(Feature):
"""At 9th level, you learn new ways to channel arcane energy to harm or
heal. When either you hit a target with a magic weapon attack or your steel
defender hits a target, you can channel magical energy through the strike
to create one of the following effects:
"""At 9th level, you learn new ways to channel arcane energy to harm
or heal. When either you hit a target with a magic weapon attack
or your steel defender hits a target, you can channel magical
energy through the strike to create one of the following effects:
- The target takes an extra 2d6 force damage.
- Choose one creature or object you can see within 30 feet of the target.
Healing energy flows into the chosen recipient, restoring 2d6 hit points
to it. You can use this energy a number of times equal to your
Intelligence modifier (minimum of once), but you can do so no more than
once on a turn. You regain all expended uses when you finish a long rest
- Choose one creature or object you can see within 30 feet of the
target. Healing energy flows into the chosen recipient,
restoring 2d6 hit points to it. You can use this energy a number
of times equal to your Intelligence modifier (minimum of once),
but you can do so no more than once on a turn. You regain all
expended uses when you finish a long rest
"""
name = "Arcane Jolt"
source = "Artificer (Battle Smith)"
@@ -660,15 +647,14 @@ class ArcaneJolt(Feature):
class ImprovedDefender(Feature):
"""At 15th level, your Arcane jolt and steel defender be­come more
powerful:
- The extra damage and the healing of your Arcane jolt both increase to
4d6.
- The extra damage and the healing of your Arcane jolt both
increase to 4d6.
- Your steel defender gains a +2 bonus to Armor Class.
- Whenever your steel defender uses its Deflect Attack, the attacker takes
force damage equal to 1d4 +your Intelligence modifier.
- Whenever your steel defender uses its Deflect Attack, the
attacker takes force damage equal to 1d4 +your Intelligence
modifier.
"""
name = "Improved Defender"
source = "Artificer (Battle Smith)"
+62 -64
View File
@@ -7,18 +7,16 @@ class Rage(Feature):
"""In battle, you fight with primal ferocity. On your turn, you can enter a
rage as a bonus action. While raging, you gain the following benefits if
you aren't wearing heavy armor:
--You have advantage on Strength checks and
Strength saving throws.
--When you make a melee weapon attack using
Strength, you gain a bonus to the damage roll that increases as you gain
levels as a barbarian, as shown in the Rage Damage column of the Barbarian
table.
--You have resistance to bludgeoning, piercing, and slashing
damage.
- You have advantage on Strength checks and Strength saving
throws.
- When you make a melee weapon attack using Strength, you gain a
bonus to the damage roll that increases as you gain levels as a
barbarian, as shown in the Rage Damage column of the Barbarian
table.
- You have resistance to bludgeoning, piercing, and slashing
damage.
If you are able to cast spells, you can't cast them or concentrate on them
while raging. Your rage lasts for 1 minute. It ends early if you are
knocked unconscious or if your turn ends and you haven't attacked a hostile
@@ -26,31 +24,31 @@ class Rage(Feature):
your rage on your turn as a bonus action. Once you have raged the number of
times shown for your barbarian level in the Rages column of the Barbarian
table, you must finish a long rest before you can rage again
"""
_name = "Rage"
source = "Barbarian"
@property
def name(self):
level = self.owner.Barbarian.level
num = 2
if level >= 3:
num = 3
if level >= 6:
num = 4
if level >= 12:
num = 5
if level >= 17:
num = 6
if level >= 20:
num = 100
damage = '+2'
if level >= 9:
damage = "+3"
if level >= 16:
damage = "+4"
return self._name + " ({:s}, {:d}x/LR)".format(damage, num)
level = self.owner.Barbarian.level
num = 2
if level >= 3:
num = 3
if level >= 6:
num = 4
if level >= 12:
num = 5
if level >= 17:
num = 6
if level >= 20:
num = 100
damage = '+2'
if level >= 9:
damage = "+3"
if level >= 16:
damage = "+4"
return self._name + " ({:s}, {:d}x/LR)".format(damage, num)
class UnarmoredDefenseBarbarian(Feature):
@@ -296,19 +294,19 @@ class TotemSpirit(FeatureSelector):
"""
options = {'bear spirit': BearSpirit,
'eagle spirit': EagleSpirit,
'wolf spirit': WolfSpirit,
'elk spirit': ElkSpirit,
'tiger spirit': TigerSpirit}
'eagle spirit': EagleSpirit,
'wolf spirit': WolfSpirit,
'elk spirit': ElkSpirit,
'tiger spirit': TigerSpirit}
name = "Totem Spirit (Select One)"
source = "Barbarian (Totem Warrior)"
class BearAspect(FeatureSelector):
"""You gain the might of a bear. Your carrying capacity (including maximum
load and maximum lift) is doubled, and you have advantage on Strength
checks made to push, pull, lift, or break objects.
"""You gain the might of a bear. Your carrying capacity (including
maximum load and maximum lift) is doubled, and you have advantage
on Strength checks made to push, pull, lift, or break objects.
"""
name = "Aspect of the Beast (Bear)"
source = "Barbarian (Totem Warrior)"
@@ -372,10 +370,10 @@ class BeastAspect(FeatureSelector):
"""
options = {'bear aspect': BearAspect,
'eagle aspect': EagleAspect,
'wolf aspect': WolfAspect,
'elk aspect': ElkAspect,
'tiger aspect': TigerAspect}
'eagle aspect': EagleAspect,
'wolf aspect': WolfAspect,
'elk aspect': ElkAspect,
'tiger aspect': TigerAspect}
name = "Aspect of the Beast (Select One)"
source = "Barbarian (Totem Warrior)"
@@ -460,10 +458,10 @@ class TotemicAttunement(FeatureSelector):
"""
options = {'bear attunement': BearAttunement,
'eagle attunement': EagleAttunement,
'wolf attunement': WolfAttunement,
'elk attunement': ElkAttunement,
'tiger attunement': TigerAttunement}
'eagle attunement': EagleAttunement,
'wolf attunement': WolfAttunement,
'elk attunement': ElkAttunement,
'tiger attunement': TigerAttunement}
name = "Totemic Attunement (Select One)"
source = "Barbarian (Totem Warrior)"
@@ -544,13 +542,13 @@ class SpiritShield(Feature):
@property
def name(self):
level = self.owner.Barbarian.level
damage = " (2d6)"
if level >= 10:
damage = " (3d6)"
if level >= 14:
damage = " (4d6)"
return self._name + damage
level = self.owner.Barbarian.level
damage = " (2d6)"
if level >= 10:
damage = " (3d6)"
if level >= 14:
damage = " (4d6)"
return self._name + damage
class ConsultTheSpirits(Feature):
@@ -663,8 +661,8 @@ class StormAura(FeatureSelector):
tundra
"""
options = {'desert': DesertAura,
'sea': SeaAura,
'tundra': TundraAura}
'sea': SeaAura,
'tundra': TundraAura}
name = "Storm Aura (Select One)"
source = "Barbarian (Storm Herald)"
@@ -723,8 +721,8 @@ class StormSoul(FeatureSelector):
"""
options = {'desert': DesertSoul,
'sea': SeaSoul,
'tundra': TundraSoul}
'sea': SeaSoul,
'tundra': TundraSoul}
name = "Storm Soul (Select One)"
source = "Barbarian (Storm Herald)"
@@ -795,8 +793,8 @@ class RagingStorm(FeatureSelector):
"""
options = {'desert': RagingDesert,
'sea': RagingSea,
'tundra': RagingTundra}
'sea': RagingSea,
'tundra': RagingTundra}
name = "Raging Storm (Select One)"
source = "Barbarian (Storm Herald)"
@@ -815,9 +813,9 @@ class DivineFury(Feature):
@property
def name(self):
level = self.owner.Barbarian.level
damage = " (1d6+{:d})".format(level//2)
return self._name + damage
level = self.owner.Barbarian.level
damage = " (1d6+{:d})".format(level//2)
return self._name + damage
class WarriorOfTheGods(Feature):
+37 -37
View File
@@ -31,19 +31,19 @@ class BardicInspiration(Feature):
@property
def name(self):
level = self.owner.Bard.level
die = 'd6'
if level >= 5:
die = 'd8'
if level >= 10:
die = 'd10'
if level >= 15:
die = 'd12'
num = max(1, self.owner.charisma.modifier)
rest = 'LR'
if level >= 5: # font of inspiration
rest = 'SR'
return self._name + " ({:d}{:s}/{:s})".format(num, die, rest)
level = self.owner.Bard.level
die = 'd6'
if level >= 5:
die = 'd8'
if level >= 10:
die = 'd10'
if level >= 15:
die = 'd12'
num = max(1, self.owner.charisma.modifier)
rest = 'LR'
if level >= 5: # font of inspiration
rest = 'SR'
return self._name + " ({:d}{:s}/{:s})".format(num, die, rest)
class JackOfAllTrades(Feature):
@@ -70,15 +70,15 @@ class SongOfRest(Feature):
@property
def name(self):
level = self.owner.Bard.level
die = ' (1d6)'
if level >= 9:
die = ' (1d8)'
if level >= 13:
die = ' (1d10)'
if level >= 17:
die = ' (1d12)'
return self._name + die
level = self.owner.Bard.level
die = ' (1d6)'
if level >= 9:
die = ' (1d8)'
if level >= 13:
die = ' (1d10)'
if level >= 17:
die = ' (1d12)'
return self._name + die
class BardExpertise(Feature):
@@ -243,9 +243,9 @@ class MantleOfInspiration(Feature):
@property
def name(self):
level = self.owner.Bard.level
hp = 5 + 3*(level // 5)
return self._name + " ({:d}HP)".format(hp)
level = self.owner.Bard.level
hp = 5 + 3*(level // 5)
return self._name + " ({:d}HP)".format(hp)
class EnthrallingPerformance(Feature):
@@ -329,9 +329,9 @@ class BardFightingStyle(FeatureSelector):
two-weapon fighting
"""
options = {'dueling': Dueling,
'two-weapon fighting': TwoWeaponFighting,
'two-weapon': TwoWeaponFighting,
'dual wield': TwoWeaponFighting}
'two-weapon fighting': TwoWeaponFighting,
'two-weapon': TwoWeaponFighting,
'dual wield': TwoWeaponFighting}
name = "Fighting Style (Select One)"
source = "Bard (College of Swords)"
@@ -391,15 +391,15 @@ class PsychicBlades(Feature):
@property
def name(self):
level = self.owner.Bard.level
dice = ' (2d6)'
if level >= 5:
dice = ' (3d6)'
if level >= 10:
dice = ' (5d6)'
if level >= 15:
dice = ' (8d6)'
return self._name + dice
level = self.owner.Bard.level
dice = ' (2d6)'
if level >= 5:
dice = ' (3d6)'
if level >= 10:
dice = ' (5d6)'
if level >= 15:
dice = ' (8d6)'
return self._name + dice
class WordsOfTerror(Feature):
+33 -33
View File
@@ -26,13 +26,13 @@ class ChannelDivinity(Feature):
@property
def name(self):
level = self.owner.Cleric.level
if level < 6:
return "Channel Divinity (1x/SR)"
elif level < 18:
return "Channel Divinity (2x/SR)"
else:
return "Channel Divinity (3x/SR)"
level = self.owner.Cleric.level
if level < 6:
return "Channel Divinity (1x/SR)"
elif level < 18:
return "Channel Divinity (2x/SR)"
else:
return "Channel Divinity (3x/SR)"
class TurnUndead(Feature):
@@ -64,17 +64,17 @@ class DestroyUndead(Feature):
@property
def name(self):
level = self.owner.Cleric.level
name = self._name + ' (CR 1/2)'
if level >= 8:
name = self._name + ' (CR 1)'
if level >= 11:
name = self._name + ' (CR 2)'
if level >= 14:
name = self._name + ' (CR 3)'
if level >= 17:
name = self._name + ' (CR 4)'
return name
level = self.owner.Cleric.level
name = self._name + ' (CR 1/2)'
if level >= 8:
name = self._name + ' (CR 1)'
if level >= 11:
name = self._name + ' (CR 2)'
if level >= 14:
name = self._name + ' (CR 3)'
if level >= 17:
name = self._name + ' (CR 4)'
return name
class DivineIntervention(Feature):
@@ -107,11 +107,11 @@ class DivineStrike(Feature):
@property
def name(self):
level = self.owner.Cleric.level
damage = ' (1d8)'
if level >= 14:
damage = ' (2d8)'
return self._name + damage
level = self.owner.Cleric.level
damage = ' (1d8)'
if level >= 14:
damage = ' (2d8)'
return self._name + damage
# Knowledge Domain
@@ -272,8 +272,8 @@ class WardingFlare(Feature):
@property
def name(self):
times = max(1, self.owner.wisdom.modifier)
return self._name + " ({:d}x/LR)".format(times)
times = max(1, self.owner.wisdom.modifier)
return self._name + " ({:d}x/LR)".format(times)
class RadianceOfTheDawn(ChannelDivinity):
@@ -389,8 +389,8 @@ class WrathOfTheStorm(Feature):
@property
def name(self):
num_uses = max(1, self.owner.wisdom.modifier)
return self._name + ' ({:d}x/LR)'.format(num_uses)
num_uses = max(1, self.owner.wisdom.modifier)
return self._name + ' ({:d}x/LR)'.format(num_uses)
class DestructiveWrath(ChannelDivinity):
@@ -511,8 +511,8 @@ class WarPriest(Feature):
@property
def name(self):
num = max(1, self.owner.wisdom.modifier)
return self._name + " ({:d}x/LR)".format(num)
num = max(1, self.owner.wisdom.modifier)
return self._name + " ({:d}x/LR)".format(num)
class GuidedStrike(ChannelDivinity):
@@ -732,8 +732,8 @@ class EyesOfTheGrave(Feature):
@property
def name(self):
num = max(1, self.owner.wisdom.modifier)
return self._name + " ({:d}x/LR)".format(num)
num = max(1, self.owner.wisdom.modifier)
return self._name + " ({:d}x/LR)".format(num)
class PathToTheGrave(ChannelDivinity):
@@ -763,8 +763,8 @@ class SentinelAtDeathsDoor(Feature):
@property
def name(self):
num = max(1, self.owner.wisdom.modifier)
return self._name + " ({:d}x/LR)".format(num)
num = max(1, self.owner.wisdom.modifier)
return self._name + " ({:d}x/LR)".format(num)
class KeeperOfSouls(Feature):
+119 -113
View File
@@ -4,73 +4,79 @@ from dungeonsheets.features.features import Feature, FeatureSelector
# PHB
class WildShape(Feature):
"""Starting at 2nd level, you can use your action to magically assume the
shape of a beast that you have seen before. You can use this feature
twice. You regain expended uses when you finish a short or long rest. Your
druid level determines the beasts you can transform into, as shown in the
Beast Shapes table. At 2nd level, for example, you can transform into any
beast that has a challenge rating of 1/4 or lower that doesn't have a
flying or swimming speed.
2nd Level: Max CR 1/4, No Flying/Swimming (ex: Wolf)
4th Level: Max CR 1/2, No Flying (ex: Crocodile)
8th Level: Max CR 1 (ex: Giant Eagle)
You can stay in a beast shape for a number of hours equal to half your
druid level (rounded down). You then revert to your normal form unless you
expend another use of this feature. You can revert to your normal form
earlier by using a bonus action on your turn. You automatically revert if
you fall unconscious, drop to 0 hit points, or die.
"""Starting at 2nd level, you can use your action to magically assume
the shape of a beast that you have seen before. You can use this
feature twice. You regain expended uses when you finish a short or
long rest. Your druid level determines the beasts you can
transform into, as shown in the Beast Shapes table. At 2nd level,
for example, you can transform into any beast that has a challenge
rating of 1/4 or lower that doesn't have a flying or swimming
speed.
===== ====== ================== ===========
Level Max CR Limitations Example
===== ====== ================== ===========
2nd 1/4 No Flying/Swimming Wolf
4th 1/2 No flying Crocodile
8th 1 -- Giant eagle
===== ====== ================== ===========
You can stay in a beast shape for a number of hours equal to half
your druid level (rounded down). You then revert to your normal
form unless you expend another use of this feature. You can revert
to your normal form earlier by using a bonus action on your
turn. You automatically revert if you fall unconscious, drop to 0
hit points, or die.
While you are transformed, the following rules apply:
Your game statistics are replaced by the statistics of the beast, but
you retain your alignment, personality, and Intelligence, Wisdom, and
Charisma scores. You also retain all of your skill and saving throw
proficiencies, in addition to gaining those of the creature. If the
creature has the same proficiency as you and the bonus in its stat block is
higher than yours, use the creature's bonus instead of yours. If the
creature has any legendary or lair actions, you can't use them.
When you transform, you assume the beast's hit points and Hit Dice. When
you revert to your normal form, you return to the number of hit points you
had before you transformed. However, if you revert as a result of dropping
to 0 hit points, any excess damage carries over to your normal form. For
example, if you take 10 damage in animal form and have only 1 hit point
left, you revert and take 9 damage. As long as the excess damage doesn't
reduce your normal form to 0 hit points, you aren't knocked unconscious.
• You can't cast spells, and your ability to speak or take any action that
requires hands is limited to the capabilities of your beast
form. Transforming doesn't break your concentration on a spell you've
already cast, however, or prevent you from taking actions that are part of
a spell, such as call lightning, that you've already cast.
• You retain the benefit of any features from your class, race, or other
source and can use them if the new form is physically capable of doing
so. However, you can't use any of your special senses, such as darkvision,
unless your new form also has that sense.
• You choose whether your equipment falls to the ground in your space,
merges into your new form, or is worn by it. Worn equipment functions as
normal, but the DM decides whether it is practical for the new form to wear
a piece of equipment, based on the creature's shape and size. Your
equipment doesn't change size or shape to match the new form, and any
equipment that the new form can't wear must either fall to the ground or
merge with it. Equipment that merges with the form has no effect until you
leave the form.
- Your game statistics are replaced by the statistics of the
beast, but you retain your alignment, personality, and
Intelligence, Wisdom, and Charisma scores. You also retain all
of your skill and saving throw proficiencies, in addition to
gaining those of the creature. If the creature has the same
proficiency as you and the bonus in its stat block is higher
than yours, use the creature's bonus instead of yours. If the
creature has any legendary or lair actions, you can't use them.
- When you transform, you assume the beast's hit points and Hit
Dice. When you revert to your normal form, you return to the
number of hit points you had before you transformed. However, if
you revert as a result of dropping to 0 hit points, any excess
damage carries over to your normal form. For example, if you
take 10 damage in animal form and have only 1 hit point left,
you revert and take 9 damage. As long as the excess damage
doesn't reduce your normal form to 0 hit points, you aren't
knocked unconscious.
- You can't cast spells, and your ability to speak or take any
action that requires hands is limited to the capabilities of
your beast form. Transforming doesn't break your concentration
on a spell you've already cast, however, or prevent you from
taking actions that are part of a spell, such as call lightning,
that you've already cast.
- You retain the benefit of any features from your class, race, or
other source and can use them if the new form is physically
capable of doing so. However, you can't use any of your special
senses, such as darkvision, unless your new form also has that
sense.
- You choose whether your equipment falls to the ground in your
space, merges into your new form, or is worn by it. Worn
equipment functions as normal, but the DM decides whether it is
practical for the new form to wear a piece of equipment, based
on the creature's shape and size. Your equipment doesn't change
size or shape to match the new form, and any equipment that the
new form can't wear must either fall to the ground or merge with
it. Equipment that merges with the form has no effect until you
leave the form.
"""
_name = "Wild Shape"
source = "Druid"
@property
def name(self):
num = 2
time = self.owner.Druid.level // 2
return self._name + " ({:d}x/SR, {:d} hours)".format(num, time)
num = 2
time = self.owner.Druid.level // 2
return self._name + " ({:d}x/SR, {:d} hours)".format(num, time)
class TimelessBody(Feature):
@@ -149,24 +155,24 @@ class _CircleSpells(Feature):
_name = "Select One"
source = "Druid (Circle of the Land)"
_spells = {3: [spells.MirrorImage, spells.MistyStep],
5: [spells.WaterBreathing, spells.WaterWalk],
7: [spells.ControlWater, spells.FreedomOfMovement],
9: [spells.ConjureElemental, spells.Scrying]}
5: [spells.WaterBreathing, spells.WaterWalk],
7: [spells.ControlWater, spells.FreedomOfMovement],
9: [spells.ConjureElemental, spells.Scrying]}
spells_known = []
spells_prepared = []
@property
def name(self):
return "Circle Spells ({:s})".format(self._name)
return "Circle Spells ({:s})".format(self._name)
def __init__(self, owner=None):
if owner is not None:
level = owner.Druid.level
for lvl, sps in self._spells.items():
if level >= lvl:
self.spells_known.extend(sps)
self.spells_prepared.extend(sps)
super().__init__(owner=owner)
if owner is not None:
level = owner.Druid.level
for lvl, sps in self._spells.items():
if level >= lvl:
self.spells_known.extend(sps)
self.spells_prepared.extend(sps)
super().__init__(owner=owner)
class ArcticSpells(_CircleSpells):
@@ -178,9 +184,9 @@ class ArcticSpells(_CircleSpells):
"""
_name = 'Arctic'
_spells = {3: [spells.HoldPerson, spells.SpikeGrowth],
5: [spells.SleetStorm, spells.Slow],
7: [spells.FreedomOfMovement, spells.IceStorm],
9: [spells.CommuneWithNature, spells.ConeOfCold]}
5: [spells.SleetStorm, spells.Slow],
7: [spells.FreedomOfMovement, spells.IceStorm],
9: [spells.CommuneWithNature, spells.ConeOfCold]}
class CoastSpells(_CircleSpells):
@@ -192,9 +198,9 @@ class CoastSpells(_CircleSpells):
"""
_name = 'Coast'
_spells = {3: [spells.MirrorImage, spells.MistyStep],
5: [spells.WaterBreathing, spells.WaterWalk],
7: [spells.ControlWater, spells.FreedomOfMovement],
9: [spells.ConjureElemental, spells.Scrying]}
5: [spells.WaterBreathing, spells.WaterWalk],
7: [spells.ControlWater, spells.FreedomOfMovement],
9: [spells.ConjureElemental, spells.Scrying]}
class DesertSpells(_CircleSpells):
@@ -206,9 +212,9 @@ class DesertSpells(_CircleSpells):
"""
_name = 'Desert'
_spells = {3: [spells.Blur, spells.Silence],
5: [spells.CreateFoodAndWater, spells.ProtectionFromEnergy],
7: [spells.Blight, spells.HallucinatoryTerrain],
9: [spells.InsectPlague, spells.WallOfStone]}
5: [spells.CreateFoodAndWater, spells.ProtectionFromEnergy],
7: [spells.Blight, spells.HallucinatoryTerrain],
9: [spells.InsectPlague, spells.WallOfStone]}
class ForestSpells(_CircleSpells):
@@ -220,9 +226,9 @@ class ForestSpells(_CircleSpells):
"""
_name = 'Forest'
_spells = {3: [spells.Barkskin, spells.SpiderClimb],
5: [spells.CallLightning, spells.PlantGrowth],
7: [spells.Divination, spells.FreedomOfMovement],
9: [spells.CommuneWithNature, spells.TreeStride]}
5: [spells.CallLightning, spells.PlantGrowth],
7: [spells.Divination, spells.FreedomOfMovement],
9: [spells.CommuneWithNature, spells.TreeStride]}
class GrasslandSpells(_CircleSpells):
@@ -234,9 +240,9 @@ class GrasslandSpells(_CircleSpells):
"""
_name = 'Grassland'
_spells = {3: [spells.Invisibility, spells.PassWithoutTrace],
5: [spells.Daylight, spells.Haste],
7: [spells.Divination, spells.FreedomOfMovement],
9: [spells.Dream, spells.InsectPlague]}
5: [spells.Daylight, spells.Haste],
7: [spells.Divination, spells.FreedomOfMovement],
9: [spells.Dream, spells.InsectPlague]}
class MountainSpells(_CircleSpells):
@@ -248,9 +254,9 @@ class MountainSpells(_CircleSpells):
"""
_name = 'Mountain'
_spells = {3: [spells.SpiderClimb, spells.SpikeGrowth],
5: [spells.LightningBolt, spells.MeldIntoStone],
7: [spells.StoneShape, spells.Stoneskin],
9: [spells.Passwall, spells.WallOfStone]}
5: [spells.LightningBolt, spells.MeldIntoStone],
7: [spells.StoneShape, spells.Stoneskin],
9: [spells.Passwall, spells.WallOfStone]}
class SwampSpells(_CircleSpells):
@@ -262,9 +268,9 @@ class SwampSpells(_CircleSpells):
"""
_name = 'Swamp'
_spells = {3: [spells.Darkness, spells.MelfsAcidArrow],
5: [spells.WaterWalk, spells.StinkingCloud],
7: [spells.FreedomOfMovement, spells.LocateCreature],
9: [spells.InsectPlague, spells.Scrying]}
5: [spells.WaterWalk, spells.StinkingCloud],
7: [spells.FreedomOfMovement, spells.LocateCreature],
9: [spells.InsectPlague, spells.Scrying]}
class UnderdarkSpells(_CircleSpells):
@@ -276,9 +282,9 @@ class UnderdarkSpells(_CircleSpells):
"""
_name = 'Underdark'
_spells = {3: [spells.SpiderClimb, spells.Web],
5: [spells.GaseousForm, spells.StinkingCloud],
7: [spells.GreaterInvisibility, spells.StoneShape],
9: [spells.Cloudkill, spells.InsectPlague]}
5: [spells.GaseousForm, spells.StinkingCloud],
7: [spells.GreaterInvisibility, spells.StoneShape],
9: [spells.Cloudkill, spells.InsectPlague]}
class SporesSpells(_CircleSpells):
@@ -291,10 +297,10 @@ class SporesSpells(_CircleSpells):
_name = 'Spores'
_spells = {2: [spells.ChillTouch],
3: [spells.BlindnessDeafness, spells.GentleRepose],
5: [spells.AnimateDead, spells.GaseousForm],
7: [spells.Blight, spells.Confusion],
9: [spells.Cloudkill, spells.Contagion]}
3: [spells.BlindnessDeafness, spells.GentleRepose],
5: [spells.AnimateDead, spells.GaseousForm],
7: [spells.Blight, spells.Confusion],
9: [spells.Cloudkill, spells.Contagion]}
class CircleSpells(FeatureSelector, _CircleSpells):
@@ -321,14 +327,14 @@ class CircleSpells(FeatureSelector, _CircleSpells):
"""
options = {'arctic': ArcticSpells,
'coast': CoastSpells,
'desert': DesertSpells,
'forest': ForestSpells,
'grassland': GrasslandSpells,
'mountain': MountainSpells,
'swamp': SwampSpells,
'underdark': UnderdarkSpells,
'spores': SporesSpells}
'coast': CoastSpells,
'desert': DesertSpells,
'forest': ForestSpells,
'grassland': GrasslandSpells,
'mountain': MountainSpells,
'swamp': SwampSpells,
'underdark': UnderdarkSpells,
'spores': SporesSpells}
name = "Circle Spells (Select One)"
source = "Druid (Circle of the Land/Spores)"
@@ -397,8 +403,8 @@ class CircleForms(Feature):
@property
def name(self):
level = self.owner.Druid.level
return self._name + ' (CR {:d})'.format(max(1, level//3))
level = self.owner.Druid.level
return self._name + ' (CR {:d})'.format(max(1, level//3))
class PrimalStrike(Feature):
@@ -450,7 +456,7 @@ class BalmOfTheSummerCourt(Feature):
@property
def name(self):
return self._name + " ({:d}x d6)".format(self.owner.Druid.level)
return self._name + " ({:d}x d6)".format(self.owner.Druid.level)
class HearthOfMoonlightAndShadow(Feature):
@@ -567,11 +573,11 @@ class MightySummoner(Feature):
- The creature appears with more hit points than normal: 2 extra hit
- The creature appears with more hit points than normal: 2 extra hit
points per Hit Die it has.
points per Hit Die it has.
- The damage from its natural weapons is considered magical for the
purpose of overcoming immunity and resistance to nonmagical attacks and
damage.
purpose of overcoming immunity and resistance to nonmagical attacks and
damage.
"""
name = "Mighty Summoner"
File diff suppressed because it is too large Load Diff
+33 -33
View File
@@ -10,12 +10,12 @@ def create_feature(**params):
Parameters
----------
params : optional
Saved as attributes of the new class.
Saved as attributes of the new class.
Returns
-------
NewFeature
New feature class, subclass of ``Feature``, with given params.
New feature class, subclass of ``Feature``, with given params.
"""
NewFeature = type('UnknownFeature', (Feature,), params)
return NewFeature
@@ -33,34 +33,34 @@ class Feature():
needs_implementation = False # Set to True if need to find way to compute stats
def __init__(self, owner=None):
self.owner = owner
self.spells_known = [S() for S in self.spells_known]
self.spells_prepared = [S() for S in self.spells_prepared]
self.owner = owner
self.spells_known = [S() for S in self.spells_known]
self.spells_prepared = [S() for S in self.spells_prepared]
def __eq__(self, other):
return (self.name == other.name) and (self.source == other.source)
return (self.name == other.name) and (self.source == other.source)
def __hash__(self):
return 0
return 0
def __str__(self):
return self.name
return self.name
def __repr__(self):
return "\"{:s}\"".format(self.name)
return "\"{:s}\"".format(self.name)
def weapon_func(self, weapon: weapons.Weapon, **kwargs):
"""
Updates weapon based on the Feature property
"""
Updates weapon based on the Feature property
Parameters
----------
weapon
The weapon to be tested for special bonuses
kwargs
Any other key-word arguments the function may require
"""
pass
Parameters
----------
weapon
The weapon to be tested for special bonuses
kwargs
Any other key-word arguments the function may require
"""
pass
class FeatureSelector(Feature):
@@ -72,17 +72,17 @@ class FeatureSelector(Feature):
source = ''
def __new__(t, owner, feature_choices=[]):
# Look for matching feature_choices
new_feat = Feature.__new__(Feature, owner=owner)
new_feat.__doc__ = t.__doc__
new_feat.name = t.name
new_feat.source = t.source
new_feat.needs_implementation = True
for selection in feature_choices:
if selection.lower() in t.options:
feat_class = t.options[selection.lower()]
if owner.has_feature(feat_class):
continue
new_feat = feat_class(owner=owner)
new_feat.source = t.source
return new_feat
# Look for matching feature_choices
new_feat = Feature.__new__(Feature, owner=owner)
new_feat.__doc__ = t.__doc__
new_feat.name = t.name
new_feat.source = t.source
new_feat.needs_implementation = True
for selection in feature_choices:
if selection.lower() in t.options:
feat_class = t.options[selection.lower()]
if owner.has_feature(feat_class):
continue
new_feat = feat_class(owner=owner)
new_feat.source = t.source
return new_feat
+54 -54
View File
@@ -1,7 +1,7 @@
from dungeonsheets import armor, weapons
from dungeonsheets.features.features import Feature, FeatureSelector
from dungeonsheets.features.ranger import (Archery, Defense, Dueling,
TwoWeaponFighting)
TwoWeaponFighting)
# Features added for all PHB classes
# SCAG and XGTE needed
@@ -127,21 +127,21 @@ class FighterFightingStyle(FeatureSelector):
"""
options = {'archery': Archery,
'defense': Defense,
'dueling': Dueling,
'great': GreatWeaponFighting,
'great-weapon fighting': GreatWeaponFighting,
'projection': Protection,
'two-weapon fighting': TwoWeaponFighting,
'two-weapon': TwoWeaponFighting,
'dual wield': TwoWeaponFighting,
'blinding fighting': BlindingFighting,
'close quarters shooter': CloseQuartersShooter,
'interception': Interception,
'mariner': Mariner,
'thrown weapon fighting': ThrownWeaponFighting,
'tunnel fighter': TunnelFighter,
'unarmed fighting': UnarmedFighting}
'defense': Defense,
'dueling': Dueling,
'great': GreatWeaponFighting,
'great-weapon fighting': GreatWeaponFighting,
'projection': Protection,
'two-weapon fighting': TwoWeaponFighting,
'two-weapon': TwoWeaponFighting,
'dual wield': TwoWeaponFighting,
'blinding fighting': BlindingFighting,
'close quarters shooter': CloseQuartersShooter,
'interception': Interception,
'mariner': Mariner,
'thrown weapon fighting': ThrownWeaponFighting,
'tunnel fighter': TunnelFighter,
'unarmed fighting': UnarmedFighting}
name = "Fighting Style (Select One)"
source = "Fighter"
@@ -183,13 +183,13 @@ class ExtraAttackFighter(Feature):
@property
def name(self):
level = self.owner.Fighter.level
if level < 11:
return self._name + ' (2x)'
elif level < 20:
return self._name + ' (3x)'
else:
return self._name + ' (4x)'
level = self.owner.Fighter.level
if level < 11:
return self._name + ' (2x)'
elif level < 20:
return self._name + ' (3x)'
else:
return self._name + ' (4x)'
class Indomitable(Feature):
@@ -206,13 +206,13 @@ class Indomitable(Feature):
@property
def name(self):
level = self.owner.Fighter.level
if level < 13:
return self._name + ' (1x/LR)'
elif level < 17:
return self._name + ' (2x/LR)'
else:
return self._name + ' (3x/LR)'
level = self.owner.Fighter.level
if level < 13:
return self._name + ' (1x/LR)'
elif level < 17:
return self._name + ' (2x/LR)'
else:
return self._name + ' (3x/LR)'
# Champion
@@ -255,14 +255,14 @@ class AdditionalFightingStyle(FeatureSelector):
two-weapon fighting 2
"""
options = {'archery 2': Archery,
'defense 2': Defense,
'dueling 2': Dueling,
'great 2': GreatWeaponFighting,
'great-weapon fighting 2': GreatWeaponFighting,
'projection 2': Protection,
'two-weapon fighting 2': TwoWeaponFighting,
'two-weapon 2': TwoWeaponFighting,
'dual wield 2': TwoWeaponFighting}
'defense 2': Defense,
'dueling 2': Dueling,
'great 2': GreatWeaponFighting,
'great-weapon fighting 2': GreatWeaponFighting,
'projection 2': Protection,
'two-weapon fighting 2': TwoWeaponFighting,
'two-weapon 2': TwoWeaponFighting,
'dual wield 2': TwoWeaponFighting}
name = "Fighting Style (Select One)"
source = "Fighter (Champion)"
@@ -314,13 +314,13 @@ class CombatSuperiority(Feature):
@property
def name(self):
level = self.owner.Fighter.level
if level < 10:
return self._name + ' (d8)'
elif level < 18:
return self._name + ' (d10)'
else:
return self._name + ' (d12)'
level = self.owner.Fighter.level
if level < 10:
return self._name + ' (d8)'
elif level < 18:
return self._name + ' (d10)'
else:
return self._name + ' (d12)'
class StudentOfWar(Feature):
@@ -662,11 +662,11 @@ class RoyalEnvoy(Feature):
source = "Fighter (Purple Dragon Knight)"
def __init__(self, owner=None):
super().__init__(owner=owner)
if 'persuasion' not in self.owner.skill_proficiencies:
self.owner.skill_proficiencies.append('persuasion')
if 'persuasion' not in self.owner.skill_expertise:
self.owner.skill_expertise.append('persuasion')
super().__init__(owner=owner)
if 'persuasion' not in self.owner.skill_proficiencies:
self.owner.skill_proficiencies.append('persuasion')
if 'persuasion' not in self.owner.skill_expertise:
self.owner.skill_expertise.append('persuasion')
class InspiringSurge(Feature):
@@ -934,8 +934,8 @@ class UnwaveringMark(Feature):
@property
def name(self):
num = max(1, self.owner.strength.modifier)
return self._name + ' ({:d}x/LR)'.format(num)
num = max(1, self.owner.strength.modifier)
return self._name + ' ({:d}x/LR)'.format(num)
class WardingManeuver(Feature):
@@ -956,8 +956,8 @@ class WardingManeuver(Feature):
@property
def name(self):
num = max(1, self.owner.constitution.modifier)
return self._name + ' ({:d}x/LR)'.format(num)
num = max(1, self.owner.constitution.modifier)
return self._name + ' ({:d}x/LR)'.format(num)
class HoldTheLine(Feature):
+282 -268
View File
@@ -3,53 +3,54 @@ from dungeonsheets.features.features import Feature
class UnarmoredDefenseMonk(Feature):
"""Beginning at 1st level, while you are wearing no armor and not wearing a
shield, your AC equals 10 + your Dexterity modifier + your Wisdom modifier.
This bonus is computed in the AC given on the Character Sheet above.
"""Beginning at 1st level, while you are wearing no armor and not
wearing a shield, your AC equals 10 + your Dexterity modifier +
your Wisdom modifier.
This bonus is computed in the AC given on the Character Sheet
above.
"""
name = "Unarmored Defense"
source = 'Monk'
class MartialArts(Feature):
"""At 1st level, your practice of martial arts gives you mastery of combat
styles that use unarmed strikes and monk weapons, which are shortswords and
any simple melee weapons that don't have the two-handed or heavy
property. You gain the following benefits while you are unarmed or wielding
only monk weapons and you aren't wearing armor or wielding a shield:
• You can use Dexterity instead of Strength for the attack and damage rolls
of your unarmed strikes and monk weapons.
You can roll a d4 in place of the normal damage of your unarmed strike or
monk weapon. This die changes as you gain monk levels, as shown in the
Martial Arts column of the Monk table.
• When you use the Attack action with an unarmed strike or a monk weapon on
your turn, you can make one unarmed strike as a bonus action. For example,
if you take the Attack action and attack with a quarter- staff, you can
also make an unarmed strike as a bonus action, assuming you haven't already
taken a bonus action this turn.
Certain monasteries use specializepd forms of the monk weapons. For
example, you might use a club that is two lengths of w ood connected by a
short chain (called a nunchaku) or a sickle with a shorter, straighter
blade (called a kama). Whatever name you use for a monk weapon, you can use
the game statistics provided for
"""At 1st level, your practice of martial arts gives you mastery of
combat styles that use unarmed strikes and monk weapons, which are
shortswords and any simple melee weapons that don't have the
two-handed or heavy property. You gain the following benefits
while you are unarmed or wielding only monk weapons and you aren't
wearing armor or wielding a shield:
- You can use Dexterity instead of Strength for the attack and
damage rolls of your unarmed strikes and monk weapons.
- You can roll a d4 in place of the normal damage of your unarmed
strike or monk weapon. This die changes as you gain monk levels,
as shown in the Martial Arts column of the Monk table.
- When you use the Attack action with an unarmed strike or a monk
weapon on your turn, you can make one unarmed strike as a bonus
action. For example, if you take the Attack action and attack
with a quarter- staff, you can also make an unarmed strike as a
bonus action, assuming you haven't already taken a bonus action
this turn.
Certain monasteries use specializepd forms of the monk
weapons. For example, you might use a club that is two lengths of
w ood connected by a short chain (called a nunchaku) or a sickle
with a shorter, straighter blade (called a kama). Whatever name
you use for a monk weapon, you can use the game statistics
provided for
"""
name = "Martial Arts"
source = 'Monk'
die = 'd4'
def weapon_func(self, weapon: weapons.Weapon, **kwargs):
"""
Update increasing damage dice and DEX mod of Monk weapons
"""
"""Update increasing damage dice and DEX mod of Monk weapons"""
is_monk_weapon = any([isinstance(weapon, w)
for w in weapons.monk_weapons])
for w in weapons.monk_weapons])
level = self.owner.Monk.level
if not is_monk_weapon:
return weapon
@@ -67,23 +68,25 @@ class MartialArts(Feature):
class Ki(Feature):
"""Starting at 2nd level, your training allows you to harness the mystic
energy of ki. Your access to this energy is represented by a number of ki
points. Your monk level determines the number of points you have, as shown
in the Ki Points column of the Monk table. You can spend these points to
fuel various ki features.
You start knowing three such features: Flurry of Blows, Patient Defense,
and Step of the Wind. You learn more ki features as you gain levels in this
class. When you spend a ki point, it is unavailable until you finish a
short or long rest, at the end of which you draw all of your expended ki
back into yourself. You must spend at least 30 minutes of the rest
meditating to regain your ki points.
Some of your ki features require your target to make a saving throw to
resist the feature's effects. The saving throw DC is calculated as follows:
Ki save DC = 8 + your proficiency bonus + your Wisdom modifier
"""Starting at 2nd level, your training allows you to harness the
mystic energy of ki. Your access to this energy is represented by
a number of ki points. Your monk level determines the number of
points you have, as shown in the Ki Points column of the Monk
table. You can spend these points to fuel various ki features.
You start knowing three such features: Flurry of Blows, Patient
Defense, and Step of the Wind. You learn more ki features as you
gain levels in this class. When you spend a ki point, it is
unavailable until you finish a short or long rest, at the end of
which you draw all of your expended ki back into yourself. You
must spend at least 30 minutes of the rest meditating to regain
your ki points.
Some of your ki features require your target to make a saving
throw to resist the feature's effects. The saving throw DC is
calculated as follows: Ki save DC = 8 + your proficiency bonus +
your Wisdom modifier
"""
_name = "Ki"
source = "Monk"
@@ -150,23 +153,23 @@ class UnarmoredMovement(Feature):
class DeflectMissiles(Feature):
"""Starting at 3rd level, you can use your reaction to deflect or catch the
missile when you are hit by a ranged weapon attack. When you do so, the
damage you take from the attack is reduced by 1d10 + your Dexterity
modifier + your monk level. If you reduce the damage to 0, you can catch
the missile if it is small enough for you to hold in one hand and you have
at least one hand free.
If you catch a missile in this way, you can spend 1 ki point to make a
ranged attack with the weapon or piece of ammunition you just caught, as
part of the same reaction. You make this attack with proficiency,
regardless of your weapon proficiencies, and the missile counts as a monk
weapon for the attack
"""Starting at 3rd level, you can use your reaction to deflect or
catch the missile when you are hit by a ranged weapon attack. When
you do so, the damage you take from the attack is reduced by 1d10
+ your Dexterity modifier + your monk level. If you reduce the
damage to 0, you can catch the missile if it is small enough for
you to hold in one hand and you have at least one hand free.
If you catch a missile in this way, you can spend 1 ki point to
make a ranged attack with the weapon or piece of ammunition you
just caught, as part of the same reaction. You make this attack
with proficiency, regardless of your weapon proficiencies, and the
missile counts as a monk weapon for the attack
"""
_name = "Deflect Missiles"
source = "Monk"
@property
def name(self):
mod = self.owner.dexterity.modifier + self.owner.Monk.level
@@ -174,9 +177,9 @@ class DeflectMissiles(Feature):
class SlowFall(Feature):
"""Beginning at 4th level, you can use your reaction when you fall to reduce
any falling damage you take by an amount equal to five times your monk
level.
"""Beginning at 4th level, you can use your reaction when you fall to
reduce any falling damage you take by an amount equal to five
times your monk level.
"""
name = "Slow Fall"
@@ -184,9 +187,9 @@ class SlowFall(Feature):
class ExtraAttackMonk(Feature):
"""Beginning at 5th level, you can attack twice, instead of once, whenever you
take the Attack action on your turn
"""Beginning at 5th level, you can attack twice, instead of once,
whenever you take the Attack action on your turn
"""
name = "Extra Attack (2x)"
source = "Monk"
@@ -194,21 +197,21 @@ class ExtraAttackMonk(Feature):
class StunningStrike(Feature):
"""Starting at 5th level, you can interfere with the flow of ki in an
opponent's body. When you hit another creature with a melee weapon attack,
you can spend 1 ki point to attempt a stunning strike. The target must
succeed on a Constitution saving throw or be stunned until the end of your
next turn
opponent's body. When you hit another creature with a melee weapon
attack, you can spend 1 ki point to attempt a stunning strike. The
target must succeed on a Constitution saving throw or be stunned
until the end of your next turn
"""
name = "Stunning Strike"
source = "Monk"
class KiEmpoweredStrikes(Feature):
"""Starting at 6th level, your unarmed strikes count as magical for the
purpose of overcoming resistance and immunity to nonmagical attacks and
damage
"""Starting at 6th level, your unarmed strikes count as magical for
the purpose of overcoming resistance and immunity to nonmagical
attacks and damage
"""
name = "Ki-Empowered Strikes"
source = "Monk"
@@ -217,58 +220,61 @@ class KiEmpoweredStrikes(Feature):
class StillnessOfMind(Feature):
"""Starting at 7th level, you can use your action to end one effect on
yourself that is causing you to be charmed or frightened
"""
name = "Stillness of Mind"
source = "Monk"
class PurityOfBody(Feature):
"""At 10th level, your mastery of the ki flowing through you makes you immune
to disease and poison.
"""At 10th level, your mastery of the ki flowing through you makes you
immune to disease and poison.
"""
name = "Purity of Body"
source = "Monk"
class TongueOfTheSunAndMoon(Feature):
"""Starting at 13th level, you learn to touch the ki of other minds so that
you understand all spoken languages. Moreover, any creature that can
understand a language can understand what you say.
"""Starting at 13th level, you learn to touch the ki of other minds so
that you understand all spoken languages. Moreover, any creature
that can understand a language can understand what you say.
"""
name = "Tongue of the Sun and Moon"
source = "Monk"
class DiamondSoul(Feature):
"""Beginning at 14th level, your mastery of ki grants you proficiency in all
saving throws. Additionally, whenever you make a saving throw and fail, you
can spend 1 ki point to reroll it and take the second result.
"""Beginning at 14th level, your mastery of ki grants you proficiency
in all saving throws. Additionally, whenever you make a saving
throw and fail, you can spend 1 ki point to reroll it and take the
second result.
"""
name = "Diamond Soul"
source = "Monk"
class TimelessBody(Feature):
"""At 15th level, your ki sustains you so that you suffer none of the frailty
of old age, and you can't be aged magically. You can still die of old age,
however. In addition, you no longer need food or water.
"""At 15th level, your ki sustains you so that you suffer none of the
frailty of old age, and you can't be aged magically. You can still
die of old age, however. In addition, you no longer need food or
water.
"""
name = "Timeless Body"
source = "Monk"
class EmptyBody(Feature):
"""Beginning at 18th level, you can use your action to spend 4 ki points to
become invisible for 1 minute. During that time, you also have resistance
to all damage but force damage. Additionally, you can spend 8 ki points to
cast the astral projection spell, without needing material components. When
you do so, you can't take any other creatures with you.
"""Beginning at 18th level, you can use your action to spend 4 ki
points to become invisible for 1 minute. During that time, you
also have resistance to all damage but force damage. Additionally,
you can spend 8 ki points to cast the astral projection spell,
without needing material components. When you do so, you can't
take any other creatures with you.
"""
name = "Empty Body"
source = "Monk"
@@ -277,7 +283,7 @@ class EmptyBody(Feature):
class PerfectSelf(Feature):
"""At 20th level, when you roll for initiative and have no ki points
remaining, you regain 4 ki points.
"""
name = "Perfect Self"
source = "Monk"
@@ -285,40 +291,41 @@ class PerfectSelf(Feature):
# Way of the Open Hand
class OpenHandTechnique(Feature):
"""Starting when you choose this tradition at 3rd level, you can manipulate
your enemy's ki when you harness your own. Whenever you hit a creature with
one of the attacks granted by your Flurry of Blows, you can impose one of
the following effects on that target:
• It must succeed on a Dexterity saving throw or be knocked prone.
It must make a Strength saving throw. If it fails, you can push it up to
15 feet away from you.
• It can't take reactions until the end of your next turn
"""Starting when you choose this tradition at 3rd level, you can
manipulate your enemy's ki when you harness your own. Whenever you
hit a creature with one of the attacks granted by your *Flurry of
Blows*, you can impose one of the following effects on that
target:
- It must succeed on a Dexterity saving throw or be knocked prone.
- It must make a Strength saving throw. If it fails, you can push
it up to 15 feet away from you.
- It can't take reactions until the end of your next turn
"""
name = "Open Hand Technique"
source = "Monk (Way of the Open Hand)"
class WholenessOfBody(Feature):
"""At 6th level, you gain the ability to heal yourself. As an action, you can
regain hit points equal to three times your monk level. You must finish a
long rest before you can use this feature again
"""At 6th level, you gain the ability to heal yourself. As an action,
you can regain hit points equal to three times your monk
level. You must finish a long rest before you can use this feature
again
"""
name = "Wholeness of Body"
source = "Monk (Way of the Open Hand)"
class Tranquility(Feature):
"""Beginning at 11th level, you can enter a special meditation that surrounds
you with an aura of peace. At the end of a long rest, you gain the effect
of a sanctuary spell that lasts until the start of your next long rest (the
spell can end early as normal). The saving throw DC for the spell equals 8
+ your Wisdom modifier + your proficiency bonus
"""Beginning at 11th level, you can enter a special meditation that
surrounds you with an aura of peace. At the end of a long rest,
you gain the effect of a sanctuary spell that lasts until the
start of your next long rest (the spell can end early as
normal). The saving throw DC for the spell equals 8 + your Wisdom
modifier + your proficiency bonus
"""
name = "Tranquility"
source = "Monk (Way of the Open Hand)"
@@ -326,16 +333,18 @@ class Tranquility(Feature):
class QuiveringPalm(Feature):
"""At 17th level, you gain the ability to set up lethal vibrations in
someone's body. When you hit a creature with an unarmed strike, you can
spend 3 ki points to start these imperceptible vibrations, which last for a
number of days equal to your monk level. The vibrations are harmless unless
you use your action to end them. To do so, you and the target must be on
the same plane of existence. When you use this action, the creature must
make a Constitution saving throw. If it fails, it is reduced to 0 hit
points. If it succeeds, it takes 10d10 necrotic damage. You can have only
one creature under the effect of this feature at a time. You can choose to
end the vibrations harmlessly without using an action.
someone's body. When you hit a creature with an unarmed strike,
you can spend 3 ki points to start these imperceptible vibrations,
which last for a number of days equal to your monk level. The
vibrations are harmless unless you use your action to end them. To
do so, you and the target must be on the same plane of
existence. When you use this action, the creature must make a
Constitution saving throw. If it fails, it is reduced to 0 hit
points. If it succeeds, it takes 10d10 necrotic damage. You can
have only one creature under the effect of this feature at a
time. You can choose to end the vibrations harmlessly without
using an action.
"""
name = "Quivering Palm"
source = "Monk (Way of the Open Hand)"
@@ -343,12 +352,13 @@ class QuiveringPalm(Feature):
# Way of Shadow
class ShadowArts(Feature):
"""Starting when you choose this tradition at 3rd level, you can use your ki
to duplicate the effects of certain spells. As an action, you can spend 2
ki points to cast darkness, darkvision, pass without trace, or silence,
without providing material components. Additionally, you gain the minor
illusion cantrip if you don't already know it.
"""Starting when you choose this tradition at 3rd level, you can use
your ki to duplicate the effects of certain spells. As an action,
you can spend 2 ki points to cast darkness, darkvision, pass
without trace, or silence, without providing material
components. Additionally, you gain the minor illusion cantrip if
you don't already know it.
"""
name = "Shadow Arts"
source = "Monk (Way of Shadow)"
@@ -356,33 +366,34 @@ class ShadowArts(Feature):
class ShadowStep(Feature):
"""At 6th level, you gain the ability to step from one shadow into
another. When you are in dim light or darkness, as a bonus action you can
teleport up to 60 feet to an unoccupied space you can see that is also in
dim light or darkness. You then have advantage on the first melee attack
you make before the end of the turn.
another. When you are in dim light or darkness, as a bonus action
you can teleport up to 60 feet to an unoccupied space you can see
that is also in dim light or darkness. You then have advantage on
the first melee attack you make before the end of the turn.
"""
name = "Shadow Step"
source = "Monk (Way of Shadow)"
class CloakOfShadows(Feature):
"""By 11th level, you have learned to become one with the shadows. When you
are in an area of dim light or darkness, you can use your action to become
invisible. You remain invisible until you make an attack, cast a spell, or
are in an area of bright light.
"""By 11th level, you have learned to become one with the
shadows. When you are in an area of dim light or darkness, you can
use your action to become invisible. You remain invisible until
you make an attack, cast a spell, or are in an area of bright
light.
"""
name = "Cloak of Shadows"
source = "Monk (Way of Shadow)"
class Opportunist(Feature):
"""At 17th level, you can exploit a creature's momentary distraction when it
is hit by an attack. Whenever a creature within 5 feet of you is hit by an
attack made by a creature other than you, you can use your reaction to make
a melee attack against that creature.
"""At 17th level, you can exploit a creature's momentary distraction
when it is hit by an attack. Whenever a creature within 5 feet of
you is hit by an attack made by a creature other than you, you can
use your reaction to make a melee attack against that creature.
"""
name = "Opportunist"
source = "Monk (Way of Shadow)"
@@ -390,35 +401,38 @@ class Opportunist(Feature):
# Way of the Four Elements
class DiscipleOfTheElements(Feature):
"""When you choose this tradition at 3rd level, you learn magical disciplines
that harness the power of the four elements. A discipline requires you to
spend ki points each time you use it. You know the Elemental Attunement
discipline and one other elemental discipline of your choice, which are
detailed in the "Elemental Disciplines" section below.
You learn one additional elemental discipline of your choice at 6th, 11th,
and 17th level. Whenever you learn a new elemental discipline, you can also
replace one elemental discipline that you already know with a different
discipline.
"""When you choose this tradition at 3rd level, you learn magical
disciplines that harness the power of the four elements. A
discipline requires you to spend ki points each time you use
it. You know the Elemental Attunement discipline and one other
elemental discipline of your choice, which are detailed in the
"Elemental Disciplines" section below.
You learn one additional elemental discipline of your choice at
6th, 11th, and 17th level. Whenever you learn a new elemental
discipline, you can also replace one elemental discipline that you
already know with a different discipline.
Add your chosen disciplines under "features" in your .py file
**Casting Elemental Spells:** Some elemental disciplines allow you
to cast spells. See chapter 10 for the general rules of
spellcasting. To cast one o f these spells, you use its casting
time and other rules, but you don't need to provide material
components for it. Once you reach 5th level in this class, you can
spend additional ki points to increase the level of an elemental
discipline spell that you cast, provided that the spell has an
enhanced effect at a higher level, as burning hands does. The
spell's level increases by 1 for each additional ki point you
spend. For example, if you are a 5th-level monk and use Sweeping
Cinder Strike to cast burning hands, you can spend 3 ki points to
cast it as a 2nd-level spell (the discipline's base cost of 2 ki
points plus 1).
**Casting Elemental Spells**: Some elemental disciplines allow you to cast
spells. See chapter 10 for the general rules of spellcasting. To cast one o
f these spells, you use its casting time and other rules, but you don't
need to provide material components for it. Once you reach 5th level in
this class, you can spend additional ki points to increase the level of an
elemental discipline spell that you cast, provided that the spell has an
enhanced effect at a higher level, as burning hands does. The spell's level
increases by 1 for each additional ki point you spend. For example, if you
are a 5th-level monk and use Sweeping Cinder Strike to cast burning hands,
you can spend 3 ki points to cast it as a 2nd-level spell (the discipline's
base cost of 2 ki points plus 1).
The maximum number of ki points you can spend to cast a spell in this way
(including its base ki point cost and any additional ki points you spend to
increase its level) is determined by your monk level, as shown in the
Spells and Ki Points table.
The maximum number of ki points you can spend to cast a spell in
this way (including its base ki point cost and any additional ki
points you spend to increase its level) is determined by your monk
level, as shown in the Spells and Ki Points table.
Monk Levels 5-8 : 3 Ki points Max
@@ -436,19 +450,17 @@ class DiscipleOfTheElements(Feature):
class ElementalAttunement(Feature):
"""You can use your action to briefly control elemental forces nearby, causing
one of the following effects of your choice:
• Create a harmless, instantaneous sensory effect related to air, earth,
fire, or water, such as a shower of sparks, a puff of wind, a spray o f
light mist, or a gentle rumbling of stone.
• Instantaneously light or snuff out a candle, a torch, or a small
campfire.
• Chill or warm up to 1 pound of nonliving material for up to 1 hour.
• Cause earth, fire, water, or mist that can fit within a 1-foot cube to
shape itself into a crude form you desig nate for 1 minute.
- Create a harmless, instantaneous sensory effect related to air,
earth, fire, or water, such as a shower of sparks, a puff of
wind, a spray o f light mist, or a gentle rumbling of stone.
- Instantaneously light or snuff out a candle, a torch, or a small
campfire.
- Chill or warm up to 1 pound of nonliving material for up to 1
hour.
- Cause earth, fire, water, or mist that can fit within a 1-foot
cube to shape itself into a crude form you desig nate for 1
minute.
"""
name = "Elemental Attunement"
source = "Monk (Way of the Four Elements)"
@@ -456,9 +468,9 @@ class ElementalAttunement(Feature):
class BreathOfWinter(Feature):
"""You can spend 6 ki points to cast cone of cold.
**Prerequisite**: 17th Level
**Prerequisite:** 17th Level
"""
name = "Breath of Winter"
source = "Monk (Way of the Four Elements)"
@@ -467,9 +479,9 @@ class BreathOfWinter(Feature):
class ClenchOfTheNorthWind(Feature):
"""You can spend 3 ki points to cast hold person.
**Prerequisite**: 6th Level
**Prerequisite:** 6th Level
"""
name = "Clench of the North Wind"
source = "Monk (Way of the Four Elements)"
@@ -478,8 +490,9 @@ class ClenchOfTheNorthWind(Feature):
class EternalMountainDefense(Feature):
"""You can spend 5 ki points to cast stoneskin, targeting yourself.
**Prerequisite**: 11th Level
**Prerequisite:** 11th Level
"""
name = "Eternal Mountain Defense"
source = "Monk (Way of the Four Elements)"
@@ -487,22 +500,21 @@ class EternalMountainDefense(Feature):
class FangsOfTheFireSnake(Feature):
"""When you use the Attack action on your turn, you can spend 1 ki point to
cause tendrils of flame to stretch out from your fists and feet. Your reach
with your unarmed strikes increases by 10 feet for that action, as well as
the rest o f the turn. A hit with such an attack deals fire damage instead
of bludgeoning damage, and if you spend 1 ki point when the attack hits, it
also deals an extra 1d10 fire damage
"""When you use the Attack action on your turn, you can spend 1 ki
point to cause tendrils of flame to stretch out from your fists
and feet. Your reach with your unarmed strikes increases by 10
feet for that action, as well as the rest o f the turn. A hit with
such an attack deals fire damage instead of bludgeoning damage,
and if you spend 1 ki point when the attack hits, it also deals an
extra 1d10 fire damage
"""
name = "Fangs of the Fire Snake"
source = "Monk (Way of the Four Elements)"
class FistOfFourThunders(Feature):
"""You can spend 2 ki points to cast thunderwave
"""
"""You can spend 2 ki points to cast thunderwave."""
name = "Fist of Four Thunders"
source = "Monk (Way of the Four Elements)"
spells_known = (spells.Thunderwave,)
@@ -510,14 +522,15 @@ class FistOfFourThunders(Feature):
class FistOfUnbrokenAir(Feature):
"""You can create a blast of compressed air that strikes like a mighty
fist. As an action, you can spend 2 ki points and choose a creature within
30 feet of you. That creature must make a Strength saving throw. On a
failed save, the creature takes 3d10 bludgeoning damage, plus an extra 1d10
bludgeoning damage for each additional ki point you spend, and you can push
the creature up to 20 feet away from you and knock it prone. On a
successful save, the creature takes half as much damage, and you don't push
it or knock it prone.
fist. As an action, you can spend 2 ki points and choose a
creature within 30 feet of you. That creature must make a Strength
saving throw. On a failed save, the creature takes 3d10
bludgeoning damage, plus an extra 1d10 bludgeoning damage for each
additional ki point you spend, and you can push the creature up to
20 feet away from you and knock it prone. On a successful save,
the creature takes half as much damage, and you don't push it or
knock it prone.
"""
name = "Fist of Unbroken Air"
source = "Monk (Way of the Four Elements)"
@@ -525,9 +538,9 @@ class FistOfUnbrokenAir(Feature):
class FlamesOfThePhoenix(Feature):
"""You can spend 4 ki points to cast fireball.
**Prerequisite**: 11th Level
**Prerequisite:** 11th Level
"""
name = "Flames of the Phoenix"
source = "Monk (Way of the Four Elements)"
@@ -536,9 +549,9 @@ class FlamesOfThePhoenix(Feature):
class GongOfTheSummit(Feature):
"""You can spend 3 ki points to cast shatter.
**Prerequisite**: 6th Level
**Prerequisite:** 6th Level
"""
name = "Gong of the Summit"
source = "Monk (Way of the Four Elements)"
@@ -547,9 +560,9 @@ class GongOfTheSummit(Feature):
class MistStance(Feature):
"""You can spend 4 ki points to cast gaseous form, targeting yourself.
**Prerequisite**: 11th Level
**Prerequisite:** 11th Level
"""
name = "Mist Stance"
source = "Monk (Way of the Four Elements)"
@@ -559,7 +572,7 @@ class MistStance(Feature):
class RideTheWind(Feature):
"""You can spend 4 ki points to cast fly, targeting yourself
**Prerequisite**: 11th Level
**Prerequisite:** 11th Level
"""
name = "Ride the Wind"
@@ -570,7 +583,7 @@ class RideTheWind(Feature):
class RiverOfHungryFlame(Feature):
"""You can spend 5 ki points to cast wall of fire.
**Prerequisite**: 17th Level
**Prerequisite:** 17th Level
"""
name = "River of Hungry Flame"
@@ -588,40 +601,41 @@ class RushOfTheGaleSpirits(Feature):
class ShapeTheFlowingRiver(Feature):
"""As an action, you can spend 1 ki point to choose an area of ice or water no
larger than 30 feet on a side within 120 feet o f you. You can change water
to ice within the area and vice versa, and you can reshape ice in the area
in any manner you choose. You can raise or lower the ice's elevation,
create or fill in a trench, erect or flatten a wall, or form a pillar. The
extent of any such changes can't exceed half the area's largest
dimension. For example, if you affect a 30-foot square, you can create a
pillar up to 15 feet high, raise or lower the square's elevation by up to
15 feet, dig a trench up to 15 feet deep, and so on. You can't shape the
ice to trap or injure a creature in the area.
"""As an action, you can spend 1 ki point to choose an area of ice or
water no larger than 30 feet on a side within 120 feet o f
you. You can change water to ice within the area and vice versa,
and you can reshape ice in the area in any manner you choose. You
can raise or lower the ice's elevation, create or fill in a
trench, erect or flatten a wall, or form a pillar. The extent of
any such changes can't exceed half the area's largest
dimension. For example, if you affect a 30-foot square, you can
create a pillar up to 15 feet high, raise or lower the square's
elevation by up to 15 feet, dig a trench up to 15 feet deep, and
so on. You can't shape the ice to trap or injure a creature in the
area.
"""
name = "Shape the Flowing River"
source = "Monk (Way of the Four Elements)"
class SweepingCinderStrike(Feature):
"""You can spend 2 ki points to cast burning hands
"""
"""You can spend 2 ki points to cast burning hands."""
name = "Sweeping Cinder Strike"
source = "Monk (Way of the Four Elements)"
spells_known = (spells.BurningHands,)
class WaterWhip(Feature):
"""You can spend 2 ki points as a bonus action to create a whip of water that
shoves and pulls a creature to unbalance it. A creature that you can see
that is within 30 feet of you must make a Dexterity saving throw. On a
failed save, the creature takes 3d10 bludgeoning damage, plus an extra 1d10
bludgeoning damage for each additional ki point you spend, and you can
either knock it prone or pull it up to 25 feet closer to you. On a
successful save, the creature takes half as much damage, and you don't pull
it or knock it prone
"""You can spend 2 ki points as a bonus action to create a whip of
water that shoves and pulls a creature to unbalance it. A creature
that you can see that is within 30 feet of you must make a
Dexterity saving throw. On a failed save, the creature takes 3d10
bludgeoning damage, plus an extra 1d10 bludgeoning damage for each
additional ki point you spend, and you can either knock it prone
or pull it up to 25 feet closer to you. On a successful save, the
creature takes half as much damage, and you don't pull it or knock
it prone
"""
name = "Water Whip"
@@ -630,8 +644,8 @@ class WaterWhip(Feature):
class WaveOfRollingEarth(Feature):
"""You can spend 6 ki points to cast wall of stone
**Prerequisite**: 17th Level
**Prerequisite:** 17th Level
"""
name = "Wave of Rolling Earth"
@@ -704,8 +718,8 @@ class RadiantSunBolt(Feature):
source = "Monk (Way of the Sun Soul)"
def __init__(self, owner=None):
super().__init__(owner=owner)
self.owner.wield_weapon("sun bolt")
super().__init__(owner=owner)
self.owner.wield_weapon("sun bolt")
class SearingArcStrike(Feature):
@@ -769,10 +783,10 @@ class TipsySway(Feature):
"""Starting at 6th level, you can move in sudden, swaying ways. You gain the
following benefits.
**Leap to Your Feet**: When you're prone, you can stand up
**Leap to Your Feet:** When you're prone, you can stand up
by spending 5 feet of movement, rather than half your speed.
**Redirect Attack**: When a creature misses you with a melee attack roll,
**Redirect Attack:** When a creature misses you with a melee attack roll,
you can spend 1 ki point as a re- action to cause that attack to hit one
creature of your choice, other than the attacker, that you can see within 5
feet of you.
@@ -812,7 +826,7 @@ class PathOfTheKensei(Feature):
includes instruction in the deft strokes of calligraphy or painting. You
gain the following benefits.
**Kensei Weapons**: Choose two types of weapons to be your kensei weapons:
**Kensei Weapons:** Choose two types of weapons to be your kensei weapons:
one melee weapon and one ranged weapon. Each of these weapons can be any
sim- ple or martial weapon that lacks the heavy and special properties. The
longbow is also a valid choice. You gain proficiency with these weapons if
@@ -822,19 +836,19 @@ class PathOfTheKensei(Feature):
choose another type of weapon-either melee or ranged-to be a kensei weapon
for you. following the criteria above.
**Agile Parry**: If you make an unarmed strike as part of the Attack action
**Agile Parry:** If you make an unarmed strike as part of the Attack action
on your turn and are holding a kensei weapon, you can use it to defend
yourself if it is a melee weapon. You gain a +2 bonus to AC until the start
of your next turn, while the weapon is in your hand and you aren't
incapacitated.
**Kensei's Shot**: You can use a bonus action on your turn to make your
**Kensei's Shot:** You can use a bonus action on your turn to make your
ranged attacks with a kensei weapon more deadly. When you do so, any target
you hit with a ranged attack using a kensei weapon takes an extra 1d4
damage of the weapons type. You retain this benefit un- til the end of the
current turn.
**Way ofthe Brush**: You gain proficiency with your choice of
**Way ofthe Brush:** You gain proficiency with your choice of
calligrapher's supplies or painter's supplies
"""
@@ -846,11 +860,11 @@ class OneWithTheBlade(Feature):
"""At 6th level, you extend your ki into your kensei weap- ons, granting you
the following benefits.
**Magic Kensei Weapons**: Your attacks with your kensei weapons count as
**Magic Kensei Weapons:** Your attacks with your kensei weapons count as
magical for the purpose of over- coming resistance and immunity to
nonmagical attacks and damage
**Deft Strike**: When you hit a target with a kensei weapon, you can spend
**Deft Strike:** When you hit a target with a kensei weapon, you can spend
1 ki point to cause the weapon to deal extra damage to the target equal to
your Martial Arts die. You can use this feature only once on each of
your turns.
+10 -10
View File
@@ -25,8 +25,8 @@ class DivineSense(Feature):
@property
def name(self):
num_uses = max(1, 1+self.owner.charisma.modifier)
return self._name + ' ({:d}x/LR)'.format(num_uses)
num_uses = max(1, 1+self.owner.charisma.modifier)
return self._name + ' ({:d}x/LR)'.format(num_uses)
class LayOnHands(Feature):
@@ -51,8 +51,8 @@ class LayOnHands(Feature):
@property
def name(self):
level = self.owner.Paladin.level
return self._name + " ({:d}HP/LR)".format(level*5)
level = self.owner.Paladin.level
return self._name + " ({:d}HP/LR)".format(level*5)
class PaladinFightingStyle(FeatureSelector):
@@ -68,10 +68,10 @@ class PaladinFightingStyle(FeatureSelector):
protection
"""
options = {'defense': Defense,
'dueling': Dueling,
'great': GreatWeaponFighting,
'great-weapon fighting': GreatWeaponFighting,
'projection': Protection}
'dueling': Dueling,
'great': GreatWeaponFighting,
'great-weapon fighting': GreatWeaponFighting,
'projection': Protection}
name = "Fighting Style (Select One)"
source = "Paladin"
@@ -152,8 +152,8 @@ class CleansingTouch(Feature):
@property
def name(self):
num_uses = max(1, 1+self.owner.charisma.modifier)
return self._name + ' ({:d}x/LR)'.format(num_uses)
num_uses = max(1, 1+self.owner.charisma.modifier)
return self._name + ' ({:d}x/LR)'.format(num_uses)
class ChannelDivinityPaladin(Feature):
+8 -8
View File
@@ -585,13 +585,13 @@ class NaturalArmor(Feature):
source = "Race (Lizardfolk)"
def AC_func(self, char, **kwargs):
"""
Implement the Natural Armor AC option
"""
ac = 13 + char.dexterity.modifier
if ((char.shield is not None)):
ac += char.shield.base_armor_class
return ac
"""
Implement the Natural Armor AC option
"""
ac = 13 + char.dexterity.modifier
if ((char.shield is not None)):
ac += char.shield.base_armor_class
return ac
class HungryJaws(Feature):
@@ -833,7 +833,7 @@ class SavingFace(Feature):
name = "Saving Face"
source = "Race (HobGoblin)"
class MartialTraining(Feature): #you have to add the weapons of choice to your sheet
class MartialTraining(Feature): #you have to add the weapons of choice to your sheet
"""You are proficient with two martial weapons of your choice and with light armor.
"""
+57 -57
View File
@@ -28,30 +28,30 @@ class FavoredEnemy(Feature):
class NaturalExplorer(Feature):
"""You are particularly familiar with one type of natural environment and are
adept at traveling and surviving in such regions. Choose one type of
favored terrain: arctic, coast, desert, forest, grassland, mountain, swamp,
or the Underdark. You choose additional favored terrain types at 6th and
10th
When you make an Intelligence or Wisdom check related to your favored
terrain, your proficiency bonus is doubled if you are using a skill that
you're proficient in. While traveling for an hour or more in your favored
terrain, you gain the following benefits:
• Difficult terrain doesn't slow your group's travel.
Your group can't become lost except by magical means.
• Even when you are engaged in another activity while traveling
(such as foraging, navigating, or tracking), you remain alert to danger.
• If you are traveling alone, you can move stealthily at a normal pace.
• When you forage, you find twice as much food as you normally would.
• While tracking other creatures, you also learn their exact number, their
sizes, and how long ago they passed through the area.
"""You are particularly familiar with one type of natural environment
and are adept at traveling and surviving in such regions. Choose
one type of favored terrain: arctic, coast, desert, forest,
grassland, mountain, swamp, or the Underdark. You choose
additional favored terrain types at 6th and 10th
When you make an Intelligence or Wisdom check related to your
favored terrain, your proficiency bonus is doubled if you are
using a skill that you're proficient in. While traveling for an
hour or more in your favored terrain, you gain the following
benefits:
- Difficult terrain doesn't slow your group's travel.
- Your group can't become lost except by magical means.
- Even when you are engaged in another activity while traveling
(such as foraging, navigating, or tracking), you remain alert to
danger.
- If you are traveling alone, you can move stealthily at a normal
pace.
- When you forage, you find twice as much food as you normally
would.
- While tracking other creatures, you also learn their exact
number, their sizes, and how long ago they passed through the
area.
"""
name = "Natural Explorer"
@@ -67,11 +67,11 @@ class Archery(Feature):
source = "Ranger"
def weapon_func(self, weapon: weapons.Weapon, **kwargs):
"""
+2 attack roll bonus if weapon is ranged
"""
if isinstance(weapon, weapons.RangedWeapon):
weapon.attack_bonus += 2
"""
+2 attack roll bonus if weapon is ranged
"""
if isinstance(weapon, weapons.RangedWeapon):
weapon.attack_bonus += 2
class Defense(Feature):
@@ -92,12 +92,12 @@ class Dueling(Feature):
source = "Ranger"
def weapon_func(self, weapon: weapons.Weapon, **kwargs):
"""
+2 attack roll bonus if melee weapon is not two handed
"""
if (isinstance(weapon, weapons.MeleeWeapon)
and "two-handed" not in weapon.properties.lower()):
weapon.damage_bonus += 2
"""
+2 attack roll bonus if melee weapon is not two handed
"""
if (isinstance(weapon, weapons.MeleeWeapon)
and "two-handed" not in weapon.properties.lower()):
weapon.damage_bonus += 2
class TwoWeaponFighting(Feature):
@@ -122,11 +122,11 @@ class RangerFightingStyle(FeatureSelector):
two-weapon fighting
"""
options = {'archery': Archery,
'defense': Defense,
'dueling': Dueling,
'two-weapon fighting': TwoWeaponFighting,
'two-weapon': TwoWeaponFighting,
'dual wield': TwoWeaponFighting}
'defense': Defense,
'dueling': Dueling,
'two-weapon fighting': TwoWeaponFighting,
'two-weapon': TwoWeaponFighting,
'dual wield': TwoWeaponFighting}
name = "Fighting Style (Select One)"
source = "Ranger"
@@ -249,8 +249,8 @@ class HuntersPrey(FeatureSelector):
"""
options = {'colossus slayer': ColossusSlayer,
'giant killer': GiantKiller,
'horde breaker': HordeBreaker}
'giant killer': GiantKiller,
'horde breaker': HordeBreaker}
name = "Hunter's Prey (Select One)"
source = "Ranger (Hunter)"
@@ -292,8 +292,8 @@ class DefensiveTactics(FeatureSelector):
"""
options = {'escape the horde': EscapeTheHorde,
'multiattack defense': MultiattackDefense,
'steel will': SteelWill}
'multiattack defense': MultiattackDefense,
'steel will': SteelWill}
name = "Defensive Tactics (Select One)"
source = "Ranger (Hunter)"
@@ -328,7 +328,7 @@ class MultiattackRanger(FeatureSelector):
"""
options = {'volley': Volley,
'whirlwind attack': WhirlwindAttack}
'whirlwind attack': WhirlwindAttack}
name = "Multiattack (Select One)"
source = "Ranger (Hunter)"
@@ -355,8 +355,8 @@ class SuperiorHuntersDefense(FeatureSelector):
"""
options = {'evasion': Evasion,
'stand against of the tide': StandAgainstTheTide,
'uncanny dodge': UncannyDodge}
'stand against of the tide': StandAgainstTheTide,
'uncanny dodge': UncannyDodge}
name = "Superior Hunter's Defense (Select One)"
source = "Ranger (Hunter)"
@@ -458,7 +458,7 @@ class IronMind(Feature):
needs_implementation = True
def __init__(self, owner=None):
super().__init__(owner=owner)
super().__init__(owner=owner)
class StalkersFlurry(Feature):
@@ -510,10 +510,10 @@ class PlanarWarrior(Feature):
@property
def name(self):
if self.owner.Ranger.level < 11:
return self._name + " (1d8/f)"
else:
return self._name + " (2d8/f)"
if self.owner.Ranger.level < 11:
return self._name + " (1d8/f)"
else:
return self._name + " (2d8/f)"
class EtherealStep(Feature):
@@ -568,8 +568,8 @@ class HuntersSense(Feature):
@property
def name(self):
num = max(1, self.owner.wisdom.modifier)
return self._num + " ({:d}x/LR)".format(num)
num = max(1, self.owner.wisdom.modifier)
return self._num + " ({:d}x/LR)".format(num)
class SlayersPrey(Feature):
@@ -829,7 +829,7 @@ class CoordinatedAttack(Feature):
class BeastsDefense(Feature):
"""At 7th level, while your companion can see you, it has advantage on all
saving throw
saving throw
"""
name = "Beast's Defense"
@@ -848,8 +848,8 @@ class StormOfClawsAndFangs(Feature):
class SuperiorBeastsDefense(Feature):
"""At 15th level, whenever an attacker that your companion can see hits it
with an attack, it can use its reaction to halve the attack's damage
against it.
with an attack, it can use its reaction to halve the attack's damage
against it.
"""
name = "Superior Beast's Defense"
+6 -6
View File
@@ -38,10 +38,10 @@ class SneakAttack(Feature):
@property
def name(self):
level = self.owner.Rogue.level
dice = ceil(level / 2.)
name = self._name + " ({:d}d6)".format(dice)
return name
level = self.owner.Rogue.level
dice = ceil(level / 2.)
name = self._name + " ({:d}d6)".format(dice)
return name
class CunningAction(Feature):
@@ -463,8 +463,8 @@ class Survivalist(Feature):
"""
def __init__(self, owner=None):
super().__init__(owner=owner)
self.owner.skill_expertise += ("nature", "survival")
super().__init__(owner=owner)
self.owner.skill_expertise += ("nature", "survival")
class SuperiorMobility(Feature):
+21 -22
View File
@@ -417,29 +417,28 @@ class HoundOfIllOmen(Feature):
can see within 120 feet of you. The hound uses the dire wolf's statistics
(see the Monster Manual or appendix C in the Player's Handbook), with the
following changes:
The hound is size Medium, not Large, and it counts as a monstrosity, not
a beast.
• It appears with a number of temporary hit points equal to half your
sorcerer level.
• It can move through other creatures and objects as if they were
difficult terrain. The bound takes 5 force damage if it ends its turn
inside an object.
• At the start of its turn, the hound automatically knows its target's
location. If the target was hidden, it is no longer hidden from the hound.
The hound appears in an unoccupied space of your choice within 30 feet of
the target. Roll initiative for the hound. On its turn, it can move only
toward its target by the most direct route, and it can use its action only
to attack its target. The hound can make opportunity attacks but only
against its target. Additionally, while the hound is within 5 feet of the
target, the target has disadvantage on saving throws against any spell you
cast. The hound disappears if it is reduced to 0 hit points, if its target
- The hound is size Medium, not Large, and it counts as a
monstrosity, not a beast.
- It appears with a number of temporary hit points equal to half
your sorcerer level.
- It can move through other creatures and objects as if they were
difficult terrain. The bound takes 5 force damage if it ends its
turn inside an object.
- At the start of its turn, the hound automatically knows its
target's location. If the target was hidden, it is no longer
hidden from the hound.
The hound appears in an unoccupied space of your choice within 30
feet of the target. Roll initiative for the hound. On its turn, it
can move only toward its target by the most direct route, and it
can use its action only to attack its target. The hound can make
opportunity attacks but only against its target. Additionally,
while the hound is within 5 feet of the target, the target has
disadvantage on saving throws against any spell you cast. The
hound disappears if it is reduced to 0 hit points, if its target
is reduced to 0 hit points, or after 5 minutes.
"""
name = "Hound of Ill Omen"
source = "Sorceror (Shadow Magic)"
+48 -50
View File
@@ -91,11 +91,11 @@ class PactBoon(FeatureSelector):
"""
options = {'chain': PactOfTheChain,
'pact of the chain': PactOfTheChain,
'blade': PactOfTheBlade,
'pact of the blade': PactOfTheBlade,
'tome': PactOfTheTome,
'pact of the tome': PactOfTheTome}
'pact of the chain': PactOfTheChain,
'blade': PactOfTheBlade,
'pact of the blade': PactOfTheBlade,
'tome': PactOfTheTome,
'pact of the tome': PactOfTheTome}
name = "Pact Boon (Select One)"
source = "Warlock"
@@ -203,9 +203,9 @@ class DarkOnesBlessing(Feature):
@property
def name(self):
level = self.owner.Warlock.level
mod = self.owner.charisma.modifier
return self._name + ' ({:d} HP)'.format(level + mod)
level = self.owner.Warlock.level
mod = self.owner.charisma.modifier
return self._name + ' ({:d} HP)'.format(level + mod)
class DarkOnesOwnLuck(Feature):
@@ -377,8 +377,8 @@ class HealingLight(Feature):
@property
def name(self):
num = 1 + self.owner.Warlock.level
return self._name + " ({:d}d6/LR)".format(num)
num = 1 + self.owner.Warlock.level
return self._name + " ({:d}d6/LR)".format(num)
class RadiantSoul(Feature):
@@ -427,18 +427,16 @@ class HexbladesCurse(Feature):
of you. The target is cursed for 1 minute. The curse ends early if the
target dies, you die, or you are incapacitated. Until the curse ends, you
gain the following benefits:
You gain a bonus to damage rolls against the
cursed target. The bonus equals your proficiency bonus.
• Any attack roll you make against the cursed target is a critical hit on
a roll of 19 or 20 on the d20.
--If the cursed target dies, you regain hit points equal to your warlock
level + your Charisma modifier (minimum of 1 hit point).
- You gain a bonus to damage rolls against the cursed target. The
bonus equals your proficiency bonus.
- Any attack roll you make against the cursed target is a critical
hit on a roll of 19 or 20 on the d20.
- If the cursed target dies, you regain hit points equal to your
warlock level + your Charisma modifier (minimum of 1 hit point).
You can't use this feature again until you finish a short or long rest.
"""
name = "Hexblades Curse"
source = "Warlock (Hexblade)"
@@ -463,18 +461,18 @@ class HexWarrior(Feature):
source = "Warlock (Hexblade)"
def weapon_func(self, weapon: weapons.Weapon, **kwargs):
"""
Swap the weapon's attack bonus modifier for Charisma if
it is higher than STR/DEX bonus
"""
if weapon.is_finesse:
abils = {'strength': self.owner.strength.modifier,
'dexterity': self.owner.dexterity.modifier,
'charisma': self.owner.charisma.modifier}
else:
abils = {weapon.ability: getattr(self.owner, weapon.ability).modifier,
'charisma': self.owner.charisma.modifier}
weapon.ability = max(abils, key=abils.get)
"""
Swap the weapon's attack bonus modifier for Charisma if
it is higher than STR/DEX bonus
"""
if weapon.is_finesse:
abils = {'strength': self.owner.strength.modifier,
'dexterity': self.owner.dexterity.modifier,
'charisma': self.owner.charisma.modifier}
else:
abils = {weapon.ability: getattr(self.owner, weapon.ability).modifier,
'charisma': self.owner.charisma.modifier}
weapon.ability = max(abils, key=abils.get)
class AccursedSpecter(Feature):
@@ -532,19 +530,19 @@ class Invocation(Feature):
at_will_spells = ()
def cast_spell_at_will(self, spell):
s = spell()
s.level = 0
if 'M' in s.components:
c = list(s.components)
c.remove('M')
s.components = tuple(c)
self.spells_known += (s,)
self.spells_prepared += (s,)
s = spell()
s.level = 0
if 'M' in s.components:
c = list(s.components)
c.remove('M')
s.components = tuple(c)
self.spells_known += (s,)
self.spells_prepared += (s,)
def __init__(self, owner):
super().__init__(owner)
for s in self.at_will_spells:
self.cast_spell_at_will(s)
super().__init__(owner)
for s in self.at_will_spells:
self.cast_spell_at_will(s)
# PHB
@@ -953,12 +951,12 @@ class ImprovedPactWeapon(Invocation):
name = "Improved Pact Weapon"
def weapon_func(self, weapon: weapons.Weapon, **kwargs):
"""
Add +1 to attack and damage if magic is not already magic
"""
if (weapon.attack_bonus == 0) or (weapon.damage_bonus == 0):
weapon.attack_bonus += 1
weapon.damage_bonus += 1
"""
Add +1 to attack and damage if magic is not already magic
"""
if (weapon.attack_bonus == 0) or (weapon.damage_bonus == 0):
weapon.attack_bonus += 1
weapon.damage_bonus += 1
class LanceOfLethargy(Invocation):
+28 -27
View File
@@ -307,8 +307,8 @@ class AlterMemories(Feature):
@property
def name(self):
num = 1 + max(0, self.owner.charisma.modifier)
return self._name + " ({:d} hours)".format(num)
num = 1 + max(0, self.owner.charisma.modifier)
return self._name + " ({:d} hours)".format(num)
# Evocation
@@ -525,24 +525,24 @@ class MinorAlchemy(Feature):
class TransmutersStone(Feature):
"""Starting at 6th level, you can spend 8 hours creating a transmuter's stone
that stores transmutation magic. You can benefit from the stone yourself or
give it to another creature. A creature gains a benefit of your choice as
long as the stone is in the creature's possession. When you create the
stone, choose the benefit from the following options:
• Darkvision out to a range of 60 feet, as described in chapter 8
An increase to speed of 10 feet while the creature is unencumbered
Proficiency in Constitution saving throws
• Resistance to acid, cold, fire, lightning, or thunder damage (your
choice whenever you choose this benefit)
Each time you cast a transmutation spell of 1st level or higher, you can
change the effect of your stone if the stone is on your person. If you
create a new transmuter's stone, the previous one ceases to function
"""Starting at 6th level, you can spend 8 hours creating a
transmuter's stone that stores transmutation magic. You can
benefit from the stone yourself or give it to another creature. A
creature gains a benefit of your choice as long as the stone is in
the creature's possession. When you create the stone, choose the
benefit from the following options:
- Darkvision out to a range of 60 feet, as described in chapter 8
- An increase to speed of 10 feet while the creature is
unencumbered
- Proficiency in Constitution saving throws
- Resistance to acid, cold, fire, lightning, or thunder damage
(your choice whenever you choose this benefit)
Each time you cast a transmutation spell of 1st level or higher,
you can change the effect of your stone if the stone is on your
person. If you create a new transmuter's stone, the previous one
ceases to function
"""
name = "Transmuter's Stone"
@@ -550,13 +550,14 @@ class TransmutersStone(Feature):
class Shapechanger(Feature):
"""At 10th level, you add the polymorph spell to your spellbook, if it is not
there already. You can cast polymorph without expending a spell slot. When
you do so, you can target only yourself and transform into a beast whose
challenge rating is 1 or lower. Once you cast polymorph in this way, you
can't do so again until you finish a short or long rest, though you can
still cast it normally using an available spell slot
"""At 10th level, you add the polymorph spell to your spellbook, if it
is not there already. You can cast polymorph without expending a
spell slot. When you do so, you can target only yourself and
transform into a beast whose challenge rating is 1 or lower. Once
you cast polymorph in this way, you can't do so again until you
finish a short or long rest, though you can still cast it normally
using an available spell slot
"""
name = "Shapechanger"
source = "Wizard (School of Transmutation)"