mirror of
https://github.com/Threnklyn/dungeon-sheets.git
synced 2026-05-19 04:33:26 +02:00
Fixed some docstrings for spells and features.
This commit is contained in:
+255
-269
@@ -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
|
||||
replace one of the artificer infusions you learned with a new one.
|
||||
|
||||
**Infusing an item**
|
||||
Whenever you finish a long rest, you can touch a nonmagical object and
|
||||
imbue it with one of your artificer infusions, 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
|
||||
infusions, 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 replace
|
||||
one of the artificer infusions you learned with a new one.
|
||||
Infusing an item
|
||||
Whenever you finish a long rest, you can touch a nonmagical
|
||||
object and imbue it with one of your artificer infusions,
|
||||
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 infusions, 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 outright, 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 outright, 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 woodcarver'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 woodcarver'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 become 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)"
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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
@@ -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"
|
||||
|
||||
+604
-629
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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.
|
||||
|
||||
"""
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)"
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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)"
|
||||
|
||||
Reference in New Issue
Block a user