Added features for all classes and subclasses

This commit is contained in:
Ben Cook
2019-01-01 01:17:54 -05:00
parent 5411084001
commit 73cb2b5e16
16 changed files with 2736 additions and 69 deletions
+1 -1
View File
@@ -1 +1 @@
0.9.3 0.9.4
+2 -13
View File
@@ -9,7 +9,7 @@ import importlib.util
import jinja2 import jinja2
import subprocess import subprocess
from .stats import Ability, Skill, findattr, ArmorClass, Speed from .stats import Ability, Skill, findattr, ArmorClass, Speed, Initiative
from .dice import read_dice_str from .dice import read_dice_str
from . import (weapons, race, background, spells, armor, monsters, from . import (weapons, race, background, spells, armor, monsters,
exceptions, classes, features, magic_items) exceptions, classes, features, magic_items)
@@ -74,6 +74,7 @@ class Character():
wisdom = Ability() wisdom = Ability()
charisma = Ability() charisma = Ability()
armor_class = ArmorClass() armor_class = ArmorClass()
initiative = Initiative()
speed = Speed() speed = Speed()
inspiration = 0 inspiration = 0
_saving_throw_proficiencies = tuple() # use to overwrite class proficiencies _saving_throw_proficiencies = tuple() # use to overwrite class proficiencies
@@ -506,18 +507,6 @@ class Character():
ability_mod = getattr(self, class_type.spellcasting_ability).modifier ability_mod = getattr(self, class_type.spellcasting_ability).modifier
return (self.proficiency_bonus + ability_mod) return (self.proficiency_bonus + ability_mod)
@property
def initiative(self) -> str:
ini = self.dexterity.modifier
if self.has_feature(features.QuickDraw):
ini += self.proficiency_bonus
ini = '{:+d}'.format(ini)
has_advantage = (self.has_feature(features.NaturalExplorerRevised) or
self.has_feature(features.FeralInstinct))
if has_advantage:
ini += '(A)'
return ini
def is_proficient(self, weapon: Weapon): def is_proficient(self, weapon: Weapon):
"""Is the character proficient with this item? """Is the character proficient with this item?
+44 -1
View File
@@ -16,6 +16,10 @@ class Hunter(SubClass):
""" """
name = "Hunter" name = "Hunter"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[3] = [features.HuntersPrey]
features_by_level[7] = [features.DefensiveTactics]
features_by_level[11] = [features.MultiattackRanger]
features_by_level[15] = [features.SuperiorHuntersDefense]
class BeastMaster(SubClass): class BeastMaster(SubClass):
@@ -29,6 +33,10 @@ class BeastMaster(SubClass):
""" """
name = "Beast Master" name = "Beast Master"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[3] = [features.RangersCompanion]
features_by_level[7] = [features.ExceptionalTraining]
features_by_level[11] = [features.BestialFury]
features_by_level[15] = [features.ShareSpells]
# XGTE # XGTE
@@ -43,6 +51,11 @@ class GloomStalker(SubClass):
""" """
name = "Gloom Stalker" name = "Gloom Stalker"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[3] = [features.GloomStalkerMagic, features.DreadAmbusher,
features.UmbralSight, features.Darkvision]
features_by_level[7] = [features.IronMind]
features_by_level[11] = [features.StalkersFlurry]
features_by_level[15] = [features.ShadowyDodge]
class HorizonWalker(SubClass): class HorizonWalker(SubClass):
@@ -57,6 +70,11 @@ class HorizonWalker(SubClass):
""" """
name = "Horizon Walker" name = "Horizon Walker"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[3] = [features.HorizonWalkerMagic,
features.DetectPortal, features.PlanarWarrior]
features_by_level[7] = [features.EtherealStep]
features_by_level[11] = [features.DistantStrike]
features_by_level[15] = [features.SpectralDefense]
class MonsterSlayer(SubClass): class MonsterSlayer(SubClass):
@@ -69,6 +87,11 @@ class MonsterSlayer(SubClass):
""" """
name = "Monster Slayer" name = "Monster Slayer"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[3] = [features.MonsterSlayerMagic, features.HuntersSense,
features.SlayersPrey]
features_by_level[7] = [features.SupernaturalDefense]
features_by_level[11] = [features.MagicUsersNemesis]
features_by_level[15] = [features.SlayersCounter]
class Ranger(CharClass): class Ranger(CharClass):
@@ -88,6 +111,15 @@ class Ranger(CharClass):
'Survival') 'Survival')
num_skill_choices = 3 num_skill_choices = 3
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[1] = [features.FavoredEnemy, features.NaturalExplorer]
features_by_level[2] = [features.RangerFightingStyle]
features_by_level[3] = [features.PrimevalAwareness]
features_by_level[5] = [features.ExtraAttackRanger]
features_by_level[8] = [features.LandsStride]
features_by_level[10] = [features.HideInPlainSight]
features_by_level[14] = [features.Vanish]
features_by_level[18] = [features.FeralSenses]
features_by_level[20] = [features.FoeSlayer]
subclasses_available = (Hunter, BeastMaster, GloomStalker, subclasses_available = (Hunter, BeastMaster, GloomStalker,
HorizonWalker, MonsterSlayer) HorizonWalker, MonsterSlayer)
spellcasting_ability = 'wisdom' spellcasting_ability = 'wisdom'
@@ -142,6 +174,12 @@ class HunterConclave(SubClass):
""" """
name = "Hunter Conclave" name = "Hunter Conclave"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level = defaultdict(list)
features_by_level[3] = [features.HuntersPrey]
features_by_level[5] = [features.ExtraAttackRanger]
features_by_level[7] = [features.DefensiveTactics]
features_by_level[11] = [features.MultiattackRanger]
features_by_level[15] = [features.SuperiorHuntersDefense]
class DeepStalkerConclave(SubClass): class DeepStalkerConclave(SubClass):
@@ -154,6 +192,11 @@ class DeepStalkerConclave(SubClass):
""" """
name = "Deep Stalker Conclave" name = "Deep Stalker Conclave"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[3] = [features.UnderdarkScout, features.DeepStalkerMagic]
features_by_level[5] = [features.ExtraAttackRanger]
features_by_level[7] = [features.IronMind]
features_by_level[11] = [features.StalkersFlurry]
features_by_level[15] = [features.StalkersDodge]
class RevisedRanger(Ranger): class RevisedRanger(Ranger):
@@ -165,7 +208,7 @@ class RevisedRanger(Ranger):
features_by_level[3] = [features.PrimevalAwarenessRevised] features_by_level[3] = [features.PrimevalAwarenessRevised]
features_by_level[6] = [features.GreaterFavoredEnemy] features_by_level[6] = [features.GreaterFavoredEnemy]
features_by_level[8] = [features.FleetOfFoot] features_by_level[8] = [features.FleetOfFoot]
features_by_level[10] = [features.HideInPlainSight] features_by_level[10] = [features.HideInPlainSightRevised]
features_by_level[14] = [features.Vanish] features_by_level[14] = [features.Vanish]
features_by_level[18] = [features.FeralSenses] features_by_level[18] = [features.FeralSenses]
features_by_level[20] = [features.FoeSlayer] features_by_level[20] = [features.FoeSlayer]
+32
View File
@@ -15,6 +15,10 @@ class Thief(SubClass):
""" """
name = "Thief" name = "Thief"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[3] = [features.FastHands, features.SecondStoryWork]
features_by_level[9] = [features.SupremeSneak]
features_by_level[13] = [features.UseMagicDevice]
features_by_level[17] = [features.ThiefsReflexes]
class Assassin(SubClass): class Assassin(SubClass):
@@ -26,7 +30,12 @@ class Assassin(SubClass):
""" """
name = "Assassin" name = "Assassin"
_proficiencies_text = ('disguise kit', "poisoner's kit")
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[3] = [features.Assassinate]
features_by_level[9] = [features.InfiltrationExpertise]
features_by_level[13] = [features.Imposter]
features_by_level[17] = [features.DeathStrike]
class ArcaneTrickster(SubClass): class ArcaneTrickster(SubClass):
@@ -38,6 +47,10 @@ class ArcaneTrickster(SubClass):
""" """
name = "Arcane Trickster" name = "Arcane Trickster"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[3] = [features.MageHandLegerdemain]
features_by_level[9] = [features.MagicalAmbush]
features_by_level[13] = [features.VersatileTrickster]
features_by_level[17] = [features.SpellThief]
spellcasting_ability = 'intelligence' spellcasting_ability = 'intelligence'
multiclass_spellslots_by_level = { multiclass_spellslots_by_level = {
# char_lvl: (cantrips, 1st, 2nd, 3rd, ...) # char_lvl: (cantrips, 1st, 2nd, 3rd, ...)
@@ -76,6 +89,11 @@ class Inquisitive(SubClass):
""" """
name = "Inquisitive" name = "Inquisitive"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[3] = [features.EarForDeceit, features.EyeForDetail,
features.InsightfulFighting]
features_by_level[9] = [features.SteadyEye]
features_by_level[13] = [features.UnerringEye]
features_by_level[17] = [features.EyeForWeakness]
class Mastermind(SubClass): class Mastermind(SubClass):
@@ -87,6 +105,11 @@ class Mastermind(SubClass):
""" """
name = "Mastermind" name = "Mastermind"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[3] = [features.MasterOfIntrigue,
features.MasterOfTactics]
features_by_level[9] = [features.InsightfulManipulator]
features_by_level[13] = [features.Misdirection]
features_by_level[17] = [features.SoulOfDeceit]
class Scout(SubClass): class Scout(SubClass):
@@ -99,7 +122,12 @@ class Scout(SubClass):
""" """
name = "Scout" name = "Scout"
skill_proficiencies = ("nature", "survival")
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[3] = [features.Skirmisher, features.Survivalist]
features_by_level[9] = [features.SuperiorMobility]
features_by_level[13] = [features.AmbushMaster]
features_by_level[17] = [features.SuddenStrike]
class Swashbuckler(SubClass): class Swashbuckler(SubClass):
@@ -113,6 +141,10 @@ class Swashbuckler(SubClass):
""" """
name = "Swashbuckler" name = "Swashbuckler"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[3] = [features.FancyFootwork, features.RakishAudacity]
features_by_level[9] = [features.Panache]
features_by_level[13] = [features.ElegantManeuver]
features_by_level[17] = [features.MasterDuelist]
class Rogue(CharClass): class Rogue(CharClass):
+21
View File
@@ -15,7 +15,13 @@ class DraconicBloodline(SubClass):
""" """
name = "Draconic Bloodline" name = "Draconic Bloodline"
languages = ('draconic',)
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[1] = [features.DragonAncestor,
features.DraconicResilience]
features_by_level[6] = [features.ElementalAffinity]
features_by_level[14] = [features.DragonWings]
features_by_level[18] = [features.DraconicPresence]
class WildMagic(SubClass): class WildMagic(SubClass):
@@ -58,6 +64,10 @@ class DivineSoul(SubClass):
""" """
name = "Divine Soul" name = "Divine Soul"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[1] = [features.DivineMagic, features.FavoredByTheGods]
features_by_level[6] = [features.EmpoweredHealing]
features_by_level[14] = [features.OtherworldlyWings]
features_by_level[18] = [features.UnearthlyRecovery]
class ShadowMagic(SubClass): class ShadowMagic(SubClass):
@@ -75,6 +85,12 @@ class ShadowMagic(SubClass):
""" """
name = "Shadow Magic" name = "Shadow Magic"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[1] = [features.EyesOfTheDark,
features.SuperiorDarkvision,
features.StrengthOfTheGrave]
features_by_level[6] = [features.HoundOfIllOmen]
features_by_level[14] = [features.ShadowWalk]
features_by_level[18] = [features.UmbralForm]
class StormSorcery(SubClass): class StormSorcery(SubClass):
@@ -92,7 +108,12 @@ class StormSorcery(SubClass):
""" """
name = "Storm Sorcery" name = "Storm Sorcery"
languages = ("primordial",)
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[1] = [features.TempestuousMagic]
features_by_level[6] = [features.HeartOfTheStorm, features.StormGuide]
features_by_level[14] = [features.StormsFury]
features_by_level[18] = [features.WindSoul]
class Sorceror(CharClass): class Sorceror(CharClass):
+18 -1
View File
@@ -1,4 +1,4 @@
from .. import (weapons, features) from .. import (weapons, features, spells)
from .classes import CharClass, SubClass from .classes import CharClass, SubClass
from collections import defaultdict from collections import defaultdict
@@ -17,6 +17,10 @@ class Archfey(SubClass):
""" """
name = "The Archfey Patron" name = "The Archfey Patron"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[1] = [features.FeyPresence]
features_by_level[6] = [features.MistyEscape]
features_by_level[10] = [features.BeguilingDefenses]
features_by_level[14] = [features.DarkDelirium]
class Fiend(SubClass): class Fiend(SubClass):
@@ -54,6 +58,10 @@ class GreatOldOne(SubClass):
""" """
name = "The Great Old One Patron" name = "The Great Old One Patron"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[1] = [features.AwakenedMind]
features_by_level[6] = [features.EntropicWard]
features_by_level[10] = [features.ThoughtShield]
features_by_level[14] = [features.CreateThrall]
# SCAG # SCAG
@@ -73,6 +81,10 @@ class Undying(SubClass):
""" """
name = "The Undying Patron" name = "The Undying Patron"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[1] = [features.AmongTheDead]
features_by_level[6] = [features.DefyDeath]
features_by_level[10] = [features.UndyingNature]
features_by_level[14] = [features.IndestructibleLife]
# XGTE # XGTE
@@ -93,7 +105,12 @@ class Celestial(SubClass):
""" """
name = "The Celestial Patron" name = "The Celestial Patron"
spells_known = spells_prepared = (spells.Light, spells.SacredFlame)
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[1] = [features.HealingLight]
features_by_level[6] = [features.RadiantSoul]
features_by_level[10] = [features.CelestialResilience]
features_by_level[14] = [features.SearingVengeance]
class Hexblade(SubClass): class Hexblade(SubClass):
+50 -3
View File
@@ -18,6 +18,10 @@ class Abjuration(SubClass):
""" """
name = "School of Abjuration" name = "School of Abjuration"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[2] = [features.AbjurationSavant, features.ArcaneWard]
features_by_level[6] = [features.ProjectedWard]
features_by_level[10] = [features.ImprovedAbjuration]
features_by_level[14] = [features.SpellResistance]
class Conjuration(SubClass): class Conjuration(SubClass):
@@ -30,6 +34,10 @@ class Conjuration(SubClass):
""" """
name = "School of Conjuration" name = "School of Conjuration"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[2] = [features.ConjurationSavant, features.MinorIllusion]
features_by_level[6] = [features.BenignTransposition]
features_by_level[10] = [features.FocusedConjuration]
features_by_level[14] = [features.DurableSummons]
class Divination(SubClass): class Divination(SubClass):
@@ -42,6 +50,10 @@ class Divination(SubClass):
""" """
name = "School of Divination" name = "School of Divination"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[2] = [features.DivinationSavant, features.Portent]
features_by_level[6] = [features.ExpertDivination]
features_by_level[10] = [features.TheThirdEye]
features_by_level[14] = [features.GreaterPortent]
class Enchantment(SubClass): class Enchantment(SubClass):
@@ -54,6 +66,10 @@ class Enchantment(SubClass):
""" """
name = "School of Enchantment" name = "School of Enchantment"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[2] = [features.EnchantmentSavant, features.HypnoticGaze]
features_by_level[6] = [features.InstinctiveGaze]
features_by_level[10] = [features.SplitEnchantment]
features_by_level[14] = [features.AlterMemories]
class Evocation(SubClass): class Evocation(SubClass):
@@ -67,6 +83,10 @@ class Evocation(SubClass):
""" """
name = "School of Evocation" name = "School of Evocation"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[2] = [features.EvocationSavant, features.SculptSpells]
features_by_level[6] = [features.PotentCantrip]
features_by_level[10] = [features.EmpoweredEvocation]
features_by_level[14] = [features.Overchannel]
class Illusion(SubClass): class Illusion(SubClass):
@@ -80,6 +100,11 @@ class Illusion(SubClass):
""" """
name = "School of Illusion" name = "School of Illusion"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[2] = [features.IllusionSavant,
features.ImprovedMinorIllusion]
features_by_level[6] = [features.MalleableIllusions]
features_by_level[10] = [features.IllusorySelf]
features_by_level[14] = [features.IllusoryReality]
class Necromancy(SubClass): class Necromancy(SubClass):
@@ -96,6 +121,10 @@ class Necromancy(SubClass):
""" """
name = "School of Necromancy" name = "School of Necromancy"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[2] = [features.NecromancySavant, features.GrimHarvest]
features_by_level[6] = [features.UndeadThralls]
features_by_level[10] = [features.InuredToUndeath]
features_by_level[14] = [features.CommandUndead]
class Transmutation(SubClass): class Transmutation(SubClass):
@@ -113,10 +142,15 @@ class Transmutation(SubClass):
""" """
name = "School of Transmutation" name = "School of Transmutation"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[2] = [features.TransmutationSavant,
features.MinorAlchemy]
features_by_level[6] = [features.TransmutersStone]
features_by_level[10] = [features.Shapechanger]
features_by_level[14] = [features.MasterTransmuter]
# SCAG # SCAG
class Bladeslinging(SubClass): class Bladesinging(SubClass):
"""**Restriction: Elves Only** """**Restriction: Elves Only**
Bladesingers are elves who bravely defend their people and lands. They are Bladesingers are elves who bravely defend their people and lands. They are
@@ -126,8 +160,14 @@ class Bladeslinging(SubClass):
magic into devastating attacks and a cunning defense magic into devastating attacks and a cunning defense
""" """
name = "School of Bladeslinging" name = "School of Bladesinging"
_proficiencies_text = ('light armor',)
skill_proficiencies = ('performance',)
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[2] = [features.Bladesong,]
features_by_level[6] = [features.ExtraAttackBladesinging]
features_by_level[10] = [features.SongOfDefense]
features_by_level[14] = [features.SongOfVictory]
# XGTE # XGTE
@@ -154,6 +194,10 @@ class WarMagic(SubClass):
""" """
name = "School of War Magic" name = "School of War Magic"
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[2] = [features.ArcaneDeflection, features.TacticalWit]
features_by_level[6] = [features.PowerSurge]
features_by_level[10] = [features.DurableMagic]
features_by_level[14] = [features.DeflectingShroud]
class Wizard(CharClass): class Wizard(CharClass):
@@ -172,9 +216,12 @@ class Wizard(CharClass):
class_skill_choices = ('Arcana', 'History', 'Investigation', class_skill_choices = ('Arcana', 'History', 'Investigation',
'Medicine', 'Religion') 'Medicine', 'Religion')
features_by_level = defaultdict(list) features_by_level = defaultdict(list)
features_by_level[1] = [features.ArcaneRecovery]
features_by_level[18] = [features.SpellMastery]
features_by_level[18] = [features.SignatureSpells]
subclasses_available = (Abjuration, Conjuration, Divination, Enchantment, subclasses_available = (Abjuration, Conjuration, Divination, Enchantment,
Evocation, Illusion, Necromancy, Transmutation, Evocation, Illusion, Necromancy, Transmutation,
Bladeslinging, WarMagic) Bladesinging, WarMagic)
spellcasting_ability = 'intelligence' spellcasting_ability = 'intelligence'
spell_slots_by_level = { spell_slots_by_level = {
# char_lvl: (cantrips, 1st, 2nd, 3rd, ...) # char_lvl: (cantrips, 1st, 2nd, 3rd, ...)
+1 -1
View File
@@ -266,7 +266,7 @@ class LandsStride(Feature):
""" """
name = "Land's Stride" name = "Land's Stride"
source = "Druid (Circle of the Land)" source = "Class (Many)"
class NaturesWard(Feature): class NaturesWard(Feature):
+1 -1
View File
@@ -302,7 +302,7 @@ class EmissaryOfRedemption(Feature):
--Whenever a creature hits you with an attack, it takes radiant damage --Whenever a creature hits you with an attack, it takes radiant damage
equal to half the damage you take from the attack. equal to half the damage you take from the attack.
If you attack a creature, cast a spell on it, or deal dam- age to it by any If you attack a creature, cast a spell on it, or deal damage to it by any
means but this feature, neither benefit works against that creature until means but this feature, neither benefit works against that creature until
you finish a long rest you finish a long rest
+696 -37
View File
@@ -1,5 +1,61 @@
from .features import Feature, FeatureSelector from .features import Feature, FeatureSelector
from .. import (weapons, armor) from .. import (weapons, armor, spells)
from .rogue import UncannyDodge, Evasion
# PHB
class FavoredEnemy(Feature):
"""Beginning at 1st level, you have significant experience studying, tracking,
hunting, and even talking to a certain type of enemy.
Choose a type of favored enemy: aberrations, beasts, celestials,
constructs, dragons, elementals, fey, fiends, giants, monstrosities, oozes,
plants, or undead. Alternatively, you can select two races of humanoid
(such as gnolls and orcs) as favored enemies. You have advantage on Wisdom
(Survival) checks to track your favored enemies, as well as on Intelligence
checks to recall information about them.
When you gain this feature, you also learn one language of your choice that
is spoken by your favored enemies, if they speak one at all. You choose one
additional favored enemy, as well as an associated language, at 6th and
14th level. As you gain levels, your choices should reflect the types of
monsters you have encountered on your adventures.
"""
name = "Favored Enemy"
source = "Ranger"
languages = ("[Select One]",)
class NaturalExplorer(Feature):
"""You are particularly familiar with one type of natural environment and are
adept at traveling and surviving in such regions. Choose one type of
favored terrain: arctic, coast, desert, forest, grassland, mountain, swamp,
or the Underdark. You choose additional favored terrain types at 6th and
10th
When you make an Intelligence or Wisdom check related to your favored
terrain, your proficiency bonus is doubled if you are using a skill that
youre proficient in. While traveling for an hour or more in your favored
terrain, you gain the following benefits:
-- Difficult terrain doesnt slow your groups travel.
-- Your group cant become lost except by magical means.
-- Even when you are engaged in another activity while traveling
(such as foraging, navigating, or tracking), you remain alert to danger.
-- If you are traveling alone, you can move stealthily at a normal pace.
-- When you forage, you find twice as much food as you normally would.
-- While tracking other creatures, you also learn their exact number, their
sizes, and how long ago they passed through the area.
"""
name = "Natural Explorer"
source = "Ranger"
class Archery(Feature): class Archery(Feature):
@@ -77,6 +133,587 @@ class RangerFightingStyle(FeatureSelector):
source = "Ranger" source = "Ranger"
class PrimevalAwareness(Feature):
"""Beginning at 3rd level, you can use your action and expend one ranger spell
slot to focus your awareness on the region around you. For 1 minute per
level of the spell slot you expend, you can sense whether the following
types of creatures are present within 1 mile of you (or within up to 6
miles if you are in your favored terrain): aberrations, celestials,
dragons, elementals, fey, fiends, and undead. This feature doesnt reveal
the creatures location or number.
"""
name = "Primeval Awareness"
source = "Ranger"
class ExtraAttackRanger(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 = "Ranger"
class HideInPlainSight(Feature):
"""Starting at 10th level, you can spend 1 minute creating camouflage for
yourself. You must have access to fresh mud, dirt, plants, soot, and other
naturally occurring materials with which to create your camouflage. Once
you are camouflaged in this way, you can try to hide by pressing yourself
up against a solid surface, such as a tree or wall, that is at least as
tall and wide as you are.
You gain a +10 bonus to Dexterity (Stealth) checks as long as you remain
there without moving or taking actions. Once you move or take an action or
a reaction, you must camouflage yourself again to gain this benefit
"""
name = "Hide in Plain Sight"
source = "Ranger"
class Vanish(Feature):
"""Starting at 14th level, you can use the Hide action as a bonus action on
your turn. Also, you cant be tracked by nonmagical means, unless you
choose to leave a trail.
"""
name = "Vanish"
source = "Ranger"
class FeralSenses(Feature):
"""At 18th level, you gain preternatural senses that help you fight creatures
you cant see. When you attack a creature you cant see, your inability to
see it doesnt impose disadvantage on your attack rolls against it. You are
also aware of the location of any invisible creature within 30 feet of you,
provided that the creature isnt hidden from you and you arent blinded or
deafened
"""
name = "Feral Senses"
source = "Ranger"
class FoeSlayer(Feature):
"""At 20th level, you become an unparalleled hunter of your enemies. Once on
each of your turns, you can add your Wisdom modifier to the attack roll or
the damage roll of an attack you make against one o f your favored
enemies. You can choose to use this feature before or after the roll, but
before any effects of the roll are applied.
"""
name = "Foe Slayer"
source = "Ranger"
# Hunter
class ColossusSlayer(Feature):
"""Your tenacity can wear down the most potent foes. When you hit a creature
with a weapon attack, the creature takes an extra 1d8 damage if its below
its hit point maximum. You can deal this extra damage only once per turn.
"""
name = "Colossus Slayer"
source = "Ranger (Hunter)"
class GiantKiller(Feature):
"""When a Large or larger creature within 5 feet of you hits or misses you
with an attack, you can use your reaction to attack that creature
immediately after its attack, provided that you can see the creature.
"""
name = "Giant Killer"
source = "Ranger (Hunter)"
class HordeBreaker(Feature):
"""Once on each o f your turns when you make a weapon attack, you can make
another attack with the same weapon against a different creature that is
within 5 feet of the original target and within range of your weapon.
"""
name = "Horde Breaker"
source = "Ranger (Hunter)"
class HuntersPrey(FeatureSelector):
"""Select a Hunter's Prey option in "feature_choices" in your .py file from
one of:
colossus slayer
giant killer
horde breaker
"""
options = {'colossus slayer': ColossusSlayer,
'giant killer': GiantKiller,
'horde breaker': HordeBreaker}
name = "Hunter's Prey (Select One)"
source = "Ranger (Hunter)"
class EscapeTheHorde(Feature):
"""Opportunity attacks against you are made with disadvantage
"""
name = "Escape the Horde"
source = "Ranger (Hunter)"
class MultiattackDefense(Feature):
"""When a creature hits you with an attack, you gain a +4 bonus to AC against
all subsequent attacks made by that creature for the rest of the turn.
"""
name = "Multiattack Defense"
source = "Ranger (Hunter)"
class SteelWill(Feature):
"""You have advantage on saving throws against being frightened.
"""
name = "Steel Will"
source = "Ranger (Hunter)"
class DefensiveTactics(FeatureSelector):
"""Select a Defensive Tactics option in "feature_choices" in your .py file from
one of:
escape the horde
multiattack defense
steel will
"""
options = {'escape the horde': EscapeTheHorde,
'multiattack defense': MultiattackDefense,
'steel will': SteelWill}
name = "Defensive Tactics (Select One)"
source = "Ranger (Hunter)"
class Volley(Feature):
"""You can use your action to make a ranged attack against any number of
creatures within 10 feet o f a point you can see within your weapons
range. You must have ammunition for each target, as normal, and you make a
separate attack roll for each target
"""
name = "Volley"
source = "Ranger (Hunter)"
class WhirlwindAttack(Feature):
"""You can use your action to make a melee attack against any number o f
creatures within 5 feet of you, with a separate attack roll for each target
"""
name = "Whirlwind Attack"
source = "Ranger (Hunter)"
class MultiattackRanger(FeatureSelector):
"""Select a Multiattack option in "feature_choices" in your .py file from
one of:
volley
whirlwind attack
"""
options = {'volley': Volley,
'whirlwind attack': WhirlwindAttack}
name = "Multiattack (Select One)"
source = "Ranger (Hunter)"
class StandAgainstTheTide(Feature):
"""When a hostile creature misses you with a melee attack, you can use your
reaction to force that creature to repeat the same attack against another
creature (other than itself) of your choice
"""
name = "Stand Against the Tide"
source = "Ranger (Hunter)"
class SuperiorHuntersDefense(FeatureSelector):
"""Select a Superior Hunter's Defense option in "feature_choices" in your .py
file from one of:
evasion
stand against the tide
uncanny dodge
"""
options = {'evasion': Evasion,
'stand against of the tide': StandAgainstTheTide,
'uncanny dodge': UncannyDodge}
name = "Superior Hunter's Defense (Select One)"
source = "Ranger (Hunter)"
# Beast Master
class RangersCompanion(Feature):
"""At 3rd level, you gain a beast companion that accompanies you on your
adventures and is trained to fight alongside you. Choose a beast that is no
larger than Medium and that has a challenge rating of 1/4 or lower
(appendix D presents statistics for the hawk, mastiff, and panther as
examples). Add your proficiency bonus to the beasts AC, attack rolls, and
damage rolls, as well as to any saving throws and skills it is proficient
in. Its hit point maximum equals its normal maximum or four times your
ranger level, whichever is higher.
The beast obeys your commands as best as it can. It takes its turn on your
initiative, though it doesnt take an action unless you command it to. On
your turn, you can verbally command the beast where to move (no action
required by you). You can use your action to verbally command it to take
the Attack, Dash, Disengage, Dodge, or Help action. Once you have the Extra
Attack feature, you can make one weapon attack yourself when you command
the beast to take the Attack action.
While traveling through your favored terrain with only the beast, you can
move stealthily at a normal pace. If the beast dies, you can obtain another
one by spending 8 hours magically bonding with another beast that isnt
hostile to you, either the same type of beast as before or a different one.
"""
name = "Ranger's Companion"
source = "Ranger (Beast Master)"
class ExceptionalTraining(Feature):
"""Beginning at 7th level, on any of your turns when your beast companion
doesnt attack, you can use a bonus action to command the beast to take the
Dash, Disengage, Dodge, or Help action on its turn
"""
name = "Exceptional Training"
source = "Ranger (Beast Master)"
class BestialFury(Feature):
"""Starting at 11th level, your beast companion can make two attacks when you
command it to use the Attack action.
"""
name = "Bestial Fury"
source = "Ranger (Beast Master)"
class ShareSpells(Feature):
"""Beginning at 15th level, when you cast a spell targeting yourself, you can
also affect your beast companion with the spell if the beast is within 30
feet of you
"""
name = "Share Spells"
source = "Ranger (Beast Master)"
# Gloom Stalker
class GloomStalkerMagic(Feature):
"""Starting at 3rd level, you learn an additional spell when you reach certain
levels in this class, as shown in the Gloom Stalker Spells table. The spell
counts as a ranger spell for you, but it doesn't count against the number
of ranger spells you know
"""
name = "Gloom Stalker Magic"
source = "Ranger (Gloom Stalker)"
_spells = {3: [spells.DisguiseSelf],
5: [spells.RopeTrick],
9: [spells.Fear],
13: [spells.GreaterInvisibility],
17: [spells.Seeming]}
@property
def spells_prepared(self):
level = self.owner.Ranger.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 DreadAmbusher(Feature):
"""At 3rd level, you master the art of the ambush. You can give yourself a
bonus to your initiative rolls equal to your Wisdom modifier. At the start
of your first turn of each combat, your walking speed increases by 10 feet,
which lasts until the end of that turn. If you take the Attack action on
that turn, you can make one additional weapon attack as part of that
action. If that attack hits, the target takes an extra 1d8 damage of the
weapons damage type.
"""
name = 'Dread Ambusher'
source = "Ranger (Gloom Stalker)"
class UmbralSight(Feature):
"""At 3rd level, you gain darkvision out to a range of 60 feet. If you already
have darkvision from your race, its range increases by 30 feet. You are
also adept at evading creatures that rely on darkvision. While in darkness,
you are invisible to any creature that relies on darkvision to see you in
that darkness.
"""
name = "Umbral Sight"
source = "Ranger (Gloom Stalker)"
class IronMind(Feature):
"""By 7th level, you have honed your ability to resist the mind—altering
powers of your prey. You gain proficiency in Wisdom saving throws. Ifyou
already have this proficiency, you instead gain proficiency in
Intelligence or Charisma saving throws (your choice)
"""
name = "Iron Mind"
source = "Ranger (Gloom Stalker)"
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 StalkersFlurry(Feature):
"""At 11th level, you learn to attack with such unexpected speed that you can
turn a miss into another strike. Once on each of your turns when you miss
with a weapon attack, you can make another weapon attack as part of the
same action
"""
name = "Stalker's Flurry"
source = "Ranger (Gloom Stalker)"
class ShadowyDodge(Feature):
"""Starting at 15th level, you can dodge in unforeseen ways, with wisps of
supernatural shadow around you. Whenever a creature makes an attack roll
against you and doesnt have advantage on the roll, you can use your
reaction to impose disadvantage on it. You must use this feature before you
know the outcome of the attack roll.
"""
name = "Shadowy Dodge"
source = "Ranger (Gloom Stalker)"
# Horizon Walker
class HorizonWalkerMagic(Feature):
"""Starting at 3rd level, you learn an additional spell when you reach certain
levels in this class, as shown in the Horizon Walker Spells table. The spell
counts as a ranger spell for you, but it doesn't count against the number
of ranger spells you know
"""
name = "Horizon Walker Magic"
source = "Ranger (Horizon Walker)"
_spells = {3: [spells.ProtectionFromEvilAndGood],
5: [spells.MistyStep],
9: [spells.Haste],
13: [spells.Banishment],
17: [spells.TeleportationCircle]}
@property
def spells_prepared(self):
level = self.owner.Ranger.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 DetectPortal(Feature):
"""At 3rd level, you gain the ability to magically sense the presence of a
planar portal. As an action, you detect the distance and direction to the
closest planar portal within 1 mile of you. Once you use this feature, you
cant use it again until you finish a short or long rest.
"""
name = "Detect Portal"
source = "Ranger (Horizon Walker)"
class PlanarWarrior(Feature):
"""At 3rd level, you learn to draw on the energy of the multiverse to
augment your attacks. As a bonus action, choose one creature you can see
within 30 feet of you. The next time you hit that creature on this turn
with a weapon attack, all damage dealt by the attack becomes force damage,
and the creature takes an extra 1d8 force damage from the attack. When you
reach 11th level in this class, the extra damage increases to 2d8.
"""
_name = "Planar Warrior"
source = "Ranger (Horizon Walker)"
@property
def name(self):
if self.owner.Ranger.level < 11:
return self._name + " (1d8/f)"
else:
return self._name + " (2d8/f)"
class EtherealStep(Feature):
"""At 7th level, you learn to step through the Ethereal Plane. As a bonus
action, you can cast the etherealncss spell with this feature, without
expending a spell slot, but the spell ends at the end of the current
turn. Once you use this feature, you cant use it again until you finish a
short or long rest
"""
name = "Ethereal Step"
source = "Ranger (Horizon Walker)"
class DistantStrike(Feature):
"""At 11th level, you gain the ability to pass between the planes in the blink
of an eye. When you take the Attack action, you can teleport up to 10 feet
before each attack to an unoccupied space you can see. Ifyou attack at
least two different creatures with the action, you can make one additional
attack with it against a third creature.
"""
name = "Distant Strike"
source = "Ranger (Horizon Walker)"
class SpectralDefense(Feature):
"""At 15th level, your ability to move between planes enables you to slip
through the planar boundaries to lessen the harm done to you during
battle. When you take damage from an attack, you can use your reaction to
give yourself resistance to all of that attacks damage on this turn
"""
name = "Spectral Defense"
source = "Ranger (Horizon Walker)"
# Monster Slayer
class MonsterSlayerMagic(Feature):
"""Starting at 3rd level, you learn an additional spell when you reach certain
levels in this class, as shown in the Monster Slayer Spells table. The
spell counts as a ranger spell for you, but it doesn't count against the
number of ranger spells you know
"""
name = "Monster Slayer Magic"
source = "Ranger (Monster Slayer)"
_spells = {3: [spells.ProtectionFromEvilAndGood],
5: [spells.ZoneOfTruth],
9: [spells.MagicCircle],
13: [spells.Banishment],
17: [spells.HoldMonster]}
@property
def spells_prepared(self):
level = self.owner.Ranger.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 HuntersSense(Feature):
"""At 3rd level, you gain the ability to peer at a creature and magically
discern how best to hurt it. As an action, choose one creature you can see
within 60 feet ofyou. You immediately learn whether the creature has any
damage immunities, resistances, or vulnerabilities and What they are. If
the creature is hidden from divination magic, you sense that it has no
damage immunities, re sistances, or vulnerabilities. You can use this
feature a number of times equal to your Wisdom modifier (minimum of
once). You regain all expended uses of it when you finish a long rest.
"""
_name = "Hunter's Sense"
source = "Ranger (Monster Slayer)"
@property
def name(self):
num = max(1, self.owner.wisdom.modifier)
return self._num + " ({:d}x/LR)".format(num)
class SlayersPrey(Feature):
"""Starting at 3rd level, you can focus your ire on one foe, increasing the
harm you inflict on it. As a bonus action, you designate one creature you
can see within 60 feet of you as the target of this feature. The first time
each turn that you hit that target with a weapon attack, it takes an extra
1d6 damage from the weapon. This benefit lasts until you finish a short or
long rest. It ends early if you designate a different creature
"""
name = "Slayer's Prey"
source = "Ranger (Monster Slayer)"
class SupernaturalDefense(Feature):
"""At 7th level, you gain extra resilience against your preys assaults on
your mind and body. Whenever the target of your Slayers Prey forces you to
make a saving throw and whenever you make an ability check to escape that
targets grapple, add 1d6 to your roll
"""
name = "Supernatural Defense"
source = "Ranger (Monster Slayer)"
class MagicUsersNemesis(Feature):
"""At 11th level, you gain the ability to thwart someone elses magic. When
you see a creature casting a spell or teleporting within 60 feet of you,
you can use your reaction to try to magically foil it. The creature must
succeed on a Wisdom saving throw against your spell save DC, or its spell
or teleport fails and is wasted. Once you use this feature, you cant use
it again until you finish a short or long rest.
"""
name = "Magic User's Nemesis"
source = "Ranger (Monster Slayer)"
class SlayersCounter(Feature):
"""At 15th level, you gain the ability to counterattack when your prey tries
to sabotage you. If the target of your Slayers Prey forces you to make a
saving throw, you can use your reaction to make one weapon attack against
the quarry. You make this attack immediately before making the saving
throw. If your attack hits, your save automatir cally succeeds, in addition
to the attacks normal effects
"""
name = "Slayer's Counter"
source = "Ranger (Monster Slayer)"
# Revised Ranger # Revised Ranger
class FavoredEnemyRevised(Feature): class FavoredEnemyRevised(Feature):
"""Beginning at 1st level, you have significant experience studying, tracking, """Beginning at 1st level, you have significant experience studying, tracking,
@@ -185,7 +822,7 @@ class FleetOfFoot(Feature):
source = "Revised Ranger" source = "Revised Ranger"
class HideInPlainSight(Feature): class HideInPlainSightRevised(Feature):
"""Starting at 10th level, you can remain perfectly still for long periods of """Starting at 10th level, you can remain perfectly still for long periods of
time to set up ambushes. time to set up ambushes.
@@ -204,41 +841,7 @@ class HideInPlainSight(Feature):
source = "Revised Ranger" source = "Revised Ranger"
class Vanish(Feature): # Beast Conclave
"""Starting at 14th level, you can use the Hide action as a bonus action on
your turn. Also, you cant be tracked by nonmagical means, unless you
choose to leave a trail
"""
name = "Vanish"
source = "Revised Ranger"
class FeralSenses(Feature):
"""At 18th level, you gain preternatural senses that help you fight creatures
you cant see. When you attack a creature you cant see, your inability to
see it doesnt impose disadvantage on your attack rolls against it.
You are also aware of the location of any invisible creature within 30 feet
of you, provided that the creature isnt hidden from you and you arent
blinded or deafened
"""
name = "Feral Senses"
source = "Revised Ranger"
class FoeSlayer(Feature):
"""At 20th level, you become an unparalleled hunter. Once on each of your
turns, you can add your Wisdom modifier to the attack roll or the damage
roll of an attack you make. You can choose to use this feature before or
after the roll, but before any effects of the roll are applied
"""
name = "Foe Slayer"
source = "Revised Ranger"
class AnimalCompanion(Feature): class AnimalCompanion(Feature):
"""At 3rd level, you learn to use your magic to create a powerful bond with a """At 3rd level, you learn to use your magic to create a powerful bond with a
creature of the natural world. creature of the natural world.
@@ -343,3 +946,59 @@ class SuperiorBeastsDefense(Feature):
""" """
name = "Superior Beast's Defense" name = "Superior Beast's Defense"
source = "Revised Ranger (Beast Conclave)" source = "Revised Ranger (Beast Conclave)"
# Deep Stalker Conclave
class UnderdarkScout(Feature):
"""At 3rd level, you master the art of the ambush. On your first turn during
combat, you gain a +10 bonus to your speed, and if you use the Attack
action, you can make one additional attack. You are also adept at evading
creatures that rely on darkvision. Such creatures gain no benefit when
attempting to detect you in dark and dim conditions. Additionally, when the
DM determines if you can hide from a creature, that creature gains no
benefit from its darkvision
"""
name = "Underdark Scout"
source = "Revised Ranger (Deep Stalker Conclave)"
class DeepStalkerMagic(Feature):
"""Starting at 3rd level, you learn an additional spell when you reach certain
levels in this class, as shown in the Deep Stalker Spells table. The spell
counts as a ranger spell for you, but it doesn't count against the number
of ranger spells you know
"""
name = "Deep Stalker Magic"
source = "Revised Ranger (Deep Stalker Conclave)"
_spells = {3: [spells.DisguiseSelf],
5: [spells.RopeTrick],
9: [spells.GlyphOfWarding],
13: [spells.GreaterInvisibility],
17: [spells.Seeming]}
@property
def spells_prepared(self):
level = self.owner.Ranger.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 StalkersDodge(Feature):
"""At 15th level, whenever a creature attacks you and does not have advantage,
you can use your reaction to impose disadvantage on the creatures attack
roll against you. You can use this feature before or after the attack roll
is made, but it must be used before the outcome of the roll is determined
"""
name = "Stalker's Dodge"
source = "Revised Ranger (Deep Stalker Conclave)"
+445 -1
View File
@@ -60,7 +60,7 @@ class UncannyDodge(Feature):
""" """
name = "Uncanny Dodge" name = "Uncanny Dodge"
source = "Rogue" source = "Class (many)"
class Evasion(Feature): class Evasion(Feature):
@@ -124,3 +124,447 @@ class StrokeOfLuck(Feature):
""" """
name = "Stroke of Luck" name = "Stroke of Luck"
source = "Rogue" source = "Rogue"
# Thief
class FastHands(Feature):
"""Starting at 3rd level, you can use the bonus action granted by your Cunning
Action to make a Dexterity (Sleight of Hand) check, use your thieves tools
to disarm a trap or open a lock, or take the Use an Object action.
"""
name = "Fast Hands"
source = "Rogue (Thief)"
class SecondStoryWork(Feature):
"""When you choose this archetype at 3rd level, you gain the ability to climb
faster than normal; climbing no longer costs you extra movement. In
addition, when you make a running jump, the distance you cover increases by
a number of feet equal to your Dexterity modifier.
"""
name = "Second-Story Work"
source = "Rogue (Thief)"
class SupremeSneak(Feature):
"""Starting at 9th level, you have advantage on a Dexterity (Stealth) check if
you move no more than half your speed on the same turn
"""
name = "Supreme Sneak"
source = "Rogue (Thief)"
class UseMagicDevice(Feature):
"""By 13th level, you have learned enough about the workings of magic that you
can improvise the use of items even when they are not intended for you. You
ignore all class, race, and level requirements on the use of magic items
"""
name = "Use Magic Device"
source = "Rogue (Thief)"
class ThiefsReflexes(Feature):
"""When you reach 17th level, you have become adept at laying ambushes and
quickly escaping danger. You can take two turns during the first round of
any combat. You take your first turn at your normal initiative and your
second turn at your initiative minus 10. You cant use this feature when
you are surprised.
"""
name = "Thief's Reflexes"
source = "Rogue (Thief)"
# Assassin
class Assassinate(Feature):
"""Starting at 3rd level, you are at your deadliest when you get the drop on
your enemies. You have advantage on attack rolls against any creature that
hasnt taken a turn in the combat yet. In addition, any hit you score
against a creature that is surprised is a critical hit.
"""
name = "Assassinate"
source = "Rogue (Assassin)"
class InfiltrationExpertise(Feature):
"""Starting at 9th level, you can unfailingly create false identities for
yourself. You must spend seven days and 25 gp to establish the history,
profession, and affiliations for an identity. You cant establish an
identity that belongs to someone else. For example, you might acquire
appropriate clothing, letters of introduction, and official- looking
certification to establish yourself as a member of a trading house from a
remote city so you can insinuate yourself into the company of other wealthy
merchants. Thereafter, if you adopt the new identity as a disguise, other
creatures believe you to be that person until given an obvious reason not
to.
"""
name = "Infiltration Expertise"
source = "Rogue (Assassin)"
class Imposter(Feature):
"""At 13th level, you gain the ability to unerringly mimic another persons
speech, writing, and behavior. You must spend at least three hours studying
these three components of the persons behavior, listening to speech,
examining handwriting, and observing mannerisms. Your ruse is indiscernible
to the casual observer. If a wary creature suspects something is amiss, you
have advantage on any Charisma (Deception) check you make to avoid
detection
"""
name = "Imposter"
source = "Rogue (Assassin)"
class DeathStrike(Feature):
"""Starting at 17th level, you become a master of instant death. When you
attack and hit a creature that is surprised, it must make a Constitution
saving throw (DC 8 + your Dexterity modifier + your proficiency bonus). On
a failed save, double the damage of your attack against the creature
"""
name = "Death Strike"
source = "Rogue (Assassin)"
# Arcane Trickster
class MageHandLegerdemain(Feature):
"""Starting at 3rd level, when you cast mage hand, you can make the spectral
hand invisible, and you can perform the following additional tasks with it:
-- You can stow one object the hand is holding in a container worn or
carried by another creature.
-- You can retrieve an object in a container worn or carried by another
creature.
--You can use thieves tools to pick locks and disarm traps at range
You can perform one of these tasks without being noticed by a creature if
you succeed on a Dexterity (Sleight of Hand) check contested by the
creatures Wisdom (Perception) check. In addition, you can use the bonus
action granted by your Cunning Action to control the hand.
"""
name = "Mage Hand Legerdemain"
source = "Rogue (Arcane Trickster)"
class MagicalAmbush(Feature):
"""Starting at 9th level, if you are hidden from a creature when you cast a
spell on it, the creature has disadvantage on any saving throw it makes
against the spell this turn
"""
name = "Magical Ambush"
source = "Rogue (Arcane Trickster)"
class VersatileTrickster(Feature):
"""At 13th level, you gain the ability to distract targets with your mage
hand. As a bonus action on your turn, you can designate a creature within 5
feet of the spectral hand created by the spell. Doing so gives you
advantage on attack rolls against that creature until the end of the turn.
"""
name = "Versatile Trickster"
source = "Rogue (Arcane Trickster)"
class SpellThief(Feature):
"""At 17th level, you gain the ability to magically steal the knowledge of how
to cast a spell from another spellcaster. Immediately after a creature
casts a spell that targets you or includes you in its area of effect, you
can use your reaction to force the creature to make a saving throw with its
spellcasting ability modifier. The DC equals your spell save DC.
On a failed save, you negate the spells effect against you, and you steal
the knowledge of the spell if it is at least 1st level and of a level you
can cast (it doesnt need to be a wizard spell). For the next 8 hours, you
know the spell and can cast it using your spell slots. The creature cant
cast that spell until the 8 hours have passed. Once you use this feature,
you cant use it again until you finish a long rest
"""
name = "Spell Thief"
source = "Rogue (Arcane Trickster)"
# Inquisitive
class EarForDeceit(Feature):
"""When you choose this archetype at 3rd level, you de— velop a talent for
picking out lies. Whenever you make a Wisdom (Insight) check to determine
whether a creature is lying, treat a roll of 7 or lower on the c120 as an
8.
"""
name = "Ear for Deceit"
source = "Rogue (Inquisitive)"
class EyeForDetail(Feature):
"""Starting at 3rd level, you can use a bonus action to make a Wisdom
(Perception) check to spot a hidden creature or object or to make an
Intelligence (Investigation) check to uncover or decipher clues
"""
name = "Eye for Detail"
source = "Rogue (Inquisitive)"
class InsightfulFighting(Feature):
"""At 3rd level, you gain the ability to decipher an opponent's tactics and
develop a counter to them. As a bonus action, you can make a Wisdom
(Insight) check against a creature you can see that isnt incapacitated,
contested by the targets Charisma (Deception) check. If you suc ceed, you
can use your Sneak Attack against that target even ifyou dont have
advantage on the attack roll, but not if you have disadvantage on it. This
benefit lasts for 1 minute or until you successfully use this feature
against a different target
"""
name = "Insightful Fighting"
source = "Rogue (Inquisitive)"
class SteadyEye(Feature):
"""Starting at 9th level, you have advantage on any Wisdom (Perception) or
Intelligence (Investigation) check if you move no more than half your speed
on the same turn
"""
name = "Steady Eye"
source = "Rogue (Inquisitive)"
class UnerringEye(Feature):
"""Beginning at 13th level, your senses are almost im« possible to foil. As an
action, you sense the presence of illusions, shapechangers not in their
original form, and other magic designed to deceive the senses within 30
feet ofyou, provided you arent blinded or deafened. You sense that an
effect is attempting to trick you, but you gain no insight into what is
hidden or into its true nature. 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 = "Unerring Eye"
source = "Rogue (Inquisitive)"
class EyeForWeakness(Feature):
"""At 17th level, you learn to exploit a creatures weak— nesses by carefully
studying its tactics and movement. While your Insightful Fighting feature
applies to a creature, your Sneak Attack damage against that creature
increases by 3d6
"""
name = "Eye for Weakness"
source = "Rogue (Inquisitive)"
# Mastermind
class MasterOfIntrigue(Feature):
"""When you choose this archetype at 3rd level, you gain proficiency with the
disguise kit, the forgery kit, and one gaming set Of your choice. You also
learn two languages of your choice. Additionally, you can unerringly mimic
the speech patterns and accent of a creature that you hear speak for at
least 1 minute, enabling you to pass yourself off as a native speaker of a
particular land, provided that you know the language.
"""
name = "Master of Intrigue"
source = "Rogue (Mastermind)"
class MasterOfTactics(Feature):
"""Starting at 3rd level, you can use the Help action as a bonus
action. Additionally, when you use the Help action to aid an ally in
attacking a creature, the target of that attack can be within 30 feet of
you, rather than within 5 feet of you, if the target can see or hear you
"""
name = "Master of Tactics"
source = "Rogue (Mastermind)"
class InsightfulManipulator(Feature):
"""Starting at 9th level, if you spend at least 1 minute observing or
interacting with another creature outside combat, you can learn certain
information about its ca pabilities compared to your own. The DM tells you
if the creature is your equal, superior, or inferior in regard to two of
the following characteristics of your choice:
-- Intelligence score
-- Wisdom score
-- Charisma score
--Class levels (if any)
At the DMs option, you might also realize you know a piece of the
creatures history or one of its personality traits, if it has any
"""
name = "Insightful Manipulator"
source = "Rogue (Mastermind)"
class Misdirection(Feature):
"""Beginning at 13th level, you can sometimes cause another creature to
suffer an attack meant for you. When you are targeted by an attack while a
creature within 5 feet of you is granting you cover against that attack,
you can use your reaction to have the attack target that crea ture instead
of you
"""
name = "Misdirection"
source = "Rogue (Mastermind)"
class SoulOfDeceit(Feature):
"""Starting at 17th level, your thoughts cant be read by telepathy or other
means, unless you allow it. You can present false thoughts by succeeding on
a Charisma (Deception) check contested by the mind readers Wis dom
(Insight) check. Additionally, no matter what you say, magic that would
determine if you are telling the truth indicates you are being truthful if
you so choose, and you cant be compelled to tell the truth by magic
"""
name = "Soul of Deceit"
source = "Rogue (Masterind)"
# Scout
class Skirmisher(Feature):
"""Starting at 3rd level, you are difficult to pin down during a fight. You
can move up to halfyour speed as a reaction when an enemy ends its turn
within 5 feet of you. This movement doesnt provoke opportunity attacks
"""
name = "Skirmisher"
source = "Rogue (Scout)"
class Survivalist(Feature):
"""When you choose this archetype at 3rd level, you gain proficiency in the
Nature and Survival skills if you dont already have it. Your proficiency
bonus is doubled for any ability check you make that uses either of those
pro ficiencies
"""
def __init__(self, owner=None):
super().__init__(owner=owner)
self.owner.skill_expertise += ("nature", "survival")
class SuperiorMobility(Feature):
"""At 9th level, your walking speed increases by 10 feet. If you have a
climbing or swimming speed, this increase applies to that speed as well.
"""
name = "Superior Mobility"
source = "Rogue (Scout)"
needs_implementation = True # apply to climbing and swimming
class AmbushMaster(Feature):
"""Starting at 13th level, you excel at leading ambushes and acting first in a
fight. You have advantage on initiative rolls. In addition, the first
creature you hit during the first round of a combat becomes easier for you
and others to strike; attack rolls against that target have advantage until
the start ofyour next turn
"""
name = "Ambush Master"
source = "Rogue (Scout)"
class SuddenStrike(Feature):
"""Starting at 17th level, you can strike with deadly speed. If you take the
Attack action on your turn, you can make one additional attack as a bonus
action. This attack can benefit from your Sneak Attack even if you have
already used it this turn, but you cant use your Sneak Attack against the
same target more than once in a turn
"""
name = "Sudden Strike"
source = "Rogue (Scout)"
# Swashbuckler
class FancyFootwork(Feature):
"""When you choose this archetype at 3rd level, you learn how to land a strike
and then slip away without reprisal. During your turn, if you make a melee
attack against a creature, that creature cant make opportunity attacks
against you for the rest ofyour turn
"""
name = "Fancy Footwork"
source = "Rogue (Swashbuckler)"
class RakishAudacity(Feature):
"""Starting at 3rd level, your confidence propels you into battle. You can give
yourself a bonus to your initiative rolls equal to your Charisma
modifier. You also gain an additional way to use your Sneak Attack; you
dont need advantage on the attack roll to use your Sneak Attack against a
creature if you are within 5 feet of it, no other creatures are within 5
feet of you, and you dont have disadvantage on the attack roll. All the
other rules for Sneak Attack still apply to you.
"""
name = "Rakish Audacity"
source = "Rogue (Swashbuckler)"
class Panache(Feature):
"""At 9th level, your charm becomes extraordinarily be— guiling. As an action,
you can make a Charisma (Persuasion) check contested by a creatures
Wisdom (Insight) check. The creature must be able to hear you, and the
two ofyou must share a language. If you succeed on the check and the
creature is hostile to you, it has disadvantage on attack rolls against
targets other than you and cant make opportunity attacks against targets
other than you.
This effect lasts for 1 minute, until one of your companions attacks the
target or affects it with a spell, or until you and the target are more
than 60 feet apart. If you succeed on the check and the creature isnt
hostile to you, it is charmed by you for 1 minute. While charmed, it
regards you as a friendly acquaintance. This effect ends immediately if you
or your companions do anything harmful to it
"""
name = "Panache"
source = "Rogue (Swashbuckler)"
class ElegantManeuver(Feature):
"""Starting at 13th level, you can use a bonus action on your turn to gain
advantage on the next Dexterity (Ac robatics) or Strength (Athletics)
check you make during the same turn
"""
name = "Elegant Maneuver"
source = "Rogue (Swashbuckler)"
class MasterDuelist(Feature):
"""Beginning at 17th level, your mastery of the blade lets you turn failure
into success in combat. Ifyou miss with an attack roll, you can roll it
again with advantage. Once you do so, you cant use this feature again
until you finish a short or long rest
"""
name = "Master Duelist"
source = "Rogue (Swashbuckler)"
+310
View File
@@ -1,4 +1,5 @@
from .features import Feature from .features import Feature
from .. import spells
# PHB # PHB
@@ -208,3 +209,312 @@ class DraconicResilience(Feature):
""" """
name = "Draconic Resilience" name = "Draconic Resilience"
source = "Sorceror (Draconic Bloodline)" source = "Sorceror (Draconic Bloodline)"
class DragonAncestor(Feature):
"""At 1st level, you choose one type of dragon as your ancestor. The damage
type associated with each dragon is used by features you gain later
Dragon : Damage
Black : Acid
Blue : Lightning
Brass : Fire
Bronze : Lightning
Copper : Acid
Gold : Fire
Green : Poison
Red : Fire
Silver : Cold
White : Cold
You can speak, read, and write Draconic. Additionally, whenever you make a
Charisma check when interacting with dragons, your proficiency bonus is
doubled if it applies to the check.
"""
name = "Dragon Ancestor"
source = "Sorceror (Draconic Bloodline)"
class ElementalAffinity(Feature):
"""Starting at 6th level, when you cast a spell that deals damage of the type
associated with your draconic ancestry, add your Charisma modifier to that
damage. At the same time, you can spend 1 sorcery point to gain resistance
to that damage type for 1 hour
"""
name = "Elemental Affinity"
source = "Sorceror (Draconic Bloodline)"
class DragonWings(Feature):
"""At 14th level, you gain the ability to sprout a pair of dragon wings from
your back, gaining a flying speed equal to your current speed. You can
create these wings as a bonus action on your turn. They last until you
dismiss them as a bonus action on your turn. You cant manifest your wings
while wearing armor unless the armor is made to accommodate them, and
clothing not made to accommodate your wings might be destroyed when you
manifest them
"""
name = "Dragon Wings"
source = "Sorceror (Draconic Bloodline)"
class DraconicPresence(Feature):
"""Beginning at 18th level, you can channel the dread presence of your dragon
ancestor, causing those around you to become awestruck or frightened. As an
action, you can spend 5 sorcery points to draw on this power and exude an
aura of awe or fear (your choice) to a distance of 60 feet. For 1 minute or
until you lose your concentration (as if you were casting a concentration
spell), each hostile creature that starts its turn in this aura must
succeed on a Wisdom saving throw or be charmed (if you chose awe) or
frightened (if you chose fear) until the aura ends. A creature that
succeeds on this saving throw is immune to your aura for 24 hours.
"""
name = "Draconic Presence"
source = "Sorceror (Draconic Bloodline)"
# Divine Soul
class DivineMagic(Feature):
"""Your link to the divine allows you to learn spells from the cleric
class. When your Spellcasting feature lets you learn or replace a sorcerer
cantrip or a sorcerer spell of 1st level or higher, you can choose the new
spell from the cleric spell list or the sorcerer spell list. You must
otherwise obey all the restrictions for selecting the spell, and it becomes
a sorcerer spell for you.
In addition, choose an affinity for the source of your divine power: good,
evil, law, chaos, or neutrality. You learn an additional spell based on
that affinity, as shown below. It is a sorcerer spell for you, but it
doesnt count against your number of sorcerer spells known. If you later
replace this spell, you must replace it with a Spell from the cleric spell
list
Good : Cure Wounds
Evil : Inflict Wounds
Law : Bless
Chaos : Bane
Neutrality : Protection from Evil and Good
"""
name = "Divine Magic"
source = "Sorceror (Divine Soul)"
class FavoredByTheGods(Feature):
"""Starting at 1st level, divine power guards your destiny. If you fail a
saving throw or miss with an attack roll, you can roll 2d4 and add it to
the total, possibly changing
"""
name = "Favored by the Gods"
source = "Sorceror (Divine Soul)"
class EmpoweredHealing(Feature):
"""Starting at 6th level, the divine energy coursing through you can empower
healing spells. Whenever you or an ally within 5 feet of you rolls dice to
determine the number of hit points a spell restores, you can spend 1
sorcery point to reroll any number of those dice once, provided you aren't
incapacitated. You can use this feature only once per turn.
"""
name = "Empowered Healing"
source = "Sorceror (Divine Soul)"
class OtherworldlyWings(Feature):
"""Starting at 14th level, you can use a bonus action to manifest a pair of
spectral wings from your back. While the wings are present, you have a
flying speed of 30 feet. The wings last until you're incapacitated, you
die, or you dismiss them as a bonus action. The affinity you chose for your
Divine Magic feature determines the appearance of the spectral wings: eagle
wings for good or law, bat wings for evil or chaos, and dragonfly wings for
neutrality
"""
name = "Otherworldly Wings"
source = "Sorceror (Divine Soul)"
class UnearthlyRecovery(Feature):
"""At 18th level, you gain the ability to overcome grievous injuries. As a
bonus action when you have fewer than half of your hit points remaining,
you can regain a number of hit points equal to half your hit point
maximum. Once you use this feature, you cant use it again until you finish
a long rest
"""
name = "Unearthly Recovery"
source = "Sorceror (Divine Soul)"
class EyesOfTheDark(Feature):
"""Starting at lst level, you have darkvision with a range of 120 feet. When
you reach 3rd level in this class, you learn the darkness spell, which
doesnt count against your number of sorcerer spells known. In addition,
you can cast it by spending 2 sorcery points or by expending a spell
slot. If you cast it with sorcery points, you can see through the darkness
created by the spell.
"""
name = "Eyes of the Dark"
source = "Sorceror (Shadow Magic)"
spells_known = (spells.Darkness,)
spells_prepared = (spells.Darkness,)
class StrengthOfTheGrave(Feature):
"""Starting at lst level, your existence in a twilight state between life
and death makes you difficult to defeat. When damage reduces you to 0 hit
points, you can make a Charisma saving throw (DC 5 + the damage taken). On
a success, you instead drop to 1 hit point. You cant use this feature if
you are reduced to 0 hit points by radiant damage or by a critical
hit. After the saving throw succeeds, you cant use this feature again
until you finish a long rest
"""
name = "Strength of the Grave"
source = "Sorceror (Shadow Magic)"
class HoundOfIllOmen(Feature):
"""At 6th level, you gain the ability to call forth a howling creature of
darkness to harass your foes. As a bonus action, you can spend 3 sorcery
points to magically summon a hound of ill omen to target one creature you
can see within 120 feet of you. The hound uses the dire wolfs statistics
(see the Monster Manual or appendix C in the Players Handbook), with the
following changes:
-- The hound is size Medium, not Large, and it counts as a monstrosity, not
a beast.
-- It appears with a number of temporary hit points equal to half your
sorcerer level.
-- It can move through other creatures and objects as if they were
difficult terrain. The bound takes 5 force damage if it ends its turn
inside an object.
-- At the start of its turn, the hound automatically knows its target's
location. If the target was hidden, it is no longer hidden from the hound.
The hound appears in an unoccupied space of your choice within 30 feet of
the target. Roll initiative for the hound. On its turn, it can move only
toward its target by the most direct route, and it can use its action only
to attack its target. The hound can make opportunity attacks but only
against its target. Additionally, while the hound is within 5 feet of the
target, the target has disadvantage on saving throws against any spell you
cast. The hound disappears if it is reduced to 0 hit points, if its target
is reduced to 0 hit points, or after 5 minutes.
"""
name = "Hound of Ill Omen"
source = "Sorceror (Shadow Magic)"
class ShadowWalk(Feature):
"""At 14th 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 magically teleport up to 120 feet to an unoccupied space you can see
that is also in dim light or darkness
"""
name = "Shadow Walk"
source = "Sorceror (Shadow Magic)"
class UmbralForm(Feature):
"""Starting at 18th level, you can spend 6 sorcery points as a bonus action to
magically transform yourself into a shadowy form. In this form, you have
resistance to all damage except force and radiant damage, and you can move
through other creatures and objects as if they were difficult terrain. You
take 5 force damage if you end your turn inside an object. You remain in
this form for 1 minute. It ends early if you are incapacitated, if you die,
or if you dismiss it as a bonus action.
"""
name = "Umbral Form"
source = "Sorceror (Shadow Magic)"
# Storm Sorcery
class TempestuousMagic(Feature):
"""Starting at 1st level, you can use a bonus action on your turn to cause
whirling gusts of elemental air to briefly surround you, immediately before
or after you cast a spell of 1st level or higher. Doing so allows you to
fly up to 10 feet without provoking opportunity attacks
"""
name = "Tempestuous Magic"
source = "Sorceror (Storm Sorcery)"
class HeartOfTheStorm(Feature):
"""At 6th level, you gain resistance to lightning and thunder damage. In
addition, whenever you start casting a spell of 1st level or higher that
deals lightning or thunder damage, stormy magic erupts from you. This
eruption causes creatures ofyour choice that you can see within 10 feet of
you to take lightning or thunder damage (choose each time this ability
activates) equal to half your sorcerer level.
"""
name = "Heart of the Storm"
source = "Sorceror (Storm Sorcery)"
class StormGuide(Feature):
"""At 6th level, you gain the ability to subtly control the weather around
you. Ifit is raining, you can use an action to cause the rain to stop
falling in a 20-footradius sphere centered on you. You can end this effect
as a bonus action. If it is windy, you can use a bonus action each round to
choose the direction that the wind blows in a IOO-foot-radius sphere
centered on you. The wind blows in that direction until the end ofyour next
turn. This feature doesn't alter the speed of the wind.
"""
name = "Storm Guide"
source = "Sorceror (Storm Sorcery)"
class StormsFury(Feature):
"""Starting at 14th level, when you are hit by a melee attack, you can use
your reaction to deal lightning damage to the attacker. The damage equals
your sorcerer level. The attacker must also make a Strength saving throw
against your sorcerer spell save DC. On a failed save, the attacker is
pushed in a straight line up to 20 feet away from you.
"""
name = "Storm's Fury"
source = "Sorceror (Storm Sorcery)"
class WindSoul(Feature):
"""At 18th level, you gain immunity to lightning and thunder damage. You also
gain a magical flying speed of 60 feet. As an action. you can reduce your
flying speed to 30 feet for 1 hour and choose a number of creatures within
30 feet ofyou equal to 3 + your Charisma modifier. The chosen creatures
gain a magical flying speed of 30 feet for 1 hour. Once you reduce your
flying speed in this way, you cant do so again until you finish a short or
long rest
"""
name = "Wind Soul"
source = "Sorceror (Storm Sorcery)"
+240 -9
View File
@@ -129,6 +129,67 @@ class EldritchMaster(Feature):
name = "Eldritch Master" name = "Eldritch Master"
source = "Warlock" source = "Warlock"
# The Archfey
class FeyPresence(Feature):
"""Starting at 1st level, your patron bestows upon you the ability to project
the beguiling and fearsome presence of the fey. As an action, you can cause
each creature in a 10-foot cube originating from you to make a Wisdom
saving throw against your warlock spell save DC.
The creatures that fail their saving throws are all charmed or frightened
by you (your choice) until the end of your next turn. Once you use this
feature, you cant use it again until you finish a short or long rest.
"""
name = "Fey Presence"
source = "Warlock (Archfey Patron)"
class MistyEscape(Feature):
"""Starting at 6th level, you can vanish in a puff of mist in response to
harm. When you take damage, you can use your reaction to turn invisible and
teleport up to 60 feet to an unoccupied space you can see. You remain
invisible until the start of your next turn or until you attack or cast a
spell. Once you use this feature, you can't use it again until you finish a
short or long rest
"""
name = "Misty Escape"
source = "Warlock (Archfey Patron)"
class BeguilingDefenses(Feature):
"""Beginning at 10th level, your patron teaches you how to turn the
mind-affecting magic of your enemies against them. You are immune to being
charmed, and when another creature attempts to charm you, you can use your
reaction to attempt to turn the charm back on that creature. The creature
must succeed on a Wisdom saving throw against your warlock spell save DC or
be charmed by you for 1 minute or until the creature takes any damage.
"""
name = "Beguiling Defenses"
source = "Warlock (Archfey Patron)"
class DarkDelirium(Feature):
"""Starting at 14th level, you can plunge a creature into an illusory
realm. As an action, choose a creature that you can see within 60 feet of
you. It must make a Wisdom saving throw against your warlock spell save
DC. On a failed save, it is charmed or frightened by you (your choice) for
1 minute or until your concentration is broken (as if you are concentrating
on a spell).
This effect ends early if the creature takes any damage. Until this
illusion ends, the creature thinks it is lost in a misty realm, the
appearance of which you choose. The creature can see and hear only itself,
you, and the illusion. You must finish a short or long rest before you can
use this feature again.
"""
name = "Dark Delirium"
source = "Warlock (Archfey Patron)"
# The Fiend Patron # The Fiend Patron
class DarkOnesBlessing(Feature): class DarkOnesBlessing(Feature):
@@ -189,6 +250,176 @@ class HurlThroughHell(Feature):
source = "Warlock (The Fiend Patron)" source = "Warlock (The Fiend Patron)"
# Great Old One
class AwakenedMind(Feature):
"""Starting at 1st level, your alien knowledge gives you the ability to touch
the minds of other creatures. You can communicate telepathically with any
creature you can see within 30 feet of you. You dont need to share a
language with the creature for it to understand your telepathic utterances,
but the creature must be able to understand at least one language
"""
name = "Awakened Mind"
source = "Warlock (Great Old One Patron)"
class EntropicWard(Feature):
"""At 6th level, you learn to magically ward yourself against attack and to
turn an enemys failed strike into good luck for yourself. When a creature
makes an attack roll against you, you can use your reaction to impose
disadvantage on that roll. If the attack misses you, your next attack roll
against the creature has advantage if you make it before the end of your
next turn. Once you use this feature, you cant use it again until you
finish a short or long rest.
"""
name = "Entropic Ward"
source = "Warlock (Great Old One Patron)"
class ThoughtShield(Feature):
"""Starting at 10th level, your thoughts cant be read by telepathy or other
means unless you allow it. You also have resistance to psychic damage, and
whenever a creature deals psychic damage to you, that creature takes the
same amount of damage that you do
"""
name = "Thought Shield"
source = "Warlock (Great Old One Patron)"
class CreateThrall(Feature):
"""At 14th level, you gain the ability to infect a humanoids mind with the
alien magic of your patron. You can use your action to touch an
incapacitated humanoid. That creature is then charmed by you until a remove
curse spell is cast on it, the charmed condition is removed from it, or you
use this feature again. You can communicate telepathically with the charmed
creature as long as the two of you are on the same plane of existence
"""
name = "Create Thrall"
source = "Warlock (Great Old One Patron)"
# Undying Patron
class AmongTheDead(Feature):
"""Starting at 1st level, you learn the spare the dying cantrip, which counts
as a warlock cantrip for you. You also have advantage on saving throws
against any disease. Additionally, undead have difficulty harming you. If
an undead targets you directly with an attack or a harmful spell, that
creature must make a Wisdom saving throw against your spell save DC (an
undead needn't make the save when it includes you in an area effect, such
as the explosion of fireball). On a failed save, the creature must choose a
new target or forfeit targeting someone instead of you, potentially wasting
the attack or spell. On a successful save, the creature is immune to this
effect for 24 hours. An undead is also immune to this effect for 24 hours
if you target it with an attack or a harmful spell.
"""
name = "Among the Dead"
source = "Warlock (The Undying Patron)"
spells_known = spells_prepared = (spells.SpareTheDying,)
class DefyDeath(Feature):
"""Starting at 6th level, you can give yourself vitality when you cheat death
or when you help someone else cheat it. You can regain hit points equal to
ld8 +your Constitution modifier (minimum of 1 hit point) when you succeed
on a death saving throw or when you stabilize a creature with spare the
dying. Once you use this feature, you can't use it again until you finish a
long rest
"""
name = "Defy Death"
source = "Warlock (The Undying Patron)"
class UndyingNature(Feature):
"""Beginning at 10th level , you can hold your breath indefinitely, and you
don't require food, water, or sleep, although you still require rest to
reduce exhaustion and still benefit from finishing short and long rests. In
addition, you age at a slower rate. For every 10 years that pass, your body
ages only 1 year, and you are immune to being magically aged
"""
name = "Undying Nature"
source = "Warlock (The Undying Patron)"
class IndestructibleLife(Feature):
"""When you reach 14th level, you partake of some of the true secrets of the
Undying. On your turn, you can use a bonus action to regain hit points
equal to 1d8+your warlock level. Additionally, if you put a severed body
part of yours back in place when you use this feature, the part
reattaches. Once you use this feature, you can't use it again until you
finish a short or long rest.
"""
name = "Indestructible Life"
source = "Warlock (The Undying Patron)"
# The Celestial
class HealingLight(Feature):
"""At lst level, you gain the ability to channel celestial energy to heal
wounds. You have a pool of d6s that you spend to fuel this healing. The
number of dice in the pool equals 1 + your warlock level. As a bonus
action, you can heal one creature you can see within 60 feet of you,
spending dice from the pool. The maximum number of dice you can spend at
once equals your Charisma modifier (minimum of one die). Roll the
dice you spend, add them together, and restore a number of hit points equal
to the total. Your pool regains all expended dice when you finish a long
rest
"""
_name = "Healing Light"
source = "Warlock (The Celestial Patron)"
@property
def name(self):
num = 1 + self.owner.Warlock.level
return self._name + " ({:d}d6/LR)".format(num)
class RadiantSoul(Feature):
"""Starting at 6th level, your link to the Celestial allows you to serve as a
conduit for radiant energy. You have resistance to radiant damage, and when
you cast a spell that deals radiant or fire damage, you can add your Cha-
risma modifier to one radiant or fire damage roll of that spell against one
of its targets.
"""
name = "Radiant Soul"
source = "Warlock (The Celestial Patron)"
class CelestialResilience(Feature):
"""Starting at 10th level, you gain temporary hit points whenever you finish a
short or long rest. These tempo rary hit points equal your warlock level +
your Charisma modifier. Additionally, choose up to five creatures you can
see at the end of the rest. Those creatures each gain temporary hit points
equal to half your warlock level + your Charisma modifier
"""
_name = "Celestial Resilience"
source = "Warlock (The Celestial Patron)"
class SearingVengeance(Feature):
"""Starting at 14th level, the radiant energy you channel allows you to resist
death. When you have to make a death saving throw at the start of your
turn, you can instead spring back to your feet with a burst of radiant
energy. You regain hit points equal to half your hit point maximum, and
then you stand up if you so choose. Each creature of your choice that is
within 30 feet of you takes radiant damage equal to 2d8 + your Charisma
modifier, and it is blinded until the end of the current turn. Once you use
this feature, you cant use it again until you finish a long rest.
"""
name = "Searing Vengeance"
source = "Warlock (The Celestial Patron)"
# Hexblade # Hexblade
class HexbladesCurse(Feature): class HexbladesCurse(Feature):
"""Starting at lst level, you gain the ability to place a bale— ful curse on """Starting at lst level, you gain the ability to place a bale— ful curse on
@@ -204,7 +435,7 @@ class HexbladesCurse(Feature):
a roll of 19 or 20 on the d20. a roll of 19 or 20 on the d20.
--If the cursed target dies, you regain hit points equal to your warlock --If the cursed target dies, you regain hit points equal to your warlock
level + your Charisma modifier (mini- mum of 1 hit point). level + your Charisma modifier (minimum of 1 hit point).
You cant use this feature again until you finish a short or long rest. You cant use this feature again until you finish a short or long rest.
@@ -214,7 +445,7 @@ class HexbladesCurse(Feature):
class HexWarrior(Feature): class HexWarrior(Feature):
"""At lst level, you acquire the training necessary to effec- tively arm """At lst level, you acquire the training necessary to effectively arm
yourself for battle. You gain proficiency with medium armor, shields, and yourself for battle. You gain proficiency with medium armor, shields, and
martial weapons. martial weapons.
@@ -269,7 +500,7 @@ class AccursedSpecter(Feature):
class ArmorOfHexes(Feature): class ArmorOfHexes(Feature):
"""At 10th level, your hex grows more powerful. If the tar- get cursed by your """At 10th level, your hex grows more powerful. If the target cursed by your
Hexblades Curse hits you with an attack roll, you can use your reaction to Hexblades Curse hits you with an attack roll, you can use your reaction to
roll a d6. On a 4 or higher, the attack instead misses you, regardless of roll a d6. On a 4 or higher, the attack instead misses you, regardless of
its roll. its roll.
@@ -628,7 +859,7 @@ class WitchSight(Invocation):
class AspectOfTheMoon(Invocation): class AspectOfTheMoon(Invocation):
"""You no longer need to sleep and cant be forced to sleep by any means. To """You no longer need to sleep and cant be forced to sleep by any means. To
gain the benefits of a long rest, you can spend all 8 hours doing light gain the benefits of a long rest, you can spend all 8 hours doing light
activity, such as read- ing your Book of Shadows and keeping watch. activity, such as reading your Book of Shadows and keeping watch.
**Prerequisite**: Pact of the Tome **Prerequisite**: Pact of the Tome
""" """
@@ -637,14 +868,14 @@ class AspectOfTheMoon(Invocation):
class CloakOfFiles(Invocation): class CloakOfFiles(Invocation):
"""As a bonus action, you can surround yourselfwith a magical aura that looks """As a bonus action, you can surround yourselfwith a magical aura that looks
like buzzing flies. The aura ex- tends 5 feet from you in every direction, like buzzing flies. The aura extends 5 feet from you in every direction,
but not through total cover. It lasts until youre incapacitated or you but not through total cover. It lasts until youre incapacitated or you
dismiss it as a bonus action. dismiss it as a bonus action.
The aura grants you advantage on Charisma The aura grants you advantage on Charisma
(Intimidation) checks but disadvantage on all other Charisma checks. Any (Intimidation) checks but disadvantage on all other Charisma checks. Any
other creature that starts its turn in the aura takes poison damage equal other creature that starts its turn in the aura takes poison damage equal
to your Charisma mod- ifier (minimum of O damage). to your Charisma modifier (minimum of O damage).
Once you use this invocation, you cant use it again until you finish a Once you use this invocation, you cant use it again until you finish a
short or long rest. short or long rest.
@@ -683,7 +914,7 @@ class GhostlyGaze(Invocation):
class GiftOfTheDepths(Invocation): class GiftOfTheDepths(Invocation):
"""You can breathe underwater, and you gain a swimming speed equal to your """You can breathe underwater, and you gain a swimming speed equal to your
walking speed. You can also cast water breathing once without ex- pending a walking speed. You can also cast water breathing once without expending a
spell slot. You regain the ability to do so when you finish a long rest. spell slot. You regain the ability to do so when you finish a long rest.
**Prerequisite**: 5th level **Prerequisite**: 5th level
@@ -694,7 +925,7 @@ class GiftOfTheDepths(Invocation):
class GiftOfTheEverLivingOnes(Invocation): class GiftOfTheEverLivingOnes(Invocation):
"""Whenever you regain hit points while your familiar is within 100 feet """Whenever you regain hit points while your familiar is within 100 feet
ofyou, treat any dice rolled to determine the hit points you regain as ofyou, treat any dice rolled to determine the hit points you regain as
having rolled their maxi- mum value for you. having rolled their maximum value for you.
**Prerequisite**: Pact of the Chain **Prerequisite**: Pact of the Chain
""" """
@@ -749,7 +980,7 @@ class MaddeningHex(Invocation):
Curse or Sign of Ill Omen. When you do so, you deal psychic damage to the Curse or Sign of Ill Omen. When you do so, you deal psychic damage to the
cursed target and each creature of your choice that you can see within 5 cursed target and each creature of your choice that you can see within 5
feet of it. The psychic damage equals your Charisma modifier (minimum of 1 feet of it. The psychic damage equals your Charisma modifier (minimum of 1
dam- age). To use this invocation, you must be able to see the cursed damage). To use this invocation, you must be able to see the cursed
target, and it must be within 30 feet ofyou. target, and it must be within 30 feet ofyou.
**Prerequisite**: 5th level **Prerequisite**: 5th level
+716
View File
@@ -0,0 +1,716 @@
from .features import (Feature, FeatureSelector)
from .. import spells, weapons
# PHB
class ArcaneRecovery(Feature):
"""You have learned to regain some of your magical energy by studying your
spellbook. Once per day when you finish a short rest, you can choose
expended spell slots to recover. The spell slots can have a combined level
that is equal to or less than half your wizard level (rounded up), and none
of the slots can be 6th level or higher. For example, if youre a 4th-level
wizard, you can recover up to two levels worth o f spell slots. You can
recover either a 2nd-level spell slot or two 1st-level spell slots
"""
name = "Arcane Recovery"
source = "Wizard"
class SpellMastery(Feature):
"""At 18th level, you have achieved such mastery over certain spells that you
can cast them at will. Choose a 1st-level wizard spell and a 2nd-level
wizard spell that are in your spellbook. You can cast those spells at their
lowest level without expending a spell slot when you have them prepared. If
you want to cast either spell at a higher level, you must expend a spell
slot as normal. By spending 8 hours in study, you can exchange one or both
o f the spells you chose for different spells of the same levels.
"""
name = "Spell Mastery"
source = "Wizard"
class SignatureSpells(Feature):
"""When you reach 20th level, you gain mastery over two powerful spells and
can cast them with little effort. Choose two 3rd-level wizard spells in
your spellbook as your signature spells. You always have these spells
prepared, they dont count against the number of spells you have prepared,
and you can cast each of them once at 3rd level without expending a spell
slot. When you do so, you cant do so again until you finish a short or
long rest. If you want to cast either spell at a higher level, you must
expend a spell slot as normal.
"""
name = "Signature Spells"
source = "Wizard"
# Abjuration
class AbjurationSavant(Feature):
"""Beginning when you select this school at 2nd level, the gold and time you
must spend to copy an abjuration spell into your spellbook is halved.
"""
name = "Abjuration Savant"
source = "Wizard (School of Abjuration)"
class ArcaneWard(Feature):
"""Starting at 2nd level, you can weave magic around yourself for
protection. When you cast an abjuration spell of 1st level or higher, you
can simultaneously use a strand of the spells magic to create a magical
ward on yourself that lasts until you finish a long rest. The ward has hit
points equal to twice your wizard level + your Intelligence
modifier. Whenever you take damage, the ward takes the damage instead. If
this damage reduces the ward to 0 hit points, you take any remaining
damage. While the ward has 0 hit points, it cant absorb damage, but its
magic remains. Whenever you cast an abjuration spell of 1st level or
higher, the ward regains a number of hit points equal to twice the level of
the spell. Once you create the ward, you can't create it again until you
finish a long rest
"""
name = "Arcane Ward"
source = "Wizard (School of Abjuration)"
class ProjectedWard(Feature):
"""Starting at 6th level, when a creature that you can see within 30 feet of
you takes damage, you can use your reaction to cause your Arcane Ward to
absorb that damage. If this damage reduces the ward to 0 hit points, the
warded creature takes any remaining damage
"""
name = "Projected Ward"
source = "Wizard (School of Abjuration)"
class ImprovedAbjuration(Feature):
"""Beginning at 10th level, when you cast an abjuration spell that requires
you to make an ability check as a part of casting that spell (as in
counterspell and dispel magic), you add your proficiency bonus to that
ability check.
"""
name = "Improved Abjuration"
source = "Wizard (School of Abjuration)"
class SpellResistance(Feature):
"""Starting at 14th level, you have advantage on saving throws against
spells. Furthermore, you have resistance against the damage of spells
"""
name = "Spell Resistance"
source = "Wizard (School of Abjuration)"
# Conjuration
class ConjurationSavant(Feature):
"""Beginning when you select this school at 2nd level, the gold and time you
must spend to copy a conjuration spell into your spellbook is halved.
"""
name = "Conjuration Savant"
source = "Wizard (School of Conjuration)"
class MinorIllusion(Feature):
"""Starting at 2nd level when you select this school, you can use your action
to conjure up an inanimate object in your hand or on the ground in an
unoccupied space that you can see within 10 feet of you. This object can be
no larger than 3 feet on a side and weigh no more than 10 pounds, and its
form must be that of a nonmagical object that you have seen. The object is
visibly magical, radiating dim light out to 5 feet. The object disappears
after 1 hour, when you use this feature again, or if it takes any damage.
"""
name = "Minor Illusion"
source = "Wizard (School of Conjuration)"
class BenignTransposition(Feature):
"""Starting at 6th level, you can use your action to teleport up to 30 feet to
an unoccupied space that you can see. Alternatively, you can choose a space
within range that is occupied by a Small or Medium creature. If that
creature is willing, you both teleport, swapping places. Once you use this
feature, you cant use it again until you finish a long rest or you cast a
conjuration spell of 1st level or higher.
"""
name = "Benign Transposition"
source = "Wizard (School of Conjuration)"
class FocusedConjuration(Feature):
"""Beginning at 10th level, while you are concentrating on a conjuration
spell, your concentration cant be broken as a result of taking damage
"""
name = "Focused Conjuration"
source = "Wizard (School of Conjuration)"
class DurableSummons(Feature):
"""Starting at 14th level, any creature that you summon or create with a
conjuration spell has 30 temporary hit points
"""
name = "Durable Summons"
source = "Wizard (School of Conjuration)"
# Divination
class DivinationSavant(Feature):
"""Beginning when you select this school at 2nd level, the gold and time you
must spend to copy a divination spell into your spellbook is halved. P
"""
name = "Divination Savant"
source = "Wizard (School of Divination)"
class Portent(Feature):
"""Starting at 2nd level when you choose this school, glimpses of the future
begin to press in on your awareness. When you finish a long rest, roll two
d20s and record the numbers rolled. You can replace any attack roll, saving
throw, or ability check made by you or a creature that you can see with one
of these foretelling rolls. You must choose to do so before the roll, and
you can replace a roll in this way only once per turn. Each foretelling
roll can be used only once. When you finish a long rest, you lose any
unused foretelling rolls
"""
name = "Portent"
source = "Wizard (School of Divination)"
class ExpertDivination(Feature):
"""Beginning at 6th level, casting divination spells comes so easily to you
that it expends only a fraction of your spellcasting efforts. When you cast
a divination spell of 2nd level or higher using a spell slot, you regain
one expended spell slot. The slot you regain must be of a level lower than
the spell you cast and cant be higher than 5th level.
"""
name = "Expert Divination"
source = "Wizard (School of Divination)"
class TheThirdEye(Feature):
"""Starting at 10th level, you can use your action to increase your powers o f
perception. When you do so, choose one of the following benefits, which
lasts until you are incapacitated or you take a short or long rest. You
cant use the feature again until you finish a rest.
**Darkvision**: You gain darkvision out to a range of 60 feet, as described
in chapter 8.
**Ethereal Sight**: You can see into the Ethereal Plane within 60
feet of you.
**Greater Comprehension**: You can read any language.
**See Invisibility**: You can see invisible creatures and objects within 10
feet of you that are within line of sight
"""
name = 'The Third Eye'
source = "Wizard (School of Divination)"
class GreaterPortent(Feature):
"""Starting at 14th level, the visions in your dreams intensify and paint a
more accurate picture in your mind of what is to come. You roll three d20s
for your Portent feature, rather than two
"""
name = "Greater Portent"
source = "Wizard (School of Divination)"
# Enchantment
class EnchantmentSavant(Feature):
"""Beginning when you select this school at 2nd level, the gold and time you
must spend to copy an enchantment spell into your spellbook is halved
"""
name = "Enchantment Savant"
source = "Wizard (School of Enchantment)"
class HypnoticGaze(Feature):
"""Starting at 2nd level when you choose this school, your soft words and
enchanting gaze can magically enthrall another creature. As an action,
choose one creature that you can see within 5 feet of you. If the target
can see or hear you, it must succeed on a Wisdom saving throw against your
wizard spell save DC or be charmed by you until the end of your next
turn. The charmed creatures speed drops to 0, and the creature is
incapacitated and visibly dazed.
On subsequent turns, you can use your action to maintain this effect,
extending its duration until the end of your next turn. However, the effect
ends if you move more than 5 feet away from the creature, if the creature
can neither see nor hear you, or if the creature takes damage. Once the
effect ends, or if the creature succeeds on its initial saving throw
against this effect, you cant use this feature on that creature again
until you finish a long rest
"""
name = "Hypnotic Gaze"
source = "Wizard (School of Enchantment)"
class InstinctiveGaze(Feature):
"""Beginning at 6th level, when a creature you can see within 30 feet of you
makes an attack roll against you, you can use your reaction to divert the
attack, provided that another creature is within the attacks range. The
attacker must make a W isdom saving throw against your wizard spell save
DC. On a failed save, the attacker must target the creature that is closest
to it, not including you or itself. If multiple creatures are closest, the
attacker chooses which one to target. On a successful save, you cant use
this feature on the attacker again until you finish a long rest. You must
choose to use this feature before knowing whether the attack hits or
misses. Creatures that cant be charmed are immune to this effect.
"""
name = "Instinctive Gaze"
source = "Wizard (School of Enchanment)"
class SplitEnchantment(Feature):
"""Starting at 10th level, when you cast an enchantment spell of 1st level or
higher that targets only one creature, you can have it target a second
creature.
"""
name = "Split Enchantment"
source = "Wizard (School of Enchanment)"
class AlterMemories(Feature):
"""At 14th level, you gain the ability to make a creature unaware of your
magical influence on it. When you cast an enchantment spell to charm one or
more creatures, you can alter one creatures understanding so that it
remains unaware of being charmed. Additionally, once before the spell
expires, you can use your action to try to make the chosen creature forget
some of the time it spent charmed. The creature must succeed on an
Intelligence saving throw against your wizard spell save DC or lose a
number of hours of its memories equal to 1 + your Charisma modifier
(minimum 1). You can make the creature forget less time, and the amount of
time cant exceed the duration of your enchantment spell.
"""
_name = "Alter Memories"
source = "Wizard (School of Enchanment)"
@property
def name(self):
num = 1 + max(0, self.owner.charisma.modifier)
return self._name + " ({:d} hours)".format(num)
# Evocation
class EvocationSavant(Feature):
"""Beginning when you select this school at 2nd level, the gold and time you
must spend to copy an evocation spell into your spellbook is halved.
"""
name = "Evocation Savant"
source = "Wizard (School of Evocation)"
class SculptSpells(Feature):
"""Beginning at 2nd level, you can create pockets of relative safety within the
effects of your evocation spells. When you cast an evocation spell that
affects other creatures that you can see, you can choose a number of them
equal to 1 + the spells level. The chosen creatures automatically succeed
on their saving throws against the spell, and they take no damage if they
would normally take half damage on a successful save
"""
name = "Sculpt Spells"
source = "Wizard (School of Evocation)"
class PotentCantrip(Feature):
"""Starting at 6th level, your damaging cantrips affect even creatures that
avoid the brunt of the effect. When a creature succeeds on a saving throw
against your cantrip, the creature takes half the cantrips damage (if any)
but suffers no additional effect from the cantrip
"""
name = "Potent Cantrip"
source = "Wizard (School of Evocation)"
class EmpoweredEvocation(Feature):
"""Beginning at 10th level, you can add your Intelligence modifier to the
damage roll of any wizard evocation spell you cast
"""
name = "Empowered Evocation"
source = "Wizard (School of Evocation)"
class Overchannel(Feature):
"""Starting at 14th level, you can increase the power of your simpler
spells. When you cast a wizard spell of 5th level or lower that deals
damage, you can deal maximum damage with that spell. The first time you do
so, you suffer no adverse effect. If you use this feature again before you
finish a long rest, you take 2d12 necrotic damage for each level of the
spell, immediately after you cast it. Each time you use this feature again
before finishing a long rest, the necrotic damage per spell level increases
by 1d12. This damage ignores resistance and immunity.
"""
name = "Overchannel"
source = "Wizard (School of Evocation)"
# Illusion
class IllusionSavant(Feature):
"""Beginning when you select this school at 2nd level, the gold and time you
must spend to copy an illusion spell into your spellbook is halved.
"""
name = "Illusion Savant"
source = "Wizard (School of Illusion)"
class ImprovedMinorIllusion(Feature):
"""When you choose this school at 2nd level, you learn the minor illusion
cantrip. If you already know this cantrip, you learn a different wizard
cantrip of your choice. The cantrip doesnt count against your number of
cantrips known. When you cast minor illusion, you can create both a sound
and an image with a single casting o f the spell.
"""
name = "Improved Minor Illusion"
source = "Wizard (School of Illusion)"
class MalleableIllusions(Feature):
"""Starting at 6th level, when you cast an illusion spell that has a duration
of 1 minute or longer, you can use your action to change the nature of that
illusion (using the spells normal parameters for the illusion), provided
that you can see the illusion
"""
name = "Malleable Illusions"
source = "Wizard (School of Illusion)"
class IllusorySelf(Feature):
"""Beginning at 10th level, you can create an illusory duplicate of yourself
as an instant, almost instinctual reaction to danger. When a creature makes
an attack roll against you, you can use your reaction to interpose the
illusory duplicate between the attacker and yourself. The attack
automatically m isses you, then the illusion dissipates. Once you use this
feature, you cant use it again until you finish a short or long rest.
"""
name = "Illusory Self"
source = "Wizard (School of Illusion)"
class IllusoryReality(Feature):
"""By 14th level, you have learned the secret of weaving shadow magic into
your illusions to give them a semi- reality. When you cast an illusion
spell of 1st level or higher, you can choose one inanimate, nonmagical
object that is part of the illusion and make that object real. You can do
this on your turn as a bonus action while the spell is ongoing. The object
remains real for 1 minute. For example, you can create an illusion of a
bridge over a chasm and then make it real long enough for your allies to
cross. The object cant deal damage or otherwise directly harm anyone
"""
name = "Illusory Reality"
source = "Wizard (School of Illusion)"
# Necromancy
class NecromancySavant(Feature):
"""Beginning when you select this school at 2nd level, the gold and time you
must spend to copy an Necromancy spell into your spellbook is halved.
"""
name = "Necromancy Savant"
source = "Wizard (School of Necromancy)"
class GrimHarvest(Feature):
"""At 2nd level, you gain the ability to reap life energy from creatures you
kill with your spells. Once per turn when you kill one or more creatures
with a spell of 1st level or higher, you regain hit points equal to twice
the spells level, or three times its level if the spell belongs to the
School of Necromancy. You dont gain this benefit for killing constructs or
undead """
name = "Grim Harvest"
source = "Wizard (School of Necromancy)"
class UndeadThralls(Feature):
"""At 6th level, you add the animate dead spell to your spellbook if it is not
there already. When you cast animate dead, you can target one additional
corpse or pile of bones, creating another zombie or skeleton, as
appropriate. Whenever you create an undead using a necromancy spell, it has
additional benefits:
-- The creatures hit point maximum is increased by an amount equal to your
wizard level.
-- The creature adds your proficiency bonus to its weapon damage rolls
"""
name = "Undead Thralls"
source = "Wizard (School of Necromancy)"
spells_known = (spells.AnimateDead,)
class InuredToUndeath(Feature):
"""Beginning at 10th level, you have resistance to necrotic damage, and your
hit point maximum can't be reduced. You have spent so much time dealing
with undead and the forces that animate them that you have become inured to
some of their worst effects
"""
name = "Inured to Undeath"
source = "Wizard (School of Necromancy)"
class CommandUndead(Feature):
"""Starting at 14th level, you can use magic to bring undead under your
control, even those created by other wizards. As an action, you can choose
one undead that you can see within 60 feet of you. That creature must make
a Charisma saving throw against your wizard spell save DC. If it succeeds,
you cant use this feature on it again. If it fails, it becomes friendly to
you and obeys your commands until you use this feature again. Intelligent
undead are harder to control in this way. If the target has an
Intelligence of 8 or higher, it has advantage on the saving throw. If it
fails the saving throw and has an Intelligence of 12 or higher, it can
repeat the saving throw at the end of every hour until it succeeds and
breaks free
"""
name = "Command Undead"
source = "Wizard (School of Necromancy)"
# Transmutation
class TransmutationSavant(Feature):
"""Beginning when you select this school at 2nd level, the gold and time you
must spend to copy an Transmutation spell into your spellbook is halved.
"""
name = "Transmutation Savant"
source = "Wizard (School of Transmutation)"
class MinorAlchemy(Feature):
"""Starting at 2nd level when you select this school, you can temporarily alter
the physical properties of one nonmagical object, changing it from one
substance into another. You perform a special alchemical procedure on one
object composed entirely of wood, stone (but not a gemstone), iron, copper,
or silver, transforming it into a different one of those materials. For
each 10 minutes you spend performing the procedure, you can transform up to
1 cubic foot of material. After 1 hour, or until you lose your
concentration (as if you were concentrating on a spell), the material
reverts to its original substance
"""
name = "Minor Alchemy"
source = "Wizard (School of Transmutation)"
class TransmutersStone(Feature):
"""Starting at 6th level, you can spend 8 hours creating a transmuters stone
that stores transmutation magic. You can benefit from the stone yourself or
give it to another creature. A creature gains a benefit of your choice as
long as the stone is in the creatures possession. When you create the
stone, choose the benefit from the following options:
-- Darkvision out to a range of 60 feet, as described in chapter 8
-- An increase to speed of 10 feet while the creature is unencumbered
Proficiency in Constitution saving throws
-- Resistance to acid, cold, fire, lightning, or thunder damage (your
choice whenever you choose this benefit)
Each time you cast a transmutation spell of 1st level or higher, you can
change the effect of your stone if the stone is on your person. If you
create a new transmuters stone, the previous one ceases to function
"""
name = "Transmuter's Stone"
source = "Wizard (School of Transmutation)"
class Shapechanger(Feature):
"""At 10th level, you add the polymorph spell to your spellbook, if it is not
there already. You can cast polymorph without expending a spell slot. When
you do so, you can target only yourself and transform into a beast whose
challenge rating is 1 or lower. Once you cast polymorph in this way, you
cant do so again until you finish a short or long rest, though you can
still cast it normally using an available spell slot
"""
name = "Shapechanger"
source = "Wizard (School of Transmutation)"
spells_known = spells_prepared = (spells.Polymorph,)
class MasterTransmuter(Feature):
"""Starting at 14th level, you can use your action to consume the reserve of
transmutation magic stored within your transmuters stone in a single
burst. When you do so, choose one of the following effects. Your
transmuters stone is destroyed and cant be remade until you finish a long
rest.
**Major Transformation**: You can transmute one nonmagical objectno
larger than a 5-foot cubeinto another nonmagical object of similar size
and mass and of equal or lesser value. You must spend 10 minutes handling
the object to transform it.
**Panacea**: You remove all curses, diseases, and poisons affecting a creature
that you touch with the transmuters stone. The creature also regains all
its hit points.
**Restore Life**: You cast the raise dead spell on a creature you touch
with the transmuters stone, without expending a spell slot or needing to
have the spell in your spellbook.
**Restore Youth**: You touch the transmuters stone to a willing creature,
and that creatures apparent age is reduced by 3d10 years, to a minimum of
13 years. This effect doesnt extend the creatures lifespan
"""
name = "Master Transmuter"
source = "Wizard (School of Transmutation)"
# Bladesinging
class Bladesong(Feature):
"""Starting at 2nd level, you can invoke a secret elven magic called the
Bladesong, provided that you aren't wearing medium or heavy armor or using
a shield. It graces you with supernatural speed, agility, and focus. You
can use a bonus action to start the Bladesong, which lasts for 1 minute. It
ends early if you are incapac- itated, if you don medium or heavy armor or
a shield, or if you use two hands to make an attack with a weapon. You can
also dismiss the Bladesong at any time you choose (no action required).
While your Bladesong is active, you gain the follow- ing benefits:
-- You gain a bonus to your AC equal to your Intelligence modifier (minimum
of +1).
-- Your walking speed increases by 10 feet.
-- You have advantage on Dexterity (Acrobatics) checks.
-- You gain a bonus to any Constitution saving throw you make to maintain
your concentration on a spell. The bonus equals your Intelligence modifier
(minimum of +l).
You can use this feature twice. You regain all expended uses of it when
you finish a short or long rest.
"""
name = "Bladesong (2x/SR)"
source = "Wizard (School of Bladesinging)"
class ExtraAttackBladesinging(Feature):
"""Starting at 6th level, you can attack twice, instead of once, whenever you
take the Attack action on your turn.
"""
name = "Extra Attack (2x)"
source = "Wizard (School of Bladesinging)"
class SongOfDefense(Feature):
"""Beginning at 10th level, you can direct your magic to ab- sorb damage
while your Bladesong is active. When you take damage, you can use your
reaction to expend one spell slot and reduce that damage to you by an
amount equal to five times the spell slot's level.
"""
name = "Song of Defense"
source = "Wizard (School of Bladesinging)"
class SongOfVictory(Feature):
"""Starting at 14th level, you add your Intelligence modifier (minimum of +1)
to the damage of your melee weapon attacks while you r Bladesong is active
"""
name = "Song of Victory"
source = "Wizard (School of Bladesinging)"
# War Magic
class ArcaneDeflection(Feature):
"""At 2nd level, you have learned to weave your magic to fortify yourself
against harm. When you are hit by an at- tack or you fail a saving throw,
you can use your reaction to gain a +2 bonus to your AC against that attack
or a +4 bonus to that saving throw. When you use this feature, you can't
cast spells other than cantrips until the end of your next turn.
"""
name = "Arcane Deflection"
source = "Wizard (School of War Magic)"
class TacticalWit(Feature):
"""Starting at 2nd level, your keen ability to assess tactical situations
allows you to act quickly in battle. You can give yourself a bonus to your
initiative rolls equal to your Intelligence modifier (included in stats on
character sheet).
"""
name = "Tactical Wit"
source = "Wizard (School of War Magic)"
class PowerSurge(Feature):
"""Starting at 6th level, you can store magical energy within yourself to
later empower your damaging spells. In its stored form, this energy is
called a power surge. You can store a maximum number of power surges equal
to your Intelligence modifier (minimum of one). Whenever you finish a long
rest, your number of power surges reset-s to one. Whenever you successfully
end a spell with dispel magic or counterspel], you gain one power surge, as
you steal magic from the spell you foiled. If you end a short rest with no
power surges, you gain one power surge
Once per turn when you deal damage to a creature or object with a wizard
spell, you can spend one power surge to deal extra force damage to that
target. The ex- tra damage equals half your wizard level.
"""
name = "Power Surge"
source = "Wizard (School of War Magic)"
class DurableMagic(Feature):
"""Beginning at 10th level, the magic you channel helps ward off harm. While
you maintain concentration on a spell, you have a +2 bonus to AC and all
saving throws.
"""
name = "Durable Magic"
source = "Wizard (School of War Magic)"
class DeflectingShroud(Feature):
"""At 14th level, your Arcane Deflection becomes infused with deadly
magic. When you use your Arcane Deflec- tion feature, you can cause magical
energy to are from you. Up to three creatures ofyour choice that you can
see within 60 feet of you each take force damage equal to half your wizard
level.
"""
name = "Deflecting Shroud"
source = "Wizard (School of War Magic)"
+134
View File
@@ -1813,5 +1813,139 @@ class GaseousForm(Spell):
ritual = False ritual = False
magic_school = "Transmutation" magic_school = "Transmutation"
classes = ('Sorcerer', 'Warlock', 'Wizard') classes = ('Sorcerer', 'Warlock', 'Wizard')
class RopeTrick(Spell):
"""You touch a length of rope that is up to 60 feet long. One end of the rope then
rises into the air until the whole rope hangs perpendicular to the ground. At
the upper end of the rope, an invisible entrance opens to an extradimensional
space that lasts until the spell ends.
The extradimensional space can be
reached by climbing to the top of the rope. The space can hold as many as eight
Medium or smaller creatures. The rope can be pulled into the space, making the
rope disappear from view outside the space.
Attacks and spells cant cross
through the entrance into or out of the extradimensional space, but those inside
can see out of it as if through a 3-foot-by-5-foot window centered on the rope.
Anything inside the extradimensional space drops out when the spell ends.
"""
name = "Rope Trick"
level = 2
casting_time = "1 action"
casting_range = "Touch"
components = ('V', 's', 'm')
materials = """Powdered corn extract and a twisted loop of parchment"""
duration = "1 hour"
ritual = False
magic_school = "Transmutation"
classes = ('Wizard',)
class Seeming(Spell):
"""This spell allows you to change the appearance of any number of creatures that
you can see within range.
You give each target you choose a new, illusory
appearance. An unwilling target can make a Charisma saving throw, and if it
succeeds, it is unaffected by this spell.
The spell disguises physicial
appearances as well as clothing, armor, weapons, and equipment. You can make
each creature seem 1 foot shorter or taller and appear thin, fat, or inbetween.
You cant change a targets body type, so you must choose a form that has the
same basic arrangement of limbs. Otherwise, the extent of the illusion is up to
you. The spell lasts for the duration, unless you use your action to dismiss it
sooner.
The changes wrought by this spell fail to hold up to physical
inspections. For example, if you use this spell to add a hat to a creatures
outfitm objects pass through the hat, and anyone who touches it would feel
nothing or would feel the creatures head and hair. If you use this spell to
appear thinner then you are, the hand of someone who reaches out to touch you
would bump into you while it was seemingly still in midair.
A creature can use
its action to inspect a target and make an Intelligence (Investigation) check
against your spell save DC. If it succeeds, it becomes aware that the target is
disguised.
"""
name = "Seeming"
level = 5
casting_time = "1 action"
casting_range = "30 feet"
components = ('V', 's')
materials = """"""
duration = "8 hours"
ritual = False
magic_school = "Illusion"
classes = ('Bard', 'Sorcerer', 'Wizard')
class GlyphOfWarding(Spell):
"""When you cast this spell, you inscribe a glyph that harms other creatures,
either upon a surface (such as a table or a section of floor or wall) or within
an object that can be closed (such as a book, a scroll, or a treasure chest) to
conceal the glyph.
If you choose a surface, the glyph can cover an area of the
surface no larger than 10 feet in diameter. If you choose an object, that object
must remain in its place; if the object is moved more than 10 feet from where
you cast this spell, the glyph is broken, and the spell ends without being
triggered.
The glyph is nearly invisible and requires a successful Intelligence
(Investigation) check against your spell save DC to be found.
You decide what
triggers the glyph when you cast the spell. For glyphs inscribed on a surface,
the most typical triggers include touching or standing on the glyph, removing
another object covering the glyph, approaching within a certain distance of the
glyph, or manipulating the object on which the glyph is inscribed. For glyphs
inscribed within an object, the most common triggers include opening that
object, approaching within a certain distance of the object, or seeing or
reading the glyph. Once a glyph is triggered, this spell ends.
You can further
refine the trigger so the spell activates only under certain circumstances or
according to physical characteristics (such as height or weight), creature kind
(for example, the ward could be set to affect aberrations or drow), or
alignment. You can also set conditions for creatures that dont trigger the
glyph, such as those who say a certain password.
When you inscribe the glyph,
choose explosive runes or a spell glyph.
Explosive Runes
When triggered, the
glyph erupts with magical energy in a 20-foot-radius sphere centered on the
glyph. The sphere spreads around corners. Each creature in the area must make a
Dexterity saving throw. A creature takes 5d8 acid, cold, fire, lightning, or
thunder damage on a failed saving throw (your choice when you create the glyph),
or half as much damage on a successful one.
Spell Glyph
You can store a
prepared spell of 3rd level or lower in the glyph by casting it as part of
creating the glyph. The spell must target a single creature or an area. The
spell being stored has no immediate effect when cast in this way. When the glyph
is triggered, the stored spell is cast. If the spell has a target, it targets
the creature that triggered the glyph. If the spell affects an area, the area is
centered on that creature. If the spell summons hostile creatures or creates
harmful objects or traps, they appear as close as possible to the intruder and
attack it. If the spell requires concentration, it lasts until the end of its
full duration.
At Higher Levels:
"""
name = "Glyph Of Warding"
level = 3
casting_time = "1 hour"
casting_range = "Touch"
components = ('V', 's', 'm')
materials = """Incense and powdered diamond worth at least 200 gp, which the spell consumes"""
duration = "Until dispelled or triggered"
ritual = False
magic_school = "Abjuration"
classes = ('you', 'cast', 'this', 'spell', 'using', 'a', 'spell', 'slot', 'of', '4th', 'level', 'or', 'higher', 'the', 'damage', 'of', 'an', 'explosive', 'runes', 'glyph', 'increases', 'by', '1d8', 'for', 'each', 'slot', 'level', 'above', '3rd.', 'If', 'you', 'create', 'a', 'spell', 'glyph', 'you', 'can', 'store', 'any', 'spell', 'of', 'up', 'to', 'the', 'same', 'level', 'as', 'the', 'slot', 'you', 'use', 'for', 'the', 'glyph', 'of')
+25 -1
View File
@@ -4,7 +4,9 @@ from .armor import NoArmor, NoShield, HeavyArmor
from .features import (UnarmoredDefenseMonk, UnarmoredDefenseBarbarian, from .features import (UnarmoredDefenseMonk, UnarmoredDefenseBarbarian,
DraconicResilience, Defense, FastMovement, DraconicResilience, Defense, FastMovement,
UnarmoredMovement, GiftOfTheDepths, RemarkableAthelete, UnarmoredMovement, GiftOfTheDepths, RemarkableAthelete,
SeaSoul, JackOfAllTrades, SoulOfTheForge) SeaSoul, JackOfAllTrades, SoulOfTheForge, QuickDraw,
NaturalExplorerRevised, FeralInstinct, DreadAmbusher,
SuperiorMobility, AmbushMaster, RakishAudacity)
from math import ceil from math import ceil
@@ -162,6 +164,8 @@ class Speed():
if char.has_feature(FastMovement): if char.has_feature(FastMovement):
if not isinstance(char.armor, HeavyArmor): if not isinstance(char.armor, HeavyArmor):
speed += 10 speed += 10
if char.has_feature(SuperiorMobility):
speed += 10
if isinstance(char.armor, NoArmor) or (char.armor is None): if isinstance(char.armor, NoArmor) or (char.armor is None):
for f in char.features: for f in char.features:
if isinstance(f, UnarmoredMovement): if isinstance(f, UnarmoredMovement):
@@ -173,3 +177,23 @@ class Speed():
if 'swim' not in other_speed: if 'swim' not in other_speed:
other_speed += ' (30 swim)' other_speed += ' (30 swim)'
return '{:d}{:s}'.format(speed, other_speed) return '{:d}{:s}'.format(speed, other_speed)
class Initiative():
"""A character's initiative"""
def __get__(self, char, Character):
ini = char.dexterity.modifier
if char.has_feature(QuickDraw):
ini += char.proficiency_bonus
if char.has_feature(DreadAmbusher):
ini += char.wisdom.modifier
if char.has_feature(RakishAudacity):
ini += char.charisma.modifier
ini = '{:+d}'.format(ini)
has_advantage = (char.has_feature(NaturalExplorerRevised) or
char.has_feature(FeralInstinct) or
char.has_feature(AmbushMaster))
if has_advantage:
ini += '(A)'
return ini