All features added for cleric, druid, fighter, monk

This commit is contained in:
Ben Cook
2018-12-31 19:36:05 -05:00
parent d8c11b6ed1
commit 5411084001
13 changed files with 3648 additions and 52 deletions
+103 -13
View File
@@ -40,8 +40,17 @@ class KnowledgeDomain(ClericDomain):
"""
name = "Knowledge Domain"
_domain_spells = {1: [], 3: [], 5: [], 7: [], 9: []}
_domain_spells = {1: [spells.Command, spells.Identify],
3: [spells.Augury, spells.Suggestion],
5: [spells.Nondetection, spells.SpeakWithDead],
7: [spells.ArcaneEye, spells.Confusion],
9: [spells.LegendLore, spells.Scrying]}
features_by_level = defaultdict(list)
features_by_level[1] = [features.BlessingsOfKnowledge]
features_by_level[2] = [features.KnowledgeOfTheAncients]
features_by_level[6] = [features.ReadThoughts]
features_by_level[8] = [features.PotentSpellcasting]
features_by_level[17] = [features.VisionsOfThePast]
class LifeDomain(ClericDomain):
@@ -57,8 +66,18 @@ class LifeDomain(ClericDomain):
"""
name = "Life Domain"
_domain_spells = {1: [], 3: [], 5: [], 7: [], 9: []}
_domain_spells = {1: [spells.Bless, spells.CureWounds],
3: [spells.LesserRestoration, spells.SpiritualWeapon],
5: [spells.BeaconOfHope, spells.Revivify],
7: [spells.DeathWard, spells.GuardianOfFaith],
9: [spells.MassCureWounds, spells.RaiseDead]}
_proficiencies_text = ('heavy armor',)
features_by_level = defaultdict(list)
features_by_level[1] = [features.DiscipleOfLife]
features_by_level[2] = [features.PreserveLife]
features_by_level[6] = [features.BlessedHealer]
features_by_level[8] = [features.DivineStrikeLife]
features_by_level[17] = [features.SupremeHealing]
class LightDomain(ClericDomain):
@@ -75,8 +94,19 @@ class LightDomain(ClericDomain):
"""
name = "Light Domain"
_domain_spells = {1: [], 3: [], 5: [], 7: [], 9: []}
_domain_spells = {1: [spells.BurningHands, spells.FaerieFire],
3: [spells.FlamingSphere, spells.ScorchingRay],
5: [spells.Daylight, spells.Fireball],
7: [spells.GuardianOfFaith, spells.WallOfFire],
9: [spells.FlameStrike, spells.Scrying]}
spells_known = (spells.Light,)
spells_prepared = (spells.Light,)
features_by_level = defaultdict(list)
features_by_level[1] = [features.WardingFlare]
features_by_level[2] = [features.RadianceOfTheDawn]
features_by_level[6] = [features.ImprovedFlare]
features_by_level[8] = [features.PotentSpellcasting]
features_by_level[17] = [features.CoronaOfLight]
class NatureDomain(ClericDomain):
@@ -93,8 +123,18 @@ class NatureDomain(ClericDomain):
"""
name = "Nature Domain"
_domain_spells = {1: [], 3: [], 5: [], 7: [], 9: []}
_domain_spells = {1: [spells.AnimalFriendship, spells.SpeakWithAnimals],
3: [spells.Barkskin, spells.SpikeGrowth],
5: [spells.PlantGrowth, spells.WindWall],
7: [spells.DominateBeast, spells.GraspingVine],
9: [spells.InsectPlague, spells.TreeStride]}
_proficiencies_text = ('heavy armor',)
features_by_level = defaultdict(list)
features_by_level[1] = [features.AcolyteOfNature]
features_by_level[2] = [features.CharmAnimalsAndPlants]
features_by_level[6] = [features.DampenElements]
features_by_level[8] = [features.DivineStrikeNature]
features_by_level[17] = [features.MasterOfNature]
class TempestDomain(ClericDomain):
@@ -120,11 +160,11 @@ class TempestDomain(ClericDomain):
weapon_proficiencies = (weapons.MartialWeapon,)
_proficiencies_text = ('martial weapons', 'heavy armor')
features_by_level = defaultdict(list)
features_by_level[1] = (features.WrathOfTheStorm,)
features_by_level[2] = (features.DestructiveWrath,)
features_by_level[6] = (features.ThunderboltStrike,)
features_by_level[8] = (features.DivineStrikeTempest,)
features_by_level[17] = (features.Stormborn,)
features_by_level[1] = [features.WrathOfTheStorm]
features_by_level[2] = [features.DestructiveWrath]
features_by_level[6] = [features.ThunderboltStrike]
features_by_level[8] = [features.DivineStrikeTempest]
features_by_level[17] = [features.Stormborn]
class TrickeryDomain(ClericDomain):
@@ -139,8 +179,17 @@ class TrickeryDomain(ClericDomain):
"""
name = "Trickery Domain"
_domain_spells = {1: [], 3: [], 5: [], 7: [], 9: []}
_domain_spells = {1: [spells.CharmPerson, spells.DisguiseSelf],
3: [spells.MirrorImage, spells.PassWithoutTrace],
5: [spells.Blink, spells.DispelMagic],
7: [spells.DimensionDoor, spells.Polymorph],
9: [spells.DominatePerson, spells.ModifyMemory]}
features_by_level = defaultdict(list)
features_by_level[1] = [features.BlessingOfTheTrickster]
features_by_level[2] = [features.InvokeDuplicity]
features_by_level[6] = [features.CloakOfShadows]
features_by_level[8] = [features.DivineStrikeTrickery]
features_by_level[17] = [features.ImprovedDuplicity]
class WarDomain(ClericDomain):
@@ -159,8 +208,19 @@ class WarDomain(ClericDomain):
"""
name = "War Domain"
_domain_spells = {1: [], 3: [], 5: [], 7: [], 9: []}
_domain_spells = {1: [spells.DivineFavor, spells.ShieldOfFaith],
3: [spells.MagicWeapon, spells.SpiritualWeapon],
5: [spells.CrusadersMantle, spells.SpiritGuardians],
7: [spells.FreedomOfMovement, spells.Stoneskin],
9: [spells.FlameStrike, spells.HoldMonster]}
weapon_proficiencies = (weapons.MartialWeapon,)
_proficiencies_text = ('martial weapons', 'heavy armor')
features_by_level = defaultdict(list)
features_by_level[1] = [features.WarPriest]
features_by_level[2] = [features.GuidedStrike]
features_by_level[6] = [features.WarGodsBlessing]
features_by_level[8] = [features.DivineStrikeWar]
features_by_level[17] = [features.AvatarOfBattle]
# SCAG
@@ -181,8 +241,17 @@ class ArcanaDomain(ClericDomain):
"""
name = "Arcana Domain"
_domain_spells = {1: [], 3: [], 5: [], 7: [], 9: []}
_domain_spells = {1: [spells.DetectMagic, spells.MagicMissile],
3: [spells.MagicWeapon, spells.NystulsMagicAura],
5: [spells.DispelMagic, spells.MagicCircle],
7: [spells.ArcaneEye, spells.LeomundsSecretChest],
9: [spells.PlanarBinding, spells.TeleportationCircle]}
features_by_level = defaultdict(list)
features_by_level[1] = [features.ArcaneInitiate]
features_by_level[2] = [features.ArcaneAbjuration]
features_by_level[6] = [features.SpellBreaker]
features_by_level[8] = [features.PotentSpellcasting]
features_by_level[17] = [features.ArcaneMastery]
# XGTE
@@ -201,7 +270,18 @@ class ForgeDomain(ClericDomain):
"""
name = "Forge Domain"
_domain_spells = {1: [spells.Identify, spells.SearingSmite],
3: [spells.HeatMetal, spells.MagicWeapon],
5: [spells.ElementalWeapon, spells.ProtectionFromEnergy],
7: [spells.Fabricate, spells.WallOfFire],
9: [spells.AnimateObjects, spells.Creation]}
_proficiencies_text = ('heavy armor', "smith's tools")
features_by_level = defaultdict(list)
features_by_level[1] = [features.BlessingOfTheForge]
features_by_level[2] = [features.ArtisansBlessing]
features_by_level[6] = [features.SoulOfTheForge]
features_by_level[8] = [features.DivineStrikeForge]
features_by_level[17] = [features.SaintOfForgeAndFire]
class GraveDomain(ClericDomain):
@@ -218,8 +298,18 @@ class GraveDomain(ClericDomain):
"""
name = "Grave Domain"
_domain_spells = {1: [], 3: [], 5: [], 7: [], 9: []}
_domain_spells = {1: [spells.Bane, spells.FalseLife],
3: [spells.GentleRepose, spells.RayOfEnfeeblement],
5: [spells.Revivify, spells.VampiricTouch],
7: [spells.Blight, spells.DeathWard],
9: [spells.AntilifeShell, spells.RaiseDead]}
features_by_level = defaultdict(list)
features_by_level[1] = [features.CircleOfMortality,
features.EyesOfTheGrave]
features_by_level[2] = [features.PathToTheGrave]
features_by_level[6] = [features.SentinelAtDeathsDoor]
features_by_level[8] = [features.PotentSpellcasting]
features_by_level[17] = [features.KeeperOfSouls]
class Cleric(CharClass):
+22 -1
View File
@@ -21,6 +21,11 @@ class LandCircle(SubClass):
name = "Circle of the Land"
circle = "land"
features_by_level = defaultdict(list)
features_by_level[2] = [features.BonusCantrip, features.NaturalRecovery]
features_by_level[3] = [features.CircleSpells]
features_by_level[6] = [features.LandsStride]
features_by_level[10] = [features.NaturesWard]
features_by_level[14] = [features.NaturesSanctuary]
class MoonCircle(SubClass):
@@ -39,6 +44,10 @@ class MoonCircle(SubClass):
name = "Circle of the Moon"
circle = "moon"
features_by_level = defaultdict(list)
features_by_level[2] = [features.CombatWildShape, features.CircleForms]
features_by_level[6] = [features.PrimalStrike]
features_by_level[10] = [features.ElementalWildShape]
features_by_level[14] = [features.ThousandForms]
# XGTE
@@ -55,6 +64,10 @@ class DreamsCircle(SubClass):
name = "Circle of Dreams"
circle = "dreams"
features_by_level = defaultdict(list)
features_by_level[2] = [features.BalmOfTheSummerCourt]
features_by_level[6] = [features.HearthOfMoonlightAndShadow]
features_by_level[10] = [features.HiddenPaths]
features_by_level[14] = [features.WalkerInDreams]
class ShepherdCircle(SubClass):
@@ -78,7 +91,12 @@ class ShepherdCircle(SubClass):
"""
name = "Circle of the Shepherd"
circle = "shepherd"
languages = ('Sylvan',)
features_by_level = defaultdict(list)
features_by_level[2] = [features.SpeechOfTheWoods, features.SpiritTotem]
features_by_level[6] = [features.MightySummoner]
features_by_level[10] = [features.GuardianSpirit]
features_by_level[14] = [features.FaithfulSummons]
class Druid(CharClass):
@@ -106,7 +124,10 @@ class Druid(CharClass):
class_skill_choices = ('Arcana', 'Animal Handling', 'Insight',
'Medicine', 'Nature', 'Perception', 'Religion',
'Survival')
features_by_class = defaultdict(list)
features_by_level = defaultdict(list)
features_by_level[2] = [features.WildShape]
features_by_level[18] = [features.TimelessBody, features.BeastSpells]
features_by_level[20] = [features.Archdruid]
subclasses_available = (LandCircle, MoonCircle, DreamsCircle,
ShepherdCircle)
spellcasting_ability = 'wisdom'
+19
View File
@@ -102,6 +102,10 @@ class PurpleDragonKnight(SubClass):
"""
name = "Purple Dragon Knight"
features_by_level = defaultdict(list)
features_by_level[3] = [features.RallyingCry]
features_by_level[7] = [features.RoyalEnvoy]
features_by_level[10] = [features.InspiringSurge]
features_by_level[15] = [features.Bulwark]
# XGTE
@@ -118,6 +122,9 @@ class ArcaneArcher(SubClass):
"""
name = "Arcane Archer"
features_by_level = defaultdict(list)
features_by_level[3] = [features.ArcaneArcherLore, features.ArcaneShot]
features_by_level[7] = [features.MagicArrow, features.CurvingShot]
features_by_level[15] = [features.EverReadyShot]
class Cavalier(SubClass):
@@ -132,6 +139,12 @@ class Cavalier(SubClass):
"""
name = "Cavalier"
features_by_level = defaultdict(list)
features_by_level[3] = [features.BonusProficiencyCavalier,
features.BornToTheSaddle, features.UnwaveringMark]
features_by_level[7] = [features.WardingManeuver]
features_by_level[10] = [features.HoldTheLine]
features_by_level[15] = [features.FerociousCharger]
features_by_level[18] = [features.VigilantDefender]
class Samurai(SubClass):
@@ -142,6 +155,12 @@ class Samurai(SubClass):
"""
name = "Samurai"
features_by_level = defaultdict(list)
features_by_level[3] = [features.BonusProficiencySamurai,
features.FightingSpirit]
features_by_level[7] = [features.ElegantCourtier]
features_by_level[10] = [features.TirelessSpirit]
features_by_level[15] = [features.RapidStrike]
features_by_level[18] = [features.StrengthBeforeDeath]
# Custom
+54 -11
View File
@@ -15,6 +15,10 @@ class OpenHandWay(SubClass):
"""
name = "Way of the Open Hand"
features_by_level = defaultdict(list)
features_by_level[3] = [features.OpenHandTechnique]
features_by_level[6] = [features.WholenessOfBody]
features_by_level[11] = [features.Tranquility]
features_by_level[17] = [features.QuiveringPalm]
class ShadowWay(SubClass):
@@ -30,6 +34,10 @@ class ShadowWay(SubClass):
"""
name = "Way of Shadow"
features_by_level = defaultdict(list)
features_by_level[3] = [features.ShadowArts]
features_by_level[6] = [features.ShadowStep]
features_by_level[11] = [features.CloakOfShadows]
features_by_level[17] = [features.Opportunist]
class FourElementsWay(SubClass):
@@ -45,21 +53,13 @@ class FourElementsWay(SubClass):
"""
name = "Way of the Four Elements"
spellcasting_ability = 'wisdom'
features_by_level = defaultdict(list)
features_by_level[3] = [features.DiscipleOfTheElements,
features.ElementalAttunement]
# SCAG
class SunSoulWay(SubClass):
"""Monks of the Way of the Sun Soul learn to channel their own life energy
into searing bolts of light. They teach that meditation can unlock the
ability to unleash the indomitable light shed by the soul of every living
creature
"""
name = "Way of the Sun Soul"
features_by_level = defaultdict(list)
class LongDeathWay(SubClass):
"""Monks of the Way of the Long Death are obsessed with the meaning and
mechanics of dying. They capture creatures and prepare elaborate
@@ -70,6 +70,25 @@ class LongDeathWay(SubClass):
"""
name = "Way of the Long Death"
features_by_level = defaultdict(list)
features_by_level[3] = [features.TouchOfDeath]
features_by_level[6] = [features.HourOfReaping]
features_by_level[11] = [features.MasteryOfDeath]
features_by_level[17] = [features.TouchOfTheLongDeath]
class SunSoulWay(SubClass):
"""Monks of the Way of the Sun Soul learn to channel their own life energy
into searing bolts of light. They teach that meditation can unlock the
ability to unleash the indomitable light shed by the soul of every living
creature
"""
name = "Way of the Sun Soul"
features_by_level = defaultdict(list)
features_by_level[3] = [features.RadiantSunBolt]
features_by_level[6] = [features.SearingArcStrike]
features_by_level[11] = [features.SearingSunburst]
features_by_level[17] = [features.SunShield]
# XGTE
@@ -87,7 +106,13 @@ class DrunkenMasterWay(SubClass):
"""
name = "Way of the Drunken Master"
_proficiencies_text = ("brewer's suplies",)
skill_proficiencies = ("performance",)
features_by_level = defaultdict(list)
features_by_level[3] = [features.DrunkenTechnique]
features_by_level[6] = [features.TipsySway]
features_by_level[11] = [features.DrunkardsLuck]
features_by_level[17] = [features.IntoxicatedFrenzy]
class KenseiWay(SubClass):
@@ -105,6 +130,10 @@ class KenseiWay(SubClass):
"""
name = "Way of the Kensei"
features_by_level = defaultdict(list)
features_by_level[3] = [features.PathOfTheKensei]
features_by_level[6] = [features.OneWithTheBlade]
features_by_level[11] = [features.SharpenTheBlade]
features_by_level[17] = [features.UnerringAccuracy]
class Monk(CharClass):
@@ -130,6 +159,20 @@ class Monk(CharClass):
features_by_level = defaultdict(list)
features_by_level[1] = [features.UnarmoredDefenseMonk,
features.MartialArts]
features_by_level[2] = [features.Ki, features.FlurryOfBlows,
features.PatientDefense, features.StepOfTheWind,
features.UnarmoredMovement]
features_by_level[3] = [features.DeflectMissiles]
features_by_level[4] = [features.SlowFall]
features_by_level[5] = [features.ExtraAttackMonk, features.StunningStrike]
features_by_level[6] = [features.KiEmpoweredStrikes]
features_by_level[7] = [features.Evasion, features.StillnessOfMind]
features_by_level[10] = [features.PurityOfBody]
features_by_level[13] = [features.TongueOfTheSunAndMoon]
features_by_level[14] = [features.DiamondSoul]
features_by_level[15] = [features.TimelessBody]
features_by_level[18] = [features.EmptyBody]
features_by_level[20] = [features.PerfectSelf]
def __init__(self, level, subclass=None, **params):
super().__init__(level, subclass=subclass, **params)
+625 -11
View File
@@ -1,4 +1,5 @@
from .features import Feature
from .. import spells
# Cleric Features
@@ -97,6 +98,280 @@ class DivineIntervention(Feature):
source = "Cleric"
class DivineStrike(Feature):
"""
Generic Divine Strike
"""
_name = "Divine Strike"
source = "Cleric"
@property
def name(self):
level = self.owner.Cleric.level
damage = ' (1d8)'
if level >= 14:
damage = ' (2d8)'
return self._name + damage
# Knowledge Domain
class BlessingsOfKnowledge(Feature):
"""At 1st level, you learn two languages of your choice. You also become
proficient in your choice o f two of the following skills: Arcana, History,
Nature, or Religion. Your proficiency bonus is doubled for any ability
check you make that uses either of those skills.
"""
name = "Blessings of Knowledge"
source = "Cleric (Knowledge Domain)"
class KnowledgeOfTheAncients(DivineIntervention):
"""Starting at 2nd level, you can use your Channel Divinity to tap into a
divine well o f knowledge. As an action, you choose one skill or tool. For
10 minutes, you have proficiency with the chosen skill or tool.
"""
name = "Divine Intervention: Knowledge of the Ancients"
source = "Cleric (Knowledge Domain)"
class ReadThoughts(DivineIntervention):
"""At 6th level, you can use your Channel Divinity to read a creatures
thoughts. You can then use your access to the creatures mind to command
it. As an action, choose one creature that you can see within 60 feet of
you. That creature must make a Wisdom saving throw. If the creature
succeeds on the saving throw, you cant use this feature on it again until
you finish a long rest.
If the creature fails its save, you can read its surface thoughts (those
foremost in its mind, reflecting its current emotions and what it is
actively thinking about) when it is within 60 feet of you. This effect
lasts for 1 minute. During that time, you can use your action to end this
effect and cast the suggestion spell on the creature without expending a
spell slot. The target automatically fails its saving throw against the
spell.
"""
name = "Divine Intervention: Read Thoughts"
source = "Cleric (Knowledge Domain)"
class PotentSpellcasting(Feature):
"""Starting at 8th level, you add your W isdom modifier to the damage you deal
with any cleric cantrip.
"""
name = "Potent Spellcasting"
source = "Cleric"
class VisionsOfThePast(Feature):
"""Starting at 17th level, you can call up visions of the past that relate to
an object you hold or your immediate surroundings. You spend at least 1
minute in meditation and prayer, then receive dreamlike, shadowy glimpses
of recent events. You can meditate in this way for a number of minutes
equal to your Wisdom score and must maintain concentration during that
time, as if you were casting a spell. Once you use this feature, you cant
use it again until you finish a short or long rest.
**Object Reading**: Holding an object as you meditate, you can see visions
of the objects previous owner. After meditating for 1 minute, you learn
how the owner acquired and lost the object, as well as the most recent
significant event involving the object and that owner. If the object was
owned by another creature in the recent past (within a number of days equal
to your Wisdom score), you can spend 1 additional minute for each owner to
learn the same information about that creature.
**Area Reading**: As you meditate, you see visions of recent events in your
immediate vicinity (a room, street, tunnel, clearing, or the like, up to a
50-foot cube), going back a number of days equal to your Wisdom score. For
each minute you meditate, you learn about one significant event, beginning
with the most recent. Significant events typically involve powerful
emotions, such as battles and betrayals, marriages and murders, births and
funerals. However, they might also include more mundane events that are
nevertheless important in your current situation.
"""
name = "Visions of the Past"
source = "Cleric (Knowledge Domain)"
# Life Domain
class DiscipleOfLife(Feature):
"""Also starting at 1st level, your healing spells are more
effective. Whenever you use a spell of 1st level or higher to restore hit
points to a creature, the creature regains additional hit points equal to 2
+ the spells level
"""
name = "Disciple of Life"
source = "Cleric (Life Domain)"
class PreserveLife(ChannelDivinity):
"""Starting at 2nd level, you can use your Channel Divinity to heal the badly
injured. As an action, you present your holy symbol and evoke healing
energy that can restore a number of hit points equal to five times your
cleric level. Choose any creatures within 30 feet of you, and divide those
hit points among them. This feature can restore a creature to no more than
half of its hit point maximum. You cant use this feature on an undead or a
construct.
"""
name = "Channel Divinity: Preserve Life"
source = "Cleric (Life Domain)"
class BlessedHealer(Feature):
"""Beginning at 6th level, the healing spells you cast on others heal you as
well. When you cast a spell of 1st level or higher that restores hit points
to a creature other than you, you regain hit points equal to 2 + the
spells level.
"""
name = "Blessed Healer"
source = "Cleric (Life Domain)"
class DivineStrikeLife(DivineStrike):
"""At 8th level, you gain the ability to infuse your weapon strikes with
divine energy. Once on each o f your turns when you hit a creature with a
weapon attack, you can cause the attack to deal an extra 1d8 radiant damage
to the target. When you reach 14th level, the extra damage increases to
2d8.
"""
source = "Cleric (Life Domain)"
class SupremeHealing(Feature):
"""Starting at 17th level, when you would normally roll one or more dice to
restore hit points with a spell, you instead use the highest number
possible for each die. For example, instead of restoring 2d6 hit points to
a creature, you restore 12.
"""
name = "Supreme Healing"
source = "Cleric (Life Domain)"
# Light Domain
class WardingFlare(Feature):
"""At 1st level, you can interpose divine light between yourself and an
attacking enemy. When you are attacked by a creature within 30 feet of you
that you can see, you can use your reaction to impose disadvantage on the
attack roll, causing light to flare before the attacker before it hits or
misses. An attacker that cant be blinded is immune to this feature. You
can use this feature a number of times equal to your Wisdom modifier (a
minimum of once). You regain all expended uses when you finish a long rest
"""
_name = "Warding Flare"
source = "Cleric (Light Domain)"
@property
def name(self):
times = max(1, self.owner.wisdom.modifier)
return self._name + " ({:d}x/LR)".format(times)
class RadianceOfTheDawn(ChannelDivinity):
"""Starting at 2nd level, you can use your Channel Divinity to harness
sunlight, banishing darkness and dealing radiant damage to your foes. As an
action, you present your holy symbol, and any magical darkness within 30
feet of you is dispelled.
Additionally, each hostile creature within 30 feet of you must make a
Constitution saving throw. A creature takes radiant damage equal to 2d10 +
your cleric level on a failed saving throw, and half as much damage on a
successful one. A creature that has total cover from you is not affected.
"""
name = "Channel Divinity: Radiance of the Dawn"
source = "Cleric (Light Domain)"
class ImprovedFlare(Feature):
"""Starting at 6th level, you can also use your Warding Flare feature when a
creature that you can see within 30 feet o f you attacks a creature other
than you.
"""
name = "Improved Flare"
source = "Cleric (Light Domain)"
class CoronaOfLight(Feature):
"""Starting at 17th level, you can use your action to activate an aura of
sunlight that lasts for 1 minute or until you dismiss it using another
action. You emit bright light in a 60-foot radius and dim light 30 feet
beyond that. Your enemies in the bright light have disadvantage on saving
throws against any spell that deals fire or radiant damage
"""
name = "Corona of Light"
source = "Cleric (Light Domain)"
# Nature Domain
class AcolyteOfNature(Feature):
"""At 1st level, you learn one druid cantrip of your choice. You also gain
proficiency in one of the following skills of your choice: Animal Handling,
Nature, or Survival.
"""
name = "Acolyte of Nature"
source = "Cleric (Nature Domain)"
class CharmAnimalsAndPlants(ChannelDivinity):
"""Starting at 2nd level, you can use your Channel Divinity to charm animals
and plants. As an action, you present your holy symbol and invoke the name
of your deity. Each beast or plant creature that can see you within 30 feet
of you must make a Wisdom saving throw.
If the creature fails its saving throw, it is charmed by you for 1 minute
or until it takes damage. While it is charmed by you, it is friendly to you
and other creatures you designate.
"""
name = "Channel Divinity: Charm Animals and Plants"
source = "Cleric (Nature Domain)"
class DampenElements(Feature):
"""Starting at 6th level, when you or a creature within 30 feet of you takes
acid, cold, fire, lightning, or thunder damage, you can use your reaction
to grant resistance to the creature against that instance of the damage.
"""
name = "Dampen Elements"
source = "Cleric (Nature Domain)"
class DivineStrikeNature(DivineStrike):
"""At 8th level, you gain the ability to infuse your weapon strikes with
divine energy. Once on each of your turns when you hit a creature with a
weapon attack, you can cause the attack to deal an extra 1d8 cold, fire, or
lightning damage (your choice) to the target. When you reach 14th level,
the extra damage increases to 2d8.
"""
source = "Cleric (Nature Domain)"
class MasterOfNature(Feature):
"""At 17th level, you gain the ability to command animals and plant
creatures. While creatures are charmed by your Charm Animals and Plants
feature, you can take a bonus action on your turn to verbally command what
each of those creatures will do on its next turn.
"""
name = "Master of Nature"
source = "Cleric (Nature Domain)"
# Tempest Domain
class WrathOfTheStorm(Feature):
"""Also at 1st level, you can thunderously rebuke attackers. When a creature
@@ -139,7 +414,7 @@ class ThunderboltStrike(Feature):
source = "Cleric (Tempest Domain)"
class DivineStrikeTempest(Feature):
class DivineStrikeTempest(DivineStrike):
"""At 8th level, you gain the ability to infuse your weapon strikes with
divine energy. Once on each of your turns when you hit a creature with a
weapon attack, you can cause the attack to deal an extra 1d8 thunder damage
@@ -147,21 +422,360 @@ class DivineStrikeTempest(Feature):
2d8.
"""
_name = "Divine Strike"
source = "Cleric (Tempest Domain)"
@property
def name(self):
level = self.owner.Cleric.level
if level < 14:
return self._name + " (1d8)"
else:
return self._name + " (2d8)"
class Stormborn(Feature):
"""At 17th level, you have a flying speed equal to your current walking speed
whenever you are not underground or indoors.
whenever you are not underground or indoors.
"""
name = "Stormborn"
source = "Cleric (Tempest Domain)"
# Trickery Domain
class BlessingOfTheTrickster(Feature):
"""Starting when you choose this domain at 1st level, you can use your action
to touch a willing creature other than yourself to give it advantage on
Dexterity (Stealth) checks. This blessing lasts for 1 hour or until you use
this feature again
"""
name = "Blessing of the Trickster"
source = "Cleric (Trickery Domain)"
class InvokeDuplicity(ChannelDivinity):
"""Starting at 2nd level, you can use your Channel Divinity to create an
illusory duplicate o f yourself. As an action, you create a perfect
illusion of yourself that lasts for 1 minute, or until you lose your
concentration (as if you were concentrating on a spell). The illusion
appears in an unoccupied space that you can see within 30 feet of you. As a
bonus action on your turn, you can move the illusion up to 30 feet to a
space you can see, but it must remain within 120 feet of you.
For the duration, you can cast spells as though you were in the illusions
space, but you must use your own senses. Additionally, when both you and
your illusion are within 5 feet of a creature that can see the illusion,
you have advantage on attack rolls against that creature, given how
distracting the illusion is to the target.
"""
name = "Channel Divinity: Invoke Duplicity"
source = "Cleric (Trickery Domain)"
class CloakOfShadows(ChannelDivinity):
"""Starting at 6th level, you can use your Channel Divinity to vanish. As an
action, you become invisible until the end of your next turn. You become
visible if you attack or cast a spell.
"""
name = "Channel Divinity: Cloak of Shadows"
source = "Cleric (Trickery Domain)"
class DivineStrikeTrickery(DivineStrike):
"""At 8th level, you gain the ability to infuse your weapon strikes with
poison—a gift from your deity. Once on each of your turns when you hit a
creature with a weapon attack, you can cause the attack to deal an extra
1d8 poison damage to the target. When you reach 14th level, the extra
damage increases to 2d8.
"""
source = "Cleric (Trickery Domain)"
class ImprovedDuplicity(Feature):
"""At 17th level, you can create up to four duplicates of yourself, instead of
one, when you use Invoke Duplicity. As a bonus action on your turn, you can
move any number of them up to 30 feet, to a maximum range of 120 feet.
"""
name = "Improved Duplicity"
source = "Cleric (Trickery Domain)"
# War Domain
class WarPriest(Feature):
"""From 1st level, your god delivers bolts of inspiration to you while you are
engaged in battle. When you use the Attack action, you can make one weapon
attack as a bonus action. You can use this feature a number of times equal
to your Wisdom modifier (a minimum of once). You regain all expended uses
when you finish a long rest
"""
_name = "War Priest"
source = "Cleric (War Domain)"
@property
def name(self):
num = max(1, self.owner.wisdom.modifier)
return self._name + " ({:d}x/LR)".format(num)
class GuidedStrike(ChannelDivinity):
"""Starting at 2nd level, you can use your Channel Divinity to strike with
supernatural accuracy. When you make an attack roll, you can use your
Channel Divinity to gain a +10 bonus to the roll. You make this choice
after you see the roll, but before the DM says whether the attack hits or
misses
"""
name = "Channel Divinity: Guided Strike"
source = "Cleric (War Domain)"
class WarGodsBlessing(ChannelDivinity):
"""At 6th level, when a creature within 30 feet of you makes an attack roll,
you can use your reaction to grant that creature a +10 bonus to the roll,
using your Channel Divinity. You make this choice after you see the roll,
but before the DM says whether the attack hits or misses.
"""
name = "Channel Divinity: War Gods Blessing"
source = "Cleric (War Domain)"
class DivineStrikeWar(DivineStrike):
"""At 8th level, you gain the ability to infuse your weapon strikes with
divine energy. Once on each of your turns when you hit a creature with a
weapon attack, you can cause the attack to deal an extra 1d8 damage of the
same type dealt by the weapon to the target. When you reach 14th level, the
extra damage increases to 2d8.
"""
source = "Cleric (War Domain)"
class AvatarOfBattle(Feature):
"""At 17th level, you gain resistance to bludgeoning, piercing, and slashing
damage from nonmagical weapons.
"""
name = "Avatar of Battle"
source = "Cleric (War Domain)"
# Arcana Domain
class ArcaneInitiate(Feature):
"""When you choose this domain at 1st level, you gain proficiency in the
Arcana skill, and you gain two cantrips of your choice from the wizard
spell list. For you, these cantrips count as cleric cantrips
"""
name = "Arcane Initiate"
source = "Cleric (Arcana Domain)"
class ArcaneAbjuration(ChannelDivinity):
"""Starting at 2nd level, you can use your Channel Divinity to abjure
otherworldly creatures. As an action, you present your holy symbol, and one
celestial, elemental, fey, or fiend of your choice that is within 30 feet
of you must make a Wisdom saving throw, provided that the creature can see
or hear you. If the creature fails its saving throw, it is turned for 1
minute or until it takes any damage.
A turned creature must spend its turns trying to move as far away from you
as it can, and it can't willingly end its move in a space within 30 feet of
you. It also can't take reactions. For its action, it can only use the Dash
action or try to escape from an effect that prevents it from moving. If
there's nowhere to move, the creature can use the Dodge action.
After you reach 5th level, when a creature fails its saving throw against
your Arcane Abjuration feature, the creature is banished for 1 minute (as
in the banishment spell, no concentration required) if it isn't on its
plane of origin and its challenge rating is at or below a certain
threshold, as shown on the Arcane Banishment table.
5th level : CR 1/2
8th level : CR 1
11th level : CR 2
14th level : CR 3
17th level : CR 4
"""
name = "Channel Divinity: Arcane Abjuration"
source = "Cleric (Arcana Domain)"
class SpellBreaker(Feature):
"""Starting at 6th level, when you restore hit points to an ally with a spell
of 1st level or higher, you can also end one spell of your choice on that
creature. The level of the spell you end must be equal to or lower than the
level of the spell slot you use to cast the healing spell
"""
name = "Spell Breaker"
source = "Cleric (Arcana Domain)"
class ArcaneMastery(Feature):
"""At 17th level, you choose four spells from the wizard spell list, one from
each of the following levels: 6th, 7th, 8th, and 9th. You add them to your
list of domain spells. Like your other domain spells, they are always
prepared and count as cleric spells for you.
"""
name = "Arcane Mastery"
source = "Cleric (Arcana Domain)"
# Forge Domain
class BlessingOfTheForge(Feature):
"""At 1st level, you gain the ability to imbue magic into a weapon or
armor. At the end of a long rest, you can touch one nonmagical object that
is a suit of armor or a simple or martial weapon. Until the end of your
next long rest or until you die, the object becomes a magic item, granting
a +1 bonus to AC if its armor or a +1 bo— nus to attack and damage rolls
if its a weapon. Once you use this feature, you cant use it again until
you finish a long rest
"""
name = "Blessing of the Forge"
source = "Cleric (Forge Domain)"
class ArtisansBlessing(Feature):
"""Starting at 2nd level, you can use your Channel Divinity to create simple
items. You conduct an hour—long ritual that crafts a nonmagi— cal item that
must include some metal: a simple or martial weapon, a suit of armor, ten
pieces of ammunition, a set of tools, or another metal Object (see chapter
5, “Equipment,” in the Players Handbook for examples of these items). The
creation is completed at the end of the hour, coalescing in an unoccupied
space of your choice on a surface within 5 feet of you. The thing you
create can be something that is worth no more than 100 gp.
As part of this ritual, you must lay out metal, which can include coins,
with a value equal to the creation. The metal irretrievably coalesces and
transforms into the creation at the rituals end, magically forming even
nonmetal parts of the creation. The ritual can create a duplicate of a
nonmagical item that contains metal, such as a key, if you possess the
original during the ritual.
"""
name = "Channel Divinity: Artisans Blessing"
source = "Cleric (Forge Domain)"
class SoulOfTheForge(Feature):
"""Starting at 6th level, your mastery of the forge grants you special
abilities:
-- You gain resistance to fire damage.
-- While wearing heavy armor, you gain a +1 bonus to AC.
"""
name = "Soul of the Forge"
source = "Cleric (Forge Domain)"
class DivineStrikeForge(DivineStrike):
"""At 8th level, you gain the ability to infuse your weapon strikes with the
fiery power of the forge. Once on each ofyour turns when you hit a creature
with a weapon attack, you can cause the attack to deal an extra 1d8 fire
damage to the target. When you reach 14th level, the extra damage
increases to 2d8
"""
source = "Cleric (Forge Domain)"
class SaintOfForgeAndFire(Feature):
"""At 17th level, your blessed affinity with fire and metal becomes more
powerful:
-- You gain immunity to fire damage.
-- While wearing heavy armor, you have resistance to bludgeoning, piercing,
and slashing damage from non-magical attacks
"""
name = "Saint of Forge and Fire"
source = "Cleric (Forge Domain)"
# Grave Domain
class CircleOfMortality(Feature):
"""At 1st level, you gain the ability to manipulate the line between life and
death. When you would normally roll one or more dice to restore hit points
with a spell to a creature at 0 hit points, you instead use the highest
number possible for each die. In addition, you learn the spare the dying
cantrip, which doesnt count against the number of cleric cantrips you
know. For you, it has a range of 30 feet, and you can cast it as a bonus
action
"""
spells_known = (spells.SpareTheDying,)
spells_prepared = (spells.SpareTheDying,)
name = "Circle of Mortality"
source = "Cleric (Grave Domain)"
class EyesOfTheGrave(Feature):
"""At lst level, you gain the ability to occasionally sense the presence of the
undead, whose existence is an insult to the natural cycle of life. As an
action, you can open your awareness to magically detect undead. Until the
end ofyour next turn, you know the location of any undead within 60 feet of
you that isnt behind total cover and that isnt protected from divination
magic.
This sense doesnt tell you anything about a creature's capabilities or
identity. You can use this feature a number of times equal to your Wisdom
modifier (minimum Of once). You regain all expended uses when you finish a
long rest
"""
_name = "Eyes of the Grave"
source = "Cleric (Grave Domain)"
@property
def name(self):
num = max(1, self.owner.wisdom.modifier)
return self._name + " ({:d}x/LR)".format(num)
class PathToTheGrave(ChannelDivinity):
"""Starting at 2nd level, you can use your Channel Divinity to mark another
creatures life force for termination. As an action, you choose one
creature you can see within 30 feet of you, cursing it until the end Of
your next turn. The next time you or an ally Ofyours hits the cursed
creature with an attack, the creature has vulnerability tO all of that
attack's damage, and then the curse ends
"""
name = "Channel Divinity: Path to the Grave"
source = "Cleric (Grave Domain)"
class SentinelAtDeathsDoor(Feature):
"""At 6th level, you gain the ability to impede deaths progress. As a
reaction when you or a creature you can see within 30 feet of you suffers a
critical hit, you can turn that hit into a normal hit. Any effects
triggered by a critical hit are canceled. You can use this feature a
number of times equal to your Wisdom modifier (minimum of once). You regain
all expended uses when you finish a long rest.
"""
_name = "Sentinel at Death's Door"
source = "Cleric (Grave Domain)"
@property
def name(self):
num = max(1, self.owner.wisdom.modifier)
return self._name + " ({:d}x/LR)".format(num)
class KeeperOfSouls(Feature):
"""Starting at 17th level. you can seize a trace of vitality from a parting
soul and use it to heal the living. When an enemy you can see dies within
60 feet of you, you or one creature of your choice that is within 60 feet
of you regains hit points equal to the enemys number of Hit Dice. You can
use this feature only if you arent incapacitated. Once you use it, you
can't do so again until the start ofyour next turn.
"""
name = "Keeper of Souls"
source = "Cleric (Grave Domain)"
+529
View File
@@ -0,0 +1,529 @@
from .features import Feature, FeatureSelector
from .. import spells
# 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 doesnt 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.
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 creatures bonus instead of yours. If the
creature has any legendary or lair actions, you can't use them.
-- When you transform, you assume the beasts 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 doesnt
reduce your normal form to 0 hit points, you arent knocked unconscious.
-- You cant cast spells, and your ability to speak or take any action that
requires hands is limited to the capabilities of your beast
form. Transforming doesnt break your concentration on a spell youve
already cast, however, or prevent you from taking actions that are part of
a spell, such as call lightning, that youve 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 cant use any of your special senses, such as darkvi-
sion, 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 creatures shape and size. Your
equipment doesnt change size or shape to match the new form, and any
equipment that the new form cant 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)
class TimelessBody(Feature):
"""Starting at 18th level, the primal magic that you wield causes you to age
more slowly. For every 10 years that pass, your body ages only 1 year.
"""
name = "Timeless Body"
source = "Druid"
class BeastSpells(Feature):
"""Beginning at 18th level, you can cast many of your druid spells in any
shape you assume using Wild Shape. You can perform the somatic and verbal
components of a druid spell while in a beast shape, but you arent able to
provide material components.
"""
name = "Beast Spells"
source = "Druid"
class Archdruid(Feature):
"""At 20th level, you can use your Wild Shape an unlimited number of times.
Additionally, you can ignore the verbal and somatic components of your
druid spells, as well as any material components that lack a cost and
arent consumed by a spell. You gain this benefit in both your normal shape
and your beast shape from Wild Shape
"""
name = "Archdruid"
source = "Druid"
# Circle of the Land
class BonusCantrip(Feature):
"""When you choose this circle at 2nd level, you learn one additional druid
cantrip of your choice
"""
name = "Bonus Cantrip"
source = "Druid (Circle of the Land)"
class NaturalRecovery(Feature):
"""Starting at 2nd level, you can regain some of your magical energy by
sitting in meditation and communing with nature. During a short rest, you
choose expended spell slots to recover. The spell slots can have a combined
level that is equal to or less than half your druid level (rounded up), and
none of the slots can be 6th level or higher. You cant use this feature
again until you finish a long rest.
For example, when you are a 4th-level druid, you can recover up to two
levels worth of spell slots. You can recover either a 2nd-level slot or two
1st-level slots.
"""
name = "Natural Recovery"
source = "Druid (Circle of the Land)"
class _CircleSpells(Feature):
"""Your mystical connection to the land infuses you with the ability to cast
certain spells. At 3rd, 5th, 7th, and 9th level you gain access to circle
spells connected to the land where you became a druid. Choose that
land—arctic, coast, desert, forest, grassland, mountain, swamp, or
Underdark—and consult the associated list of spells.
Once you gain access to a circle spell, you always have it prepared, and it
doesnt count against the number of spells you can prepare each day. If you
gain access to a spell that doesnt appear on the druid spell list, the
spell is nonetheless a druid spell for you.
"""
_name = "Select One"
source = "Druid (Circle of the Land)"
_spells = {3: [], 5: [], 7: [], 9: []}
@property
def name(self):
return "Circle Spells ({:s})".format(self._name)
@property
def spells_prepared(self):
level = self.owner.Druid.level
my_spells = []
for lvl, sps in self._spells.items():
if level >= lvl:
my_spells.extend(sps)
return my_spells
@property
def spells_known(self):
return self.spells_prepared
class ArcticSpells(_CircleSpells):
_spells = {3: [spells.HoldPerson, spells.SpikeGrowth],
5: [spells.SleetStorm, spells.Slow],
7: [spells.FreedomOfMovement, spells.IceStorm],
9: [spells.CommuneWithNature, spells.ConeOfCold]}
class CoastSpells(_CircleSpells):
_spells = {3: [spells.MirrorImage, spells.MistyStep],
5: [spells.WaterBreathing, spells.WaterWalk],
7: [spells.ControlWater, spells.FreedomOfMovement],
9: [spells.ConjureElemental, spells.Scrying]}
class DesertSpells(_CircleSpells):
_spells = {3: [spells.Blur, spells.Silence],
5: [spells.CreateFoodAndWater, spells.ProtectionFromEnergy],
7: [spells.Blight, spells.HallucinatoryTerrain],
9: [spells.InsectPlague, spells.WallOfStone]}
class ForestSpells(_CircleSpells):
_spells = {3: [spells.Barkskin, spells.SpiderClimb],
5: [spells.CallLightning, spells.PlantGrowth],
7: [spells.Divination, spells.FreedomOfMovement],
9: [spells.CommuneWithNature, spells.TreeStride]}
class GrasslandSpells(_CircleSpells):
_spells = {3: [spells.Invisibility, spells.PassWithoutTrace],
5: [spells.Daylight, spells.Haste],
7: [spells.Divination, spells.FreedomOfMovement],
9: [spells.Dream, spells.InsectPlague]}
class MountainSpells(_CircleSpells):
_spells = {3: [spells.SpiderClimb, spells.SpikeGrowth],
5: [spells.LightningBolt, spells.MeldIntoStone],
7: [spells.StoneShape, spells.Stoneskin],
9: [spells.Passwall, spells.WallOfStone]}
class SwampSpells(_CircleSpells):
_spells = {3: [spells.Darkness, spells.MelfsAcidArrow],
5: [spells.WaterWalk, spells.StinkingCloud],
7: [spells.FreedomOfMovement, spells.LocateCreature],
9: [spells.InsectPlague, spells.Scrying]}
class UnderdarkSpells(_CircleSpells):
_spells = {3: [spells.SpiderClimb, spells.Web],
5: [spells.GaseousForm, spells.StinkingCloud],
7: [spells.GreaterInvisibility, spells.StoneShape],
9: [spells.Cloudkill, spells.InsectPlague]}
class CircleSpells(FeatureSelector, _CircleSpells):
"""
Select a land where you became a druid in feature_choices in your .py file:
arctic
coast
desert
forest
grassland
mountain
swamp
underdark
"""
options = {'arctic': ArcticSpells,
'coast': CoastSpells,
'desert': DesertSpells,
'forest': ForestSpells,
'grassland': GrasslandSpells,
'mountain': MountainSpells,
'swamp': SwampSpells,
'underdark': UnderdarkSpells}
_name = "(Select One)"
class LandsStride(Feature):
"""Starting at 6th level, moving through nonmagical difficult terrain costs
you no extra movement. You can also pass through nonmagical plants without
being slowed by them and without taking damage from them if they have
thorns, spines, or a similar hazard. In addition, you have advantage on
saving throws against plants that are magically created or manipulated to
impede movement, such those created by the entangle spell.
"""
name = "Land's Stride"
source = "Druid (Circle of the Land)"
class NaturesWard(Feature):
"""When you reach 10th level, you cant be charmed or frightened by elementals
or fey, and you are immune to poison and disease
"""
name = "Nature's Ward"
source = "Druid (Circle of the Land)"
class NaturesSanctuary(Feature):
"""When you reach 14th level, creatures of the natural world sense your
connection to nature and become hesitant to attack you. When a beast or
plant creature attacks you, that creature must make a Wisdom saving throw
against your druid spell save DC. On a failed save, the creature must
choose a different target, or the attack automatically misses. On a
successful save, the creature is immune to this effect for 24 hours. The
creature is aware of this effect before it makes its attack against you
"""
name = "Nature's Sanctuary"
source = "Druid (Circle of the Land)"
# Circle of the Moon
class CombatWildShape(Feature):
"""When you choose this circle at 2nd level, you gain the ability to use Wild
Shape on your turn as a bonus action, rather than as an
action. Additionally, while you are transformed by Wild Shape, you can use
a bonus action to expend one spell slot to regain 1d8 hit points per level
of the spell slot expended.
"""
name = "Combat Wild Shape"
source = "Druid (Circle of the Moon)"
class CircleForms(Feature):
"""The rites of your circle grant you the ability to transform into more
dangerous animal forms. Starting at 2nd level, you can use your Wild Shape
to transform into a beast with a challenge rating as high as 1 (you ignore
the Max. CR column of the Beast Shapes table, but must abide by the other
limitations there). Starting at 6th level, you can transform into a beast
with a challenge rating as high as your druid level divided by 3, rounded
down
"""
_name = "Circle Forms"
source = "Druid (Circle of the Moon)"
@property
def name(self):
level = self.owner.Druid.level
return self._name + ' (CR {:d})'.format(max(1, level//3))
class PrimalStrike(Feature):
"""Starting at 6th level, your attacks in beast form count as magical for the
purpose of overcoming resistance and immunity to nonmagical attacks and
damage.
"""
name = "Primal Strike"
source = "Druid (Circle of the Moon)"
class ElementalWildShape(Feature):
"""At 10th level, you can expend two uses of Wild Shape at the same time to
transform into an air elemental, an earth elemental, a fire elemental, or a
water elemental.
"""
name = "Elemental Wild Shape"
source = "Druid (Circle of the Moon)"
class ThousandForms(Feature):
"""By 14th level, you have learned to use magic to alter your physical form in
more subtle ways. You can cast the alter self spell at will.
"""
name = "Thousand Forms"
source = "Druid (Circle of the Moon)"
spells_known = (spells.AlterSelf,)
spells_prepared = (spells.AlterSelf,)
# Circle of Dreams
class BalmOfTheSummerCourt(Feature):
"""At 2nd level, you become imbued with the blessings of the Summer Court. You
are a font of energy that offers respite from injuries. You have a pool of
fey energy represented by a number of C168 equal to your druid level. As
a bonus action, you can choose one creature you can see within 120 feet
ofyou and spend a number of those dice equal to halfyour druid level or
less. Roll the spent dice and add them together. The target regains a
number of hit points equal to the total. The target also gains 1 temporary
hit point per die spent. You regain all expended dice when you finish a
long rest.
"""
_name = "Balm Of The Summer Court"
source = "Druid (Circle of Dreams)"
@property
def name(self):
return self._name + " ({:d}x d6)".format(self.owner.Druid.level)
class HearthOfMoonlightAndShadow(Feature):
"""At 6th level, home can be wherever you are. During a short or long rest,
you can invoke the shadowy power of the Gleaming Court to help guard your
respite. At the start of the rest, you touch a point in space, and an
invisible, 30-foot—radius sphere of magic appears, centered on that
point. Total cover blocks the sphere.
While within the sphere, you and your allies gain a +5 bonus to Dexterity
(Stealth) and Wisdom (Perception) checks, and any light from open flames in
the sphere (a campfire, torches, or the like) isnt visible outside it. The
sphere vanishes at the end of the rest or when you leave the sphere
"""
name = "Hearth of Moonlight and Shadow"
source = "Druid (Circle of the Moon)"
class HiddenPaths(Feature):
"""Starting at 10th level, you can use the hidden, magical pathways that some
fey use to traverse space in the blink of an eye. As a bonus action on your
turn, you can teleport up to 60 feet to an unoccupied space you can
see.
Alternatively, you can use your action to teleport one willing creature you
touch up to 30 feet to an unoccupied space you can see. You can use this
feature a number of times equal to your Wisdom modifier (minimum of once),
and you regain all expended uses of it when you finish a long rest
"""
name = "Hidden Paths"
source = "Druid (Circle of the Moon)"
class WalkerInDreams(Feature):
"""At 14th level, the magic of the Feywild grants you the ability to travel
mentally or physically through dreamlands. When you finish a short rest,
you can cast one of the following spells, without expending a spell slot or
requiring material components: dream (with you as the messenger),
scrying, or teleportation circle.
This use of teleportation circle is special. Rather than opening a portal
to a permanent teleportation circle, it opens a portal to the last location
where you finished a long rest on your current plane of existence. If you
haven*t taken a long rest on your current plane, the spell fails but isnt
wasted. Once you use this feature, you cant use it again until you finish
a long rest.
"""
name = "Walker in Dreams"
source = "Druid (Circle of the Moon)"
# Circle of the Shepherd
class SpeechOfTheWoods(Feature):
"""At 2nd level, you gain the ability to converse with beasts and many fey. You
learn to speak, read, and write Sylvan. In addition, beasts can
understand your speech, and you gain the ability to decipher their noises
and motions. Most beasts lack the intelligence to convey or understand
sophisticated concepts, but a friendly beast could relay what it has seen
or heard in the recent past. This ability doesnt grant you friendship with
beasts, though you can combine this ability with gifts to curry favor with
them as you would with any nonplayer character.
"""
name = "Speech of the Woods"
source = "Druid (Circle of the Shepherd)"
class SpiritTotem(Feature):
"""Starting at 2nd level, you can call forth nature spirits to influence the
world around you. As a bonus action, you can magically summon an
incorporeal spirit to a point you can see within 60 feet of you. The spirit
creates an aura in a 30-foot radius around that point. It counts as neither
a creature nor an object, though it has the spectral appearance of the
creature it. represents.
As a bonus action, you can move the spirit up to 60 feet to a point you can
see. The spirit persists for 1 minute or until youre incapacitated. Once
you use this feature, you cant use it again until you finish a short or
long rest. The effect of the spirits aura depends on the type of spirit
you summon from the options below.
**Bear Spirit**: The bear spirit grants you and your allies its might and
endurance. Each creature ofyour choice in the aura when the spirit appears
gains temporary hit points equal to 5 + your druid level. In addition, you
and your allies gain advantage on Strength checks and Strength saving
throws while in the aura.
**Hawk Spirit**: The hawk spirit is a consummate hunter, aiding you and
your allies with its keen sight. When a creature makes an attack roll
against a target in the spirits aura, you can use your reaction to grant
advantage to that attack roll. In addition, you and your allies have
advantage on Wisdom (Perception) checks while in the aura
**Unicorn Spirit**: The unicorn spirit lends its protection to those
nearby. You and your allies gain advantage on all ability checks made to
detect creatures in the spirits aura. In addition. if you cast a spell
using a spell slot that restores hit points to any creature inside or
outside the aura, each creature of your choice in the aura also regains hit
points equal to your druid level.
"""
name = "Spirit Totem"
source = "Druid (Circle of the Shepherd)"
class MightySummoner(Feature):
"""Starting at 6th level, beasts and fey that you conjure are more resilient
than normal. Any beast or fey summoned or created by a spell that you cast
gains the. following benefits:
-- The creature appears with more hit points than normal: 2 extra hit
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.
"""
name = "Mighty Summoner"
source = "Druid (Circle of the Shepherd)"
class GuardianSpirit(Feature):
"""Beginning at 10th level, your Spirit Totem safeguards the beasts and fey
that you call forth with your magic. When a beast or fey that you summoned
or created with a spell ends its turn in your Spirit Totem aura, that crea—
ture regains a number of hit points equal to halfyour druid level.
"""
name = "Guardian Spirit"
source = "Druid (Circle of the Shepherd)"
class FaithfulSummons(Feature):
"""Starting at 14th level, the nature spirits you commune with protect you
when you are the most defenseless. Ifyou are reduced to 0 hit points or are
incapacitated against your will, you can immediately gain the benefits of
conjure animals as if it were cast using a 9th-level spell slot. It summons
four beasts of your choice that are challenge rating 2 or lower. The
conjured beasts appear within 20 feet of you. If they receive no commands
from you, they protect you from harm and attack your foes. The spell lasts
for 1 hour, requiring no concentration, or until you dismiss it (no action
required). Once you use this feature, you cant use it again until you
finish a long rest
"""
name = "Faithful Summons"
source = "Druid (Circle of the Shepherd)"
-1
View File
@@ -1,4 +1,3 @@
from .. import weapons
+455 -4
View File
@@ -542,6 +542,454 @@ class ImprovedWarMagic(Feature):
source = "Fighter (Eldritch Knight)"
# Purple Dragon Knight
class RallyingCry(Feature):
"""When you choose this archetype at 3rd level, you learn how to inspire your
allies to fight on past their injuries. When you use your Second Wind
feature, you can choose up to three creatures within 60 feet of you that
are allied with you. Each one regains hit points equal to your fighter
level, provided that the creature can see or hear you
"""
name = "Rallying Cry"
source = "Fighter (Purple Dragon Knight)"
class RoyalEnvoy(Feature):
"""A Purple Dragon knight serves as an envoy of the Cormyrean crown. Knights
of high standing are expected to conduct themselves with grace.
At 7th level, you gain proficiency in the Persuasion skill. If you are
already proficient in it, you gain proficiency in one of the following
skills of your choice: Animal Handling, Insight, Intimidation, or
Performance.
Your proficiency bonus is doubled for any ability check you make that uses
Persuasion. You receive this benefit regardless of the skill proficiency
you gain from this feature
"""
name = "Royal Envoy"
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')
class InspiringSurge(Feature):
"""Starting at 10th level, when you use your Action Surge feature , you can
choose one creature within 60 feet of you that is allied with you. That
creature can make one melee or ranged weapon attack with its reaction, pro-
vided that it can see or hear you. Starting at 18th level, you can choose
two allies within 60 feet of you, rather than one.
"""
name = "Inspiring Surge"
source = "Fighter (Purple Dragon Knight)"
class Bulwark(Feature):
"""Beginning at 15th level, you can extend the benefit of your Indomitable
feature to an ally. When you decide to use Indomitable to reroll an
Intelligence, a Wisdom, or a Charisma saving throw and you aren't
incapacitated, you can choose one ally within 60 feet of you that also
failed its saving throw against the same effect. If that creature can see
or hear you, it can reroll its saving throw and must use the new roll
"""
name = "Bulwark"
source = "Fighter (Purple Dragon Knight)"
# Arcane Archer
class ArcaneArcherLore(Feature):
"""At 3rd level, you learn magical theory or some of the secrets of
nature—typical for practitioners of this elven martial tradition. You
choose to gain proficiency in ei— ther the Arcana or the Nature skill, and
you choose to learn either the prestidigr'tation or the drufdcraft cantrip
"""
name = "Arcane Archer Lore"
source = "Fighter (Arcane Archer)"
class ArcaneShot(Feature):
"""At 3rd level, you learn to unleash special magical effects with some of
your shots. When you gain this feature, you learn two Arcane Shot options
of your choice (see “Arcane Shot Options” below).
Add all Arcane Shot options under "features" in your .py file
Once per turn when you fire a magic arrow from a shortbow or longbow as
part of the Attack action, you can apply one of your Arcane Shot options to
that arrow. You decide to use the option when the arrow hits a creature,
unless the option doesnt involve an attack roll. You have two uses of this
ability, and you regain all expended uses of it when you finish a short or
long rest.
You gain an additional Arcane Shot option of your choice when you reach
certain levels in this class: 7th, 10th, 15th, and 18th level. Each option
also improves when you become an 18th—level fighter
If an option requires a saving throw, your Arcane Shot save DC equals 8 +
your proficiency bonus + your Intelligence modifier
"""
name = "Arcane Shot (2x/SR)"
source = "Fighter (Arcane Archer)"
class MagicArrow(Feature):
"""At 7th level, you gain the ability to infuse arrows with magic. Whenever
you fire a nonmagical arrow from a shortbow or longbow, you can make it
magical for the purpose of overcoming resistance and immunity to non-
magical attacks and damage. The magic fades from the arrow immediately
after it hits or misses its target.
"""
name = "Magic Arrow"
source = "Fighter (Arcane Archer)"
class CurvingShot(Feature):
"""At 7th level, you learn how to direct an errant arrow toward a new
target. When you make an attack roll with a magic arrow and miss, you can
use a bonus action to reroll the attack roll against a different target
within 60 feet of the original target
"""
name = "Curving Shot"
source = "Fighter (Arcane Archer)"
class EverReadyShot(Feature):
"""Starting at 15th level, your magical archery is available whenever battle
starts. If you roll initiative and have no uses of Arcane Shot remaining,
you regain one use of it.
"""
name = "Ever-Ready Shot"
source = "Fighter (Arcane Archer)"
class BanishingArrow(Feature):
"""You use abjuration magic to try to temporarily banish your target to a
harmless location in the Feywild. The creature hit by the arrow must also
succeed on a Charisma saving throw or be banished. While banished in this
way, the targets speed is 0, and it is incapacitated. At the end of its
next turn, the target reappears in the Space it vacated or in the nearest
unoccupied space if that space is occupied.
After you reach 18th level in this class, a target also takes 2d6 force
damage when the arrow hits it.
"""
name = "Arcane Shot: Banishing Arrow"
source = "Fighter (Arcane Archer)"
class BeguilingArrow(Feature):
"""Your enchantment magic causes this arrow to temporarily beguile its
target. The creature hit by the arrow takes an extra 2d6 psychic damage,
and choose one ofyour allies within 30 feet of the target. The target must
succeed on a Wisdom saving throw, or it is charmed by the chosen ally until
the start ofyour next turn. This effect ends early if the chosen ally at—
tacks the charmed target, deals damage to it, or forces it to make a saving
throw. The psychic damage increases to 4d6 when you reach 18th level in
this class.
"""
name = "Arcane Shot: Beguiling Arrow"
source = "Fighter (Arcane Archer)"
class BurstingArrow(Feature):
"""You imbue your arrow with force energy drawn from the school of
evocation. The energy detonates after your attack. Immediately after the
ar— row hits the creature, the target and all other creatures within 10
feet of it take 2d6 force damage each. The force damage increases to 4d6
when you reach 18th level in this class
"""
name = "Arcane Shot: Bursting Arrow"
source = "Fighter (Arcane Archer)"
class EnfeeblingArrow(Feature):
"""You weave necromantic magic into your arrow. The creature hit by the arrow
takes an extra 2d6 necrotic damage. The target must also succeed on a
Constitution saving throw, or the damage dealt by its weapon attacks is
halved until the start of your next turn. The necrotic damage increases to
4d6 when you reach 18th level in this class.
"""
name = "Arcane Shot: Enfeebling Arrow"
source = "Fighter (Arcane Archer)"
class GraspingArrow(Feature):
"""When this arrow strikes its target, conjuration magic creates grasping,
poisonous brams bles, which wrap around the target. The creature hit by the
arrow takes an extra 2(16 poison damage, its speed is reduced by 10 feet,
and it takes 2d6 slashing dam— age the first time on each turn it moves 1
foot or more without teleporting. The target or any creature that can reach
it can use its action to remove the brambles with a successful Strength
(Athletics) check against your Arcane Shot save DC. Otherwise, the
brambles last for 1 minute or until you use this option again. The poison
damage and slashing damage both increase to 4d6 when you reach 18th level
in this class
"""
name = "Arcane Shot: Grasping Arrow"
source = "Fighter (Arcane Archer)"
class PiercingArrow(Feature):
"""You use transmutation magic to give your arrow an ethereal quality. When
you use this option, you dont make an attack roll for the attack. Instead,
the arrow shoots forward in a line, which is 1 foot wide and 30 feet long,
before disappearing. The arrow passes harmlessly through objects, ignoring
cover. Each creature in that line must make a Dexterity saving throw. On a
failed save, a creature takes damage as if it were hit by the arrow, plus
an extra 1d6 piercing damage. On a successful save, a target takes half as
much damage. The piercing damage increases to 2d6 when you reach 18th level
in this class.
"""
name = "Arcane Shot: Piercing Arrow"
source = "Fighter (Arcane Archer)"
class SeekingArrow(Feature):
"""Using divination magic, you grant your arrow the ability to seek out a
target. When you use this option, you dont make an attack roll for the
attack. Instead, choose one creature you have seen in the past minute. The
arrow flies toward that creature, moving around corners if necessary and
ignoring three-quarters cover and half cover. If the target is within the
weapons range and there is a path large enough for the arrow to travel to
the target, the target must make a Dexterity saving throw. Otherwise, the
arrow disappears after traveling as far as it can. On a failed save, the
target takes damage as if it were hit by the arrow, plus an extra 1d6 force
damage, and you learn the targets current location. On a successful save,
the target takes half as much damage, and you dont learn its location. The
force damage increases to 2d6 when you reach 18th level in this class.
"""
name = "Arcane Shot: Seeking Arrow"
source = "Fighter (Arcane Archer)"
class ShadowArrow(Feature):
"""You weave illusion magic into your arrow, causing it to occlude your fees
vision with shadows. The creature hit by the arrow takes an extra 2d6
psychic damage, and it must succeed on a Wisdom saving throw or be unable
to see anything farther than 5 feet away until the start ofyour next
turn. The psychic damage increases to 4d6 when you reach 18th level in this
class
"""
name = "Shadow Arrow"
source = "Fighter (Arcane Archer)"
# Cavalier
class BonusProficiencyCavalier(Feature):
"""When you choose this archetype at 3rd level, you gain proficiency in one of
the following skills of your choice: Animal Handling, History, Insight,
Performance, or Persuasion. Alternatively, you learn one language of your
choice.
"""
name = "Bonus Proficiency"
source = "Fighter (Cavalier)"
class BornToTheSaddle(Feature):
"""Starting at 3rd level, your mastery as a rider becomes apparent. You have
advantage on saving throws made to avoid falling off your mount. Ifyou fall
off your mount and descend no more than 10 feet, you can land on your feet
if youre not incapacitated. Finally, mounting or dismounting a creature
costs you only 5 feet of movement, rather than half your speed.
"""
name = "Born to the Saddle"
source = "Fighter (Cavalier)"
class UnwaveringMark(Feature):
"""Starting at 3rd level, you can menace your foe-s, foiling their attacks and
punishing them for harming others. When you hit a creature with a melee
weapon attack, you can mark the creature until the end of your next
turn. This effect ends early ifyou are incapacitated or you die, or if
someone else marks the creature.
While it is within 5 feet of you, a creature marked by you has disadvantage
on any attack roll that doesnt target you. In addition, if a creature
marked by you deals damage to anyone other than you, you can make a special
melee weapon attack against the marked creature as a bonus action on your
next turn. You have advantage on the attack roll, and if it hits, the
attacks weapon deals extra damage to the target equal to half your fighter
level.
Regardless of the number of creatures you mark, you can make this special
attack a number of times equal to your Strength modifier (minimum of once),
and you regain all expended uses of it when you finish a long rest
"""
_name = "Unwavering Mark"
source = "Fighter (Cavalier)"
@property
def name(self):
num = max(1, self.owner.strength.modifier)
return self._name + ' ({:d}x/LR)'.format(num)
class WardingManeuver(Feature):
"""At 7th level, you learn to fend off strikes directed at you, your mount, or
other creatures nearby. If you or a creature you can see within 5 feet
of you is hit by an attack, you can roll ld8 as a reaction if youre
wielding a melee weapon or a shield. Roll the die, and add the number
rolled to the targets AC against that attack. If the attack still hits,
the target has resistance against the attacks damage.
You can use this feature a number of times equal to your Constitution
modifier (minimum of once), and you regain all expended uses of it when you
finish a long rest
"""
_name = "Warding Maneuver"
source = "Fighter (Cavalier)"
@property
def name(self):
num = max(1, self.owner.constitution.modifier)
return self._name + ' ({:d}x/LR)'.format(num)
class HoldTheLine(Feature):
"""At 10th level, you become a master of locking down your enemies. Creatures
provoke an opportunity attack from you when they move 5 feet or more while
within your reach, and if you hit a creature with an opportunity attack,
the targets speed is reduced to 0 until the end of the current turn.
"""
name = "Hold the Line"
source = "Fighter (Cavalier)"
class FerociousCharger(Feature):
"""Starting at 15th level, you can run down your foes, whether youre mounted
or not. If you move at least 10 feet in a straight line right before
attacking a creature and you hit it with the attack, that target must
succeed on a Strength saving throw (DC 8 + your proficiency bonus + your
Strength modifier) or be knocked prone. You can use this feature only once
on each of your turns
"""
name = "Ferocious Charger"
source = "Fighter (Cavalier)"
class VigilantDefender(Feature):
"""Starting at 18th level, you respond to danger with extraordinary
vigilance. In combat, you get a special reaction that you can take once on
every creatures turn, except your turn. You can use this special reaction
only to make an opportunity attack, and you cant use it on the same turn
that you take your normal reaction
"""
name = "Vigiland Defender"
source = "Fighter (Cavalier)"
# Samurai
class BonusProficiencySamurai(Feature):
"""When you choose this archetype at 3rd level, you gain proficiency in one of
the following skills ofyour choice: History, Insight, Performance, or
Persuasion. Alterna— tively, you learn one language of your choice.
"""
name = "Bonus Proficiency"
source = "Fighter (Samurai)"
class FightingSpirit(Feature):
"""Starting at 3rd level, your intensity in battle can shield you and help you
strike true. As a bonus action on your turn, you can give yourself
advantage on weapon attack rolls until the end of the current turn. When
you do so, you also gain 5 temporary hit points. The number of temporary
hit points increases when you reach certain levels in this class,
increasing to 10 at 10th level and 15 at 15th level. You can use this
feature three times, and you regain all expended uses of it when you finish
a long rest.
"""
name = "Fighting Spirit (3x/LR)"
source = "Fighter (Samurai)"
class ElegantCourtier(Feature):
"""Starting at 7th level, your discipline and attention to de— tail allow you
to excel in social situations. Whenever you make a Charisma (Persuasion)
check, you gain a bonus to the check equal to your Wisdom modifier. Your
self-control also causes you to gain proficiency in Wisdom saving
throws. If you already have this proficiency, you instead gain proficiency
in Intelligence or Charisma saving throws (your choice).
"""
name = "Elegant Courtier"
source = "Fighter (Samurai)"
def __init__(self, owner=None):
super().__init__(owner=owner)
if 'wisdom' not in self.owner.primary_class.saving_throw_proficiencies:
self.owner.primary_class.saving_throw_proficiencies += ('wisdom',)
else:
self.owner.primary_class.saving_throw_proficiencies += ('intelligence',)
class TirelessSpirit(Feature):
"""Starting at 10th level, when you roll initiative and have no uses of
Fighting Spirit remaining, you regain one use.
"""
name = "Tireless Spirit"
source = "Fighter (Samurai)"
class RapidStrike(Feature):
"""Starting at 15th level, you learn to trade accuracy for swift strikes. If
you take the Attack action on your turn and have advantage on an attack
roll against one of the targets, you can forgo the advantage for that roll
to make an additional weapon attack against that target, as part of the
same action. You can do so no more than once per turn
"""
name = "Rapid Strike"
source = "Fighter (Samurai)"
class StrengthBeforeDeath(Feature):
"""Starting at 18th level, your fighting spirit can delay the grasp of
death. If you take damage that reduces you to 0 hit points and doesnt kill
you outright, you can use your reaction to delay falling unconscious, and
you can immediately take an extra turn, interrupting the current
turn. While you have 0 hit points during that extra turn, taking damage
causes death saving throw failures as normal, and three death saving throw
failures can still kill you. When the extra turn ends, you fall unconscious
ifyou still have 0 hit points. Once you use this feature, you cant use it
again until you finish a long rest.
"""
name = "Strength Before Death"
source = "Fighter (Samurai)"
# Gunslinger
class Gunsmith(Feature):
"""Upon choosing this archetype at 3rd level, you gain proficiency with
@@ -559,10 +1007,13 @@ class AdeptMarksman(Feature):
"""When you choose this archetype at 3rd level, you learn to perform powerful
trick shots to disable or damage your opponents using your firearms.
**Trick Shots**: You learn two trick shots of your choice, which are detailed under "Trick Shots" below.
If you have not already, add them by name to "features" in your character's .py file.
**Trick Shots**: You learn two trick shots of your choice, which are
detailed under "Trick Shots" below. If you have not already, add them by
name to "features" in your character's .py file.
Many maneuvers enhance an attack in some way. Each use of a trick shot must be declared before the attack roll is made. You can use only one trick shot per attack.
Many maneuvers enhance an attack in some way. Each use of a trick shot must
be declared before the attack roll is made. You can use only one trick shot
per attack.
You learn an additional trick shot of your choice at 7th, 10th, 15th, and
18th level. Each time you learn a new trick shot, you can also replace one
@@ -578,7 +1029,7 @@ class AdeptMarksman(Feature):
saving throw to resist the trick shots effects. The saving throw DC is
calculated as follows:
Trick Shot save DC = 8 + your proficiency bonus + your Dexterity modifier
Trick Shot save DC = 8 + your proficiency bonus + your Dexterity modifier
Firearm Properties Firearms are a new and volatile technology, and as such
bring their own unique set of weapon properties. Some properties are
+794 -1
View File
@@ -1,5 +1,5 @@
from .features import Feature
from .. import (weapons, armor)
from .. import (weapons, armor, spells)
class UnarmoredDefenseMonk(Feature):
@@ -67,6 +67,62 @@ class MartialArts(Feature):
return weapon
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 features effects. The saving throw DC is calculated as follows:
Ki save DC = 8 + your proficiency bonus + your Wisdom modifier
"""
_name = "Ki"
source = "Monk"
@property
def name(self):
num = self.owner.Monk.level
DC = 8 + self.owner.proficiency_bonus + self.owner.wisdom.modifier
return self._name + " ({:d} pts, DC={:d})".format(num, DC)
class FlurryOfBlows(Feature):
"""Immediately after you take the Attack action on your turn, you can spend 1
ki point to make two unarmed strikes as a bonus action
"""
name = "Flurry of Blows"
source = "Monk"
class PatientDefense(Feature):
"""You can spend 1 ki point to take the Dodge action as a bonus action on your
turn
"""
name = "Patient Defense"
source = "Monk"
class StepOfTheWind(Feature):
"""You can spend 1 ki point to take the Disengage or Dash action as a bonus
action on your turn, and your jump distance is doubled for the turn
"""
name = "Step of the Wind"
source = "Monk"
class UnarmoredMovement(Feature):
"""Starting at 2nd level, your speed increases by 10 feet while you are not
wearing armor or wielding a shield. This bonus increases when you reach
@@ -92,3 +148,740 @@ class UnarmoredMovement(Feature):
if level >= 18:
_speed_bonus = 30
return _speed_bonus
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
"""
_name = "Deflect Missiles"
source = "Monk"
@property
def name(self):
mod = self.owner.dexterity.modifier + self.owner.Monk.level
return self._name + " (1d10+{:d})".format(mod)
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.
"""
name = "Slow Fall"
source = "Monk"
class ExtraAttackMonk(Feature):
"""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"
class StunningStrike(Feature):
"""Starting at 5th level, you can interfere with the flow of ki in an
opponents 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
"""
name = "Ki-Empowered Strikes"
source = "Monk"
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.
"""
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.
"""
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.
"""
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.
"""
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 cant take any other creatures with you.
"""
name = "Empty Body"
source = "Monk"
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"
# Way of the Open Hand
class OpenHandTechnique(Feature):
"""Starting when you choose this tradition at 3rd level, you can manipulate
your enemys 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 cant 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
"""
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
"""
name = "Tranquility"
source = "Monk (Way of the Open Hand)"
class QuiveringPalm(Feature):
"""At 17th level, you gain the ability to set up lethal vibrations in
someones 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)"
# 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 dont already know it.
"""
name = "Shadow Arts"
source = "Monk (Way of Shadow)"
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.
"""
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.
"""
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.
"""
name = "Opportunist"
source = "Monk (Way of Shadow)"
# 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.
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 dont
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 disciplines
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.
Monk Levels 5-8 : 3 Ki points Max
Monk Levels 9-12 : 4 Ki points Max
Monk Levels 13-16 : 5 Ki points Max
Monk Levels 17-20 : 6 Ki points Max
"""
name = "Disciple of the Elements"
source = "Monk (Way of the Four Elements)"
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.
"""
name = "Elemental Attunement"
source = "Monk (Way of the Four Elements)"
class BreathOfWinter(Feature):
"""You can spend 6 ki points to cast cone of cold.
**Prerequisite**: 17th Level
"""
name = "Breath of Winter"
source = "Monk (Way of the Four Elements)"
spells_known = (spells.ConeOfCold,)
class ClenchOfTheNorthWind(Feature):
"""You can spend 3 ki points to cast hold person.
**Prerequisite**: 6th Level
"""
name = "Clench of the North Wind"
source = "Monk (Way of the Four Elements)"
spells_known = (spells.HoldPerson,)
class EternalMountainDefense(Feature):
"""You can spend 5 ki points to cast stoneskin, targeting yourself.
**Prerequisite**: 11th Level
"""
name = "Eternal Mountain Defense"
source = "Monk (Way of the Four Elements)"
spells_known = (spells.Stoneskin,)
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
"""
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
"""
name = "Fist of Four Thunders"
source = "Monk (Way of the Four Elements)"
spells_known = (spells.Thunderwave,)
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 dont push
it or knock it prone.
"""
name = "Fist of Unbroken Air"
source = "Monk (Way of the Four Elements)"
class FlamesOfThePhoenix(Feature):
"""You can spend 4 ki points to cast fireball.
**Prerequisite**: 11th Level
"""
name = "Flames of the Phoenix"
source = "Monk (Way of the Four Elements)"
spells_known = (spells.Fireball,)
class GongOfTheSummit(Feature):
"""You can spend 3 ki points to cast shatter.
**Prerequisite**: 6th Level
"""
name = "Gong of the Summit"
source = "Monk (Way of the Four Elements)"
spells_known = (spells.Shatter,)
class MistStance(Feature):
"""You can spend 4 ki points to cast gaseous form, targeting yourself.
**Prerequisite**: 11th Level
"""
name = "Mist Stance"
source = "Monk (Way of the Four Elements)"
spells_known = (spells.GaseousForm,)
class RideTheWind(Feature):
"""You can spend 4 ki points to cast fly, targeting yourself
**Prerequisite**: 11th Level
"""
name = "Ride the Wind"
source = "Monk (Way of the Four Elements)"
spells_known = (spells.Fly,)
class RiverOfHungryFlame(Feature):
"""You can spend 5 ki points to cast wall of fire.
**Prerequisite**: 17th Level
"""
name = "River of Hungry Flame"
source = "Monk (Way of the Four Elements)"
spells_known = (spells.WallOfFire,)
class RushOfTheGaleSpirits(Feature):
"""You can spend 2 ki points to cast gust of wind.
"""
name = "Rush of the Gale Spirits"
source = "Monk (Way of the Four Elements)"
spells_known = (spells.GustOfWind,)
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 ices elevation,
create or fill in a trench, erect or flatten a wall, or form a pillar. The
extent of any such changes cant exceed half the areas 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 squares elevation by up to
15 feet, dig a trench up to 15 feet deep, and so on. You cant 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
"""
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 dont pull
it or knock it prone
"""
name = "Water Whip"
source = "Monk (Way of the Four Elements)"
class WaveOfRollingEarth(Feature):
"""You can spend 6 ki points to cast wall of stone
**Prerequisite**: 17th Level
"""
name = "Wave of Rolling Earth"
source = "Monk (Way of the Four Elements)"
spells_known = (spells.WallOfStone,)
# Way of the Long Death
class TouchOfDeath(Feature):
"""Starting when you choose this tradition at 3rd level, your study of death
allows you to extract vitality from an- other creature as it nears its
demise. When you reduce a creature within 5 feet of you to 0 hit points,
you gain temporary hit points equal to your Wisdom modifier + your monk
level (minimum of 1 temporary hit point)
"""
name = 'Touch of Death'
source = "Monk (Way of the Sun Soul)"
class HourOfReaping(Feature):
"""At 6th level, you gain the ability to unsettle or terrify those around you
as an action, for your soul has been touched by the shadow of death. When
you take this ac- tion , each creature within 30 feet of you that can see
you must succeed on a Wisdom saving throw or be fright- ened of you until
the end of your next turn
"""
name = "Hour of Reaping"
source = "Monk (Way of the Sun Soul)"
class MasteryOfDeath(Feature):
"""Beginning at 11th level, you use your familiarity with death to escape its
grasp. When you are reduced to 0 hit points, you can expend 1 ki point (no
action required) to have 1 hit point instead
"""
name = "Mastery of Death"
source = "Monk (Way of the Sun Soul)"
class TouchOfTheLongDeath(Feature):
"""Starting at 17th level, your touch can channel the energy of death into a
creature. As an action, you touch one creature within 5 feet of you, and
you expend 1 to 10 ki points. The target must make a Constitution saving
throw, and it takes 2d10 necrotic damage per ki point spent on a failed
save, or half as much damage on a suc- cessful one
"""
name = "Touch of the Long Death"
source = "Monk (Way of the Sun Soul)"
# Way of the Sun Soul
class RadiantSunBolt(Feature):
"""Starting when you choose this tradition at 3rd level, you can hurl searing
bolts of magical radiance. You gain a ranged spell attack that you can use
with the Attack action. The attack has a range of 30 feet. You are
proficient with it, and you add your Dexterity modi- fier to its attack and
damage rolls. Its damage is radiant, and its damage die is a d4.
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 on your turn to
use this special attack, you can spend 1 ki point to make two additional
attacks with it as a bonus action.
"""
name = "Radiant Sun Bolt"
source = "Monk (Way of the Sun Soul)"
def __init__(self, owner=None):
super().__init__(owner=owner)
self.owner.wield_weapon("sun bolt")
class SearingArcStrike(Feature):
"""At 6th level, you gain the ability to channel your ki into searing waves of
energy. Immediately after you take the Attack action on your turn, you can
spend 2 ki points to cast the 1st-level spell burning hands as a bonus
action. You can spend additional ki points to cast burning hands as a
higher level spell. Each additional ki point you spend increases the
spell's level by 1. The maximum number of ki points (2 plus any additional
points) that you can spend on the spell equals half your monk level (round
down)
"""
name = "Searing Arc Strike"
source = "Monk (Way of the Sun Soul)"
spells_known = (spells.BurningHands,)
class SearingSunburst(Feature):
"""At 11th level, you gain the ability to create an orb of light that erupts
into a devastating explosion. As an action, you create an orb and hurl it
at a point you choose within 150 feet, where it erupts into a sphere of
radiant light for a brief but deadly instant. Each creature in that
20-foot-radius sphere must succeed on a Constitution saving throw or take
2d6 radiant damage. A creature doesn't need to make the save if the
creature is behind total cover that is opaque. You can increase the
sphere's damage by spending ki points. Each point you spend, up to a
maximum of 3, increases the damage by 2d6.
"""
name = "Searing Sunburst"
source = "Monk (Way of the Sun Soul)"
class SunShield(Feature):
"""At 17th level, you become wreathed in a luminous aura. You shed bright
light in a 30-foot radius and dim light for an additional 30 feet. You can
extinguish or restore the light as a bonus action. If a creature hits you
with a melee attack while this light shines, you can use you r reaction to
deal radiant damage to the creature. The radiant damage equals 5 + your
Wisdom modifier
"""
name = "Sun Shield"
source = "Monk (Way of the Sun Soul)"
# Way of the Drunken Master
class DrunkenTechnique(Feature):
"""At 3rd level, you learn how to twist and turn quickly as part of your
Flurry of Blows. Whenever you use Flurry of Blows, you gain the benefit of
the Disengage action, and your walking speed increases by 10 feet until the
end of the current turn
"""
name = "Drunken Technique"
source = "Monk (Way of the Drunken Master)"
class TipsySway(Feature):
"""Starting at 6th level, you can move in sudden, swaying ways. You gain the
following benefits.
**Leap to Your Feet**: When youre 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,
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.
"""
name = "Tipsy Sway"
source = "Monk (Way of the Drunken Master)"
class DrunkardsLuck(Feature):
"""Starting at llth level, you always seem to get a lucky bounce at the right
moment. When you make an ability check, an attack roll, or a saving throw
and have disad- vantage on the roll, you can spend 2 ki points to cancel
the disadvantage for that roll
"""
name = "Drunkard's Luck"
source = "Monk (Way of the Drunken Master)"
class IntoxicatedFrenzy(Feature):
"""At 17th level, you gain the ability to make an overwhelm- ing number of
attacks against a group of enemies. When you use your Flurry of Blows, you
can make up to three additional attacks with it (up to a total of five
Flurry of Blows attacks), provided that each Flurry of Blows at- tack
targets a different creature this turn
"""
name = "Intoxicated Frenzy"
source = "Monk (Way of the Drunken Master)"
# Way of the Kensei
class PathOfTheKensei(Feature):
"""When you choose this tradition at 3rd level, your spe- cial martial arts
training leads you to master the use of certain weapons. This path also
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:
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
you dont already have it. Weapons of the chosen types are monk weapons for
you. Many of this traditions features work only with your kensei
weapons. When you reach 6th, 11th, and 17th level in this class. you can
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
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.
**Kenseis 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
calligrapher's supplies or painter's supplies
"""
name = "Path of the Kensei"
source = "Monk (Way of the Kensei)"
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
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
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.
"""
name = "One with the Blade"
source = "Monk (Way of the Kensei)"
class SharpenTheBlade(Feature):
"""At 11th level, you gain the ability to augment your weap- ons further with
your ki. As a bonus action, you can expend up to 3 ki points to grant one
kensei weapon you touch a bonus to attack and damage rolls when you attack
with it. The bonus equals the number of ki points you spent. This bonus
lasts for 1 minute or until you use this feature again. This feature has no
effect on a magic weapon that already has a bonus to attack and damage
rolls
"""
name = "Sharpen the Blade"
source = "Monk (Way of the Kensei)"
class UnerringAccuracy(Feature):
"""At 17th level, your mastery of weapons grants you ex- traordinary
accuracy. Ifyou miss with an attack roll using a monk weapon on your turn,
you can reroll it. You can use this feature only once on each of your
turns.
"""
name = "Unerring Accuracy"
source = "Monk (Way of the Kensei)"
+1 -1
View File
@@ -72,7 +72,7 @@ class Evasion(Feature):
"""
name = "Evasion"
source = "Rogue"
source = "Class (many)"
class ReliableTalent(Feature):
File diff suppressed because it is too large Load Diff
+11 -8
View File
@@ -4,7 +4,7 @@ from .armor import NoArmor, NoShield, HeavyArmor
from .features import (UnarmoredDefenseMonk, UnarmoredDefenseBarbarian,
DraconicResilience, Defense, FastMovement,
UnarmoredMovement, GiftOfTheDepths, RemarkableAthelete,
SeaSoul, JackOfAllTrades)
SeaSoul, JackOfAllTrades, SoulOfTheForge)
from math import ceil
@@ -126,18 +126,21 @@ class ArmorClass():
else:
ac += min(char.dexterity.modifier, armor.dexterity_mod_max)
# Compute feature-specific additions
if any([isinstance(f, UnarmoredDefenseMonk) for f in char.features]):
if char.has_feature(UnarmoredDefenseMonk):
if (isinstance(armor, NoArmor) and isinstance(shield, NoShield)):
ac += char.wisdom.modifier
if any([isinstance(f, UnarmoredDefenseBarbarian) for f in char.features]):
if char.has_feature(UnarmoredDefenseBarbarian):
if isinstance(armor, NoArmor):
ac += char.constitution.modifier
if any([isinstance(f, DraconicResilience) for f in char.features]):
if char.has_feature(DraconicResilience):
if isinstance(armor, NoArmor):
ac += 3
if any([isinstance(f, Defense) for f in char.features]):
if char.has_feature(Defense):
if not isinstance(armor, NoArmor):
ac += 1
if char.has_feature(SoulOfTheForge):
if isinstance(armor, HeavyArmor):
ac += 1
# Check if any magic items add to AC
for mitem in char.magic_items:
if hasattr(mitem, 'ac_bonus'):
@@ -156,17 +159,17 @@ class Speed():
if isinstance(speed, str):
other_speed = speed[2:]
speed = int(speed[:2]) # ignore other speeds, like fly
if any([isinstance(f, FastMovement) for f in char.features]):
if char.has_feature(FastMovement):
if not isinstance(char.armor, HeavyArmor):
speed += 10
if isinstance(char.armor, NoArmor) or (char.armor is None):
for f in char.features:
if isinstance(f, UnarmoredMovement):
speed += f.speed_bonus
if any([isinstance(f, GiftOfTheDepths) for f in char.features]):
if char.has_feature(GiftOfTheDepths):
if 'swim' not in other_speed:
other_speed += ' ({:d} swim)'.format(speed)
if any([isinstance(f, SeaSoul) for f in char.features]):
if char.has_feature(SeaSoul):
if 'swim' not in other_speed:
other_speed += ' (30 swim)'
return '{:d}{:s}'.format(speed, other_speed)
+11 -1
View File
@@ -441,6 +441,16 @@ class Unarmed(MeleeWeapon):
ability = "strength"
class SunBolt(RangedWeapon):
name = "Sun Bolt"
cost = "0 gp"
base_damage = "1d4"
damage_type = "r"
weight = 0
properties = "(range 20/60)"
ability = 'dexterity'
# Custom weapons
class HeavyPunch(MeleeWeapon):
base_damage = "1d4"
@@ -534,6 +544,6 @@ martial_ranged_weapons = (Blowgun, HandCrossbow, HeavyCrossbow,
martial_weapons = martial_melee_weapons + martial_ranged_weapons
monk_weapons = (Shortsword, Unarmed, Club, Dagger, Handaxe, Javelin,
LightHammer, Mace, Quarterstaff, Sickle, Spear)
LightHammer, Mace, Quarterstaff, Sickle, Spear, SunBolt)
firearms = (Firearm, Blunderbuss, Pistol, Musket)