diff --git a/dungeonsheets/ToDoNotes.txt b/dungeonsheets/ToDoNotes.txt index 536a2b9..2a8707f 100644 --- a/dungeonsheets/ToDoNotes.txt +++ b/dungeonsheets/ToDoNotes.txt @@ -1,27 +1,6 @@ -Add multiclass proficiencies to classes -Add Warlock Incantations Add Warlock multiclass spell slots - Add disadvantage on STEALTH with armor -Add race / class AC bonuses - -Add features -**hard** integrate features automatically into math -Add Inspiration points - - -Weird features will have to: ---Update Speed (Fast Movement / Unarmored Movement) ---Access current level and class levels ---Give advantage to initiative --Add to proficiencies (Jack of All Trades, Remarkable Athelete) ---Double proficiencies (Expertiese) ---Add extra skill proficiencies (College of Lore, Blessings of Knowledge...optional) ---Add extra proficiencies ---Add extra spells known/prepared ---Select among multiple options ---Select many options (maneuvers) ---Update damage / bonus to weapons (Martial Arts) --Add to HP Max (Draconic Bloodline, Dwarven Toughness) diff --git a/dungeonsheets/character.py b/dungeonsheets/character.py index faf5009..3d7e653 100644 --- a/dungeonsheets/character.py +++ b/dungeonsheets/character.py @@ -512,7 +512,9 @@ class Character(): if self.has_feature(features.QuickDraw): ini += self.proficiency_bonus ini = '{:+d}'.format(ini) - if self.has_feature(features.NaturalExplorerRevised): + has_advantage = (self.has_feature(features.NaturalExplorerRevised) or + self.has_feature(features.FeralInstinct)) + if has_advantage: ini += '(A)' return ini diff --git a/dungeonsheets/classes/barbarian.py b/dungeonsheets/classes/barbarian.py index a306498..fc8314d 100644 --- a/dungeonsheets/classes/barbarian.py +++ b/dungeonsheets/classes/barbarian.py @@ -12,7 +12,11 @@ class BerserkerPath(SubClass): """ name = "Path of the Berserker" - class_features_by_level = defaultdict(list) + features_by_level = defaultdict(list) + features_by_level[3] = [features.Frenzy] + features_by_level[6] = [features.MindlessRage] + features_by_level[10] = [features.IntimidatingPresence] + features_by_level[14] = [features.Retaliation] class TotemWarriorPath(SubClass): @@ -27,8 +31,12 @@ class TotemWarriorPath(SubClass): """ name = "Path of the Totem Warrior" - class_features_by_level = defaultdict(list) - + features_by_level = defaultdict(list) + features_by_level[3] = [features.SpiritSeeker, features.TotemSpirit] + features_by_level[6] = [features.BeastAspect] + features_by_level[10] = [features.SpiritWalker] + features_by_level[14] = [features.TotemicAttunement] + # SCAG class BattleragerPath(SubClass): @@ -40,7 +48,11 @@ class BattleragerPath(SubClass): """ name = "Path of the Battlerager" - class_features_by_level = defaultdict(list) + features_by_level = defaultdict(list) + features_by_level[3] = [features.BattleragerArmor] + features_by_level[6] = [features.RecklessAbandon] + features_by_level[10] = [features.BattleragerCharge] + features_by_level[14] = [features.SpikedRetribution] # XGTE @@ -60,7 +72,11 @@ class AncestralGuardianPath(SubClass): """ name = "Path of the Ancestral Guardian" - class_features_by_level = defaultdict(list) + features_by_level = defaultdict(list) + features_by_level[3] = [features.AncestralProtectors] + features_by_level[6] = [features.SpiritShield] + features_by_level[10] = [features.ConsultTheSpirits] + features_by_level[14] = [features.VengefulAncestors] class StormHeraldPath(SubClass): @@ -77,7 +93,11 @@ class StormHeraldPath(SubClass): """ name = "Path of the Storm Herald" - class_features_by_level = defaultdict(list) + features_by_level = defaultdict(list) + features_by_level[3] = [features.StormAura] + features_by_level[6] = [features.StormSoul] + features_by_level[10] = [features.ShieldingStorm] + features_by_level[14] = [features.RagingStorm] class ZealotPath(SubClass): @@ -93,7 +113,11 @@ class ZealotPath(SubClass): """ name = "Path of the Zealot" - class_features_by_level = defaultdict(list) + features_by_level = defaultdict(list) + features_by_level[3] = [features.DivineFury, features.WarriorOfTheGods] + features_by_level[6] = [features.FanaticalFocus] + features_by_level[10] = [features.ZealousPresence] + features_by_level[14] = [features.RageBeyondDeath] class Barbarian(CharClass): @@ -113,4 +137,13 @@ class Barbarian(CharClass): subclasses_available = (BerserkerPath, TotemWarriorPath, BattleragerPath, AncestralGuardianPath, StormHeraldPath, ZealotPath) features_by_level = defaultdict(list) - + features_by_level[1] = [features.Rage, features.UnarmoredDefenseBarbarian] + features_by_level[2] = [features.RecklessAttack, features.DangerSense] + features_by_level[5] = [features.ExtraAttackBarbarian, + features.FastMovement] + features_by_level[7] = [features.FeralInstinct] + features_by_level[9] = [features.BrutalCritical] + features_by_level[11] = [features.RelentlessRage] + features_by_level[15] = [features.PersistentRage] + features_by_level[18] = [features.IndomitableMight] + features_by_level[20] = [features.PrimalChampion] diff --git a/dungeonsheets/features/barbarian.py b/dungeonsheets/features/barbarian.py index 64dd29d..6821bfc 100644 --- a/dungeonsheets/features/barbarian.py +++ b/dungeonsheets/features/barbarian.py @@ -1,7 +1,58 @@ -from .features import Feature +from .features import Feature, FeatureSelector from .. import (weapons, armor) +# PHB +class Rage(Feature): + """In battle, you fight with primal ferocity. On your turn, you can enter a + rage as a bonus action. While raging, you gain the following benefits if + you aren’t wearing heavy armor: + + --You have advantage on Strength checks and + Strength saving throws. + + --When you make a melee weapon attack using + Strength, you gain a bonus to the damage roll that increases as you gain + levels as a barbarian, as shown in the Rage Damage column of the Barbarian + table. + + --You have resistance to bludgeoning, piercing, and slashing + damage. + + If you are able to cast spells, you can’t cast them or concentrate on them + while raging. Your rage lasts for 1 minute. It ends early if you are + knocked unconscious or if your turn ends and you haven’t attacked a hostile + creature since your last turn or taken damage since then. You can also end + your rage on your turn as a bonus action. Once you have raged the number of + times shown for your barbarian level in the Rages column of the Barbarian + table, you must finish a long rest before you can rage again + + """ + _name = "Rage" + source = "Barbarian" + + @property + def name(self): + level = self.owner.Barbarian.level + num = 2 + if level >= 3: + num = 3 + if level >= 6: + num = 4 + if level >= 12: + num = 5 + if level >= 17: + num = 6 + if level >= 20: + num = 100 + damage = '+2' + if level >= 9: + damage = "+3" + if level >= 16: + damage = "+4" + return self._name + " ({:s}, {:d}x/LR)".format(damage, num) + + class UnarmoredDefenseBarbarian(Feature): """While you are not wearing any armor, your Armor Class equals 10 + your Dexterity modifier + your Constitution modifier. You can use a shield and @@ -14,6 +65,39 @@ class UnarmoredDefenseBarbarian(Feature): source = 'Barbarian' +class RecklessAttack(Feature): + """Starting at 2nd level, you can throw aside all concern for defense to + attack with fierce desperation. When you make your first attack on your + turn, you can decide to attack recklessly. Doing so gives you advantage on + melee weapon attack rolls using Strength during this turn, but attack rolls + against you have advantage until your next turn + + """ + name = "Reckless Attack" + source = "Barbarian" + + +class DangerSense(Feature): + """At 2nd level, you gain an uncanny sense of when things nearby aren’t as + they should be, giving you an edge when you dodge away from danger. You + have advantage on Dexterity saving throws against effects that you can see, + such as traps and spells. To gain this benefit, you can’t be blinded, + deafened, or incapacitated. + + """ + name = "Danger Sense" + source = "Barbarian" + + +class ExtraAttackBarbarian(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 = "Barbarian" + + class FastMovement(Feature): """Starting at 5th level, your speed increases by 10 feet while you aren’t wearing heavy armor. @@ -21,3 +105,763 @@ class FastMovement(Feature): """ name = "Fast Movement" source = "Barbarian" + + +class FeralInstinct(Feature): + """By 7th level, your instincts are so honed that you have advantage on + initiative rolls. Additionally, if you are surprised at the beginning of + combat and aren’t incapacitated, you can act normally on your first turn, + but only if you enter your rage before doing anything else on that turn. + + """ + name = "Feral Instinct" + source = "Barbarian" + + +class BrutalCritical(Feature): + """Beginning at 9th level, you can roll one additional weapon damage die when + determining the extra damage for a critical hit with a melee attack. This + increases to two additional dice at 13th level and three additional dice at + 17th level. + + """ + name = "Brutal Critical" + source = "Barbarian" + + +class RelentlessRage(Feature): + """Starting at 11th level, your rage can keep you fighting despite grievous + wounds. If you drop to 0 hit points while you’re raging and don’t die + outright, you can make a DC 10 Constitution saving throw. If you succeed, + you drop to 1 hit point instead. Each time you use this feature after the + first, the DC increases by 5. When you finish a short or long rest, the DC + resets to 10. + + """ + name = "Relentless Rage" + source = "Barbarian" + + +class PersistentRage(Feature): + """Beginning at 15th level, your rage is so fierce that it ends early only if + you fall unconscious or if you choose to end it. + + """ + name = "Persistent Rage" + source = "Barbarian" + + +class IndomitableMight(Feature): + """Beginning at 18th level, if your total for a Strength check is less than + your Strength score, you can use that score in place of the total. + + """ + name = "Indomitable Might" + source = "Barbarian" + + +class PrimalChampion(Feature): + """At 20th level, you embody the power of the wilds. Your Strength and + Constitution scores increase by 4. Your maximum for those scores is now 24. + + """ + name = "Primal Champion" + source = "Barbarian" + + +# Berserker +class Frenzy(Feature): + """Starting when you choose this path at 3rd level, you can go into a frenzy + when you rage. If you do so, for the duration of your rage you can make a + single melee weapon attack as a bonus action on each of your turns after + this one. When your rage ends, you suffer one level o f exhaustion (as + described in appendix A) + + """ + name = "Frenzy" + source = "Barbarian (Berserker)" + + +class MindlessRage(Feature): + """Beginning at 6th level, you can’t be charmed or frightened while raging. If + you are charmed or frightened when you enter your rage, the effect is + suspended for the duration of the rage. + + """ + name = "Mindless Rage" + source = "Barbarian (Berserker)" + + +class IntimidatingPresence(Feature): + """Beginning at 10th level, you can use your action to frighten someone with + your menacing presence. When you do so, choose one creature that you can + see within 30 feet of you. If the creature can see or hear you, it must + succeed on a Wisdom saving throw (DC equal to 8 + your proficiency bonus + + your Charisma modifier) or be frightened of you until the end of your next + turn. On subsequent turns, you can use your action to extend the duration + of this effect on the frightened creature until the end of your next + turn. This effect ends if the creature ends its turn out of line of sight + or more than 60 feet away from you. If the creature succeeds on its saving + throw, you can't use this feature on that creature again for 24 hours. + + """ + name = "Intimidating Presence" + source = "Barbarian (Berserker)" + + +class Retaliation(Feature): + """Starting at 14th level, when you take damage from a creature that is within + 5 feet of you. you can use your reaction to make a melee weapon attack + against that creature. + + """ + name = "Retaliation" + source = "Barbarian (Berserker)" + + +# Totem Warrior +class SpiritSeeker(Feature): + """Yours is a path that seeks attunement with the natural world, giving you a + kinship with beasts. At 3rd level when you adopt this path, you gain the + ability to cast the beast sense and speak with animals spells, but only as + rituals, as described in chapter 10 of PHB. + + """ + name = "Spirit Seeker" + source = "Barbarian (Totem Warrior)" + + +class BearSpirit(Feature): + """While raging, you have resistance to all damage except psychic damage. The + spirit of the bear makes you tough enough to stand up to any punishment. + + """ + name = "Totem Spirit (Bear)" + source = "Barbarian (Totem Warrior)" + + +class EagleSpirit(Feature): + """While you're raging and aren’t wearing heavy armor, other creatures have + disadvantage on opportunity attack rolls against you, and you can use the + Dash action as a bonus action on your turn. The spirit of the eagle makes + you into a predator who can weave through the fray with ease. + + """ + name = "Totem Spirit (Eagle)" + source = "Barbarian (Totem Warrior)" + + +class WolfSpirit(Feature): + """While you're raging, your friends have advantage on melee attack rolls + against any creature within 5 feet of you that is hostile to you. The + spirit of the wolf makes you a leader of hunters + + """ + name = "Totem Spirit (Wolf)" + source = "Barbarian (Totem Warrior)" + + +class ElkSpirit(Feature): + """While you're raging and aren't wearing heavy armor, your walking speed + increases by 15 feet. The spirit of the elk makes you extraordinarily swift + + """ + name = "Totem Spirit (Elk)" + source = "Barbarian (Totem Warrior)" + + +class TigerSpirit(Feature): + """While raging, you can add 10 feet to your long jump distance and 3 feet to + your high jump distance. The spirit of the tiger empowers your leaps + + """ + name = "Totem Spirit (Tiger)" + source = "Barbarian (Totem Warrior)" + + +class TotemSpirit(FeatureSelector): + """ + Select a Totem Spirit from one of the following under feature_choices in + your .py file: + + bear spirit + + eagle spirit + + wolf spirit + + elk spirit + + tiger spirit + + """ + options = {'bear spirit': BearSpirit, + 'eagle spirit': EagleSpirit, + 'wolf spirit': WolfSpirit, + 'elk spirit': ElkSpirit, + 'tiger spirit': TigerSpirit} + name = "Totem Spirit (Select One)" + source = "Barbarian (Totem Warrior)" + + +class BearAspect(FeatureSelector): + """You gain the might of a bear. Your carrying capacity (including maximum + load and maximum lift) is doubled, and you have advantage on Strength + checks made to push, pull, lift, or break objects. + + """ + name = "Aspect of the Beast (Bear)" + source = "Barbarian (Totem Warrior)" + + +class EagleAspect(FeatureSelector): + """You gain the eyesight of an eagle. You can see up to 1 mile away with no + difficulty, able to discern even fine details as though looking at + something no more than 100 feet away from you. Additionally, dim light + doesn't impose disadvantage on your Wisdom (Perception) checks. + + """ + name = "Aspect of the Beast (Eagle)" + source = "Barbarian (Totem Warrior)" + + +class WolfAspect(FeatureSelector): + """You gain the hunting sensibilities of a wolf. You can track other creatures + while traveling at a fast pace, and you can move stealthily while traveling + at a normal pace (see chapter 8 for rules on travel pace). + + """ + name = "Aspect of the Beast (Wolf)" + source = "Barbarian (Totem Warrior)" + + +class ElkAspect(FeatureSelector): + """Whether mounted or on foot , your travel pace is doubled, as is the travel + pace of up to ten companions while they're within 60 feet of you and you're + not inca- pacitated (see chapter 8 in the Player's Handbook for more + information about travel pace). The elk spirit helps you roam far and fast + + """ + name = "Aspect of the Beast (Elk)" + source = "Barbarian (Totem Warrior)" + + +class TigerAspect(FeatureSelector): + """You gain proficiency in two skills from the fol- lowing list: Athletics, + Acrobatics, Stealth, and Survival. The cat spirit hones your survival + instincts + + """ + name = "Aspect of the Beast (Tiger)" + source = "Barbarian (Totem Warrior)" + + +class BeastAspect(FeatureSelector): + """Select an Aspect of the Beast from one of the following under + feature_choices in your .py file: + + bear aspect + + eagle aspect + + wolf aspect + + elk aspect + + tiger aspect + + """ + options = {'bear aspect': BearAspect, + 'eagle aspect': EagleAspect, + 'wolf aspect': WolfAspect, + 'elk aspect': ElkAspect, + 'tiger aspect': TigerAspect} + name = "Aspect of the Beast (Select One)" + source = "Barbarian (Totem Warrior)" + + +class SpiritWalker(Feature): + """At 10th level, you can cast the commune with nature spell, but only as a + ritual. When you do so, a spiritual version of one of the animals you chose + for Totem Spirit or Aspect of the Beast appears to you to convey the + information you seek. + + """ + name = "Spirit Walker" + source = "Barbarian (Totem Warrior)" + + +class BearAttunement(Feature): + """While you’re raging, any creature within 5 feet o f you that’s hostile to + you has disadvantage on attack rolls against targets other than you or + another character with this feature. An enemy is immune to this effect if + it can’t see or hear you or if it can’t be frightened. + + """ + name = "Totemic Attunement (Bear)" + source = "Barbarian (Totem Warrior)" + + +class EagleAttunement(Feature): + """While raging, you have a flying speed equal to your current walking + speed. This benefit works only in short bursts; you fall if you end your + turn in the air and nothing else is holding you aloft. + + """ + name = "Totemic Attunement (Eagle)" + source = "Barbarian (Totem Warrior)" + + +class WolfAttunement(Feature): + """Wolf. While you’re raging, you can use a bonus action on your turn to knock + a Large or smaller creature prone when you hit it with melee weapon attack. + + """ + name = "Totemic Attunement (Wolf)" + source = "Barbarian (Totem Warrior)" + + +class ElkAttunement(Feature): + """While raging, you can use a bonus action during your move to pass through + the space of a Large or smaller creature. That creature must succeed on a + Strength saving throw (DC 8 + your Strength bo- nus + your proficiency + bonus) or be knocked prone and take bludgeoning damage equal to 1d12 + your + Strength modifier + + """ + name = "Totemic Attunement (Elk)" + source = "Barbarian (Totem Warrior)" + + +class TigerAttunement(Feature): + """While you're raging, if you move at least 20 feet in a straight line toward + a Large or smaller target right before making a melee weapon attack against + it, you can use a bonus action to make an additional melee weapon attack + against it + + """ + name = "Totemic Attunement (Tiger)" + source = "Barbarian (Totem Warrior)" + + +class TotemicAttunement(FeatureSelector): + """Select a Totemic Attunement from one of the following under feature_choices + in your .py file: + + bear attunement + + eagle attunement + + wolf attunement + + elk attunement + + tiger attunement + + """ + options = {'bear attunement': BearAttunement, + 'eagle attunement': EagleAttunement, + 'wolf attunement': WolfAttunement, + 'elk attunement': ElkAttunement, + 'tiger attunement': TigerAttunement} + name = "Totemic Attunement (Select One)" + source = "Barbarian (Totem Warrior)" + + +# Battlerager +class BattleragerArmor(Feature): + """When you choose this path at 3rd level, you gain the ability to use spiked + armor (see the "Spiked Armor" sidebar in SCAG) as a weapon. While you are + wearing spiked armor and are raging, you can use a bonus action to make one + melee weapon attack with your armor spikes against a target within 5 feet + of you. If the attack hits , the spikes deal ld4 piercing damage. You use + your Strength modifier for the attack and damage rolls. Additionally, when + you use the Attack action to grapple a creature, the target takes 3 + piercing damage if your grapple check succeeds. + + """ + name = 'Battlerager Armor' + source = "Barbarian (Battlerager)" + + +class RecklessAbandon(Feature): + """Beginning at 6th level, when you use Reckless Attack while raging, you also + gain temporary hit points equal to your Constitution modifier (minimum of + 1). They vanish if any of them are left when your rage ends . + + """ + name = "Reckless Abandon" + source = "Barbarian (Battlerager)" + + +class BattleragerCharge(Feature): + """Beginning at 10th level, you can take the Dash action as a bonus action + while you are raging. + + """ + name = "Battlerager Charge" + source = "Barbarian (Battlerager)" + + +class SpikedRetribution(Feature): + """Starting at 14th level, when a creature within 5 feet of you hits you with + a melee attack, the attacker takes 3 piercing damage if you are raging, + aren't incapacitated, and are wearing spiked armor. + + """ + name = "Spiked Retribution" + source = "Barbarian (Battlerager)" + + +# Ancestral Guardian +class AncestralProtectors(Feature): + """Starting when you choose this path at 3rd level, spectral warriors appear + when you enter your rage. While you’re raging, the first creature you hit + with an attack on your turn becomes the target of the warriors, which + hinder its attacks. Until the start ofyour next turn, that target has + disadvantage on any attack roll that isn’t against you, and when the target + hits a creature other than you with an attack, that creature has resistance + to the damage dealt by the attack. The effect on the target ends early + ifyour rage ends + + """ + name = "Ancestral Protectors" + source = "Barbarian (Ancestral Guardian)" + + +class SpiritShield(Feature): + """Beginning at 6th level, the guardian spirits that aid you can provide + supernatural protection to those you defend. If you are raging and another + creature you can see within 30 feet of you takes damage, you can use your + reaction to reduce that damage by 2d6. + + When you reach certain levels in this class. you can reduce the damage by + more: by 3d6 at 10th level and by 4d6 at 14th level. + + """ + _name = "Spirit Shield" + source = "Barbarian (Ancestral Guardian)" + + @property + def name(self): + level = self.owner.Barbarian.level + damage = " (2d6)" + if level >= 10: + damage = " (3d6)" + if level >= 14: + damage = " (4d6)" + return self._name + damage + + +class ConsultTheSpirits(Feature): + """At 10th level, you gain the ability to consult with your ancestral + spirits. When you do so, you cast the augury or clairvoyance spell, without + using a spell slot or material components. Rather than creating a spherical + sensor, this use of clairvoyance invisibly summons one Of your ancestral + spirits to the chosen location. Wisdom is your spellcasting ability for + these spells. After you cast either spell in this way, you can’t use this + feature again until you finish a short or long rest + + """ + name = "Consult the Spirits" + source = "Barbarian (Ancestral Guardian)" + + +class VengefulAncestors(Feature): + """At 14th level, your ancestral spirits grow powerful enough to + retaliate. When you use your Spirit Shield to reduce the damage of an + attack, the attacker takes an amount of force damage equal to the damage + that your Spirit Shield prevents. + + """ + name = "VengefulAncestors" + source = "Barbarian (Ancestral Guardian)" + + +# Storm Herald +class DesertAura(Feature): + """Starting at 3rd level, you emanate a stormy, magical aura while you + rage. The aura extends 10 feet from you in every direction, but not through + total cover. Your aura has an effect that activates when you enter your + rage, and you can activate the effect again on each of your turns as a + bonus action. + + Choose desert, sea, or tundra. Your aura’s effect depends on that chosen + environment, as detailed below. You can change your environment choice + whenever you gain a level in this class. If your aura's effects require a + saving throw, the DC equals 8 + your proficiency bonus + your Constitu- + tion modifier. + + **Desert**: When this effect is activated, all other creatures in your + aura take 2 fire damage each. The damage increases when you reach certain + levels in this class, increasing to 3 at 5th level, 4 at 10th level, 5 at + 15th level, and 6 at 20th level. + + """ + name = "Storm Aura (Desert)" + source = "Barbarian (Storm Herald)" + + +class SeaAura(Feature): + """Starting at 3rd level, you emanate a stormy, magical aura while you + rage. The aura extends 10 feet from you in every direction, but not through + total cover. Your aura has an effect that activates when you enter your + rage, and you can activate the effect again on each of your turns as a + bonus action. + + Choose desert, sea, or tundra. Your aura’s effect depends on that chosen + environment, as detailed below. You can change your environment choice + whenever you gain a level in this class. If your aura's effects require a + saving throw, the DC equals 8 + your proficiency bonus + your Constitu- + tion modifier. + + **Sea**: When this effect is activated, you can choose one other creature + you can see in your aura. The target must make a Dexterity saving + throw. The target takes 1d6 lightning damage on a failed save, or half as + much dam- age on a successful one. The damage increases when you reach + certain levels in this class, increasing to 2d6 at 10th level, 3d6 at 15th + level, and 4d6 at 20th level. + + """ + name = "Storm Aura (Sea)" + source = "Barbarian (Storm Herald)" + + +class TundraAura(Feature): + """Starting at 3rd level, you emanate a stormy, magical aura while you + rage. The aura extends 10 feet from you in every direction, but not through + total cover. Your aura has an effect that activates when you enter your + rage, and you can activate the effect again on each of your turns as a + bonus action. + + Choose desert, sea, or tundra. Your aura’s effect depends on that chosen + environment, as detailed below. You can change your environment choice + whenever you gain a level in this class. If your aura's effects require a + saving throw, the DC equals 8 + your proficiency bonus + your Constitu- + tion modifier. + + **Tundra**: When this effect is activated, each creature of your choice in + your aura gains 2 temporary hit points, as icy spirits inure it to + suffering. The temporary hit points increase when you reach certain levels + in this class, increasing to 3 at 5th level, 4 at 10th level, 5 at 15th + level, and 6 at 20th level. + + """ + name = "Storm Aura (Tundra)" + source = "Barbarian (Storm Herald)" + + +class StormAura(FeatureSelector): + """ + Select a Storm Aura from one of the following under feature_choices in + your .py file: + + desert + + sea + + tundra + """ + options = {'desert': DesertAura, + 'sea': SeaAura, + 'tundra': TundraAura} + name = "Storm Aura (Select One)" + source = "Barbarian (Storm Herald)" + + +class DesertSoul(Feature): + """At 6th level, the storm grants you benefits even when your aura isn’t + active. The benefits are based on the environment you chose for your + Storm Aura. + + **Desert**: You gain resistance to fire damage, and you don’t suffer the + effects of extreme heat, as described in the Dungeon Master’s + Guide. Moreover, as an action, you can touch a flammable object that isn’t + being worn or carried by anyone else and set it on fire + + """ + name = "Storm Soul (Desert)" + source = "Barbarian (Storm Herald)" + + +class SeaSoul(Feature): + """At 6th level, the storm grants you benefits even when your aura isn’t + active. The benefits are based on the environment you chose for your + Storm Aura. + + **Sea**: You gain resistance to lightning damage, and + you can breathe underwater. You also gain a swimming speed of 30 feet. + """ + name = "Storm Soul (Sea)" + source = "Barbarian (Storm Herald)" + + +class TundraSoul(Feature): + """At 6th level, the storm grants you benefits even when your aura isn’t + active. The benefits are based on the environment you chose for your + Storm Aura. + + **Tundra**: You gain resistance to cold damage, and you don’t suffer the + effects of extreme cold, as described in the Dungeon Master’s + Guide. Moreover, as an action, you can touch water and turn a 5-foot cube + Of it into ice, which melts after 1 minute. This action fails if a creature + is in the cube + """ + name = "Storm Soul (Tundra)" + source = "Barbarian (Storm Herald)" + + +class StormSoul(FeatureSelector): + """Select a Storm Soul (same as Soul Aura) from one of the following under + feature_choices in your .py file: + + desert + + sea + + tundra + + """ + options = {'desert': DesertSoul, + 'sea': SeaSoul, + 'tundra': TundraSoul} + name = "Storm Soul (Select One)" + source = "Barbarian (Storm Herald)" + + +class ShieldingStorm(Feature): + """At 10th level, you learn to use your mastery of the storm to protect + others. Each creature of your choice has the damage resistance you gained + from the Storm Soul fea ture while the creature is in your Storm Aura. + + """ + name = "Shielding Storm" + source = "Barbarian (Storm Herald)" + + +class RagingDesert(Feature): + """At 14th level, the power of the storm you channel grows mightier, lashing + out at your foes. The effect is based on the environment you chose for your + Storm Aura + + **Desert**: Immediately after a creature in your aura hits you with an + attack, you can use your reaction to force that creature to make a + Dexterity saving throw. On a failed save, the creature takes fire damage + equal to half your barbarian level. + + """ + name = "Raging Storm (Desert)" + source = "Barbarian (Storm Herald)" + + +class RagingSea(Feature): + """At 14th level, the power of the storm you channel grows mightier, lashing + out at your foes. The effect is based on the environment you chose for your + Storm Aura + + **Sea**: When you hit a creature in your aura with an attack, you can use + your reaction to force that creature to make a Strength saving throw. On a + failed save, the creature is knocked prone, as if struck by a wave. + + """ + name = "Raging Storm (Sea)" + source = "Barbarian (Storm Herald)" + + +class RagingTundra(Feature): + """At 14th level, the power of the storm you channel grows mightier, lashing + out at your foes. The effect is based on the environment you chose for your + Storm Aura + + **Tundra**: Whenever the effect of your Storm Aura is ac- tivated, you can + choose one creature you can see in the aura. That creature must succeed on + a Strength saving throw, or its speed is reduced to 0 until the start of + your next turn, as magical frost covers it + + """ + name = "Raging Storm (Tundra)" + source = "Barbarian (Storm Herald)" + + +class RagingStorm(FeatureSelector): + """Select a Raging Storm (same as Soul Aura) from one of the following under + feature_choices in your .py file: + + desert + + sea + + tundra + + """ + options = {'desert': RagingDesert, + 'sea': RagingSea, + 'tundra': RagingTundra} + name = "Raging Storm (Select One)" + source = "Barbarian (Storm Herald)" + + +# Zealot +class DivineFury(Feature): + """Starting when you choose this path at 3rd level, you can channel divine + fury into your weapon strikes. While you’re raging, the first creature you + hit on each of your turns with a weapon attack takes extra damage equal to + 1d6 + half your barbarian level. The extra damage is necrotic or radiant; + you choose the type of damage when you gain this feature. + + """ + _name = "Divine Fury" + source = "Barbarian (Zealot)" + + @property + def name(self): + level = self.owner.Barbarian.level + damage = " (1d6+{:d})".format(level//2) + return self._name + damage + + +class WarriorOfTheGods(Feature): + """At 3rd level, your soul is marked for endless battle. If a spell, such as + raise dead, has the sole effect of restoring you to life (but not + undeath), the caster doesn’t need material components to cast the spell + on you + + """ + name = "Warrior of the Gods" + source = "Barbarian (Zealot)" + + +class FanaticalFocus(Feature): + """Starting at 6th level, the divine power that fuels your rage can protect + you. If you fail a saving throw while you’re raging, you can reroll it, and + you must use the new roll. You can use this ability only once per rage. + """ + name = "Fanatical Focus" + source = "Barbarian (Zealot)" + + +class ZealousPresence(Feature): + """At 10th level, you learn to channel divine power to in- spire zealotry in + others. As a bonus action, you unleash a battle cry infused with divine + energy. Up to ten other creatures of your choice within 60 feet ofyou that + can hear you gain advantage on attack rolls and saving throws until the + start of your next turn. Once you use this feature, you can’t use it again + until you finish a long rest + + """ + name = "Zealous Presence" + source = "Barbarian (Zealot)" + + +class RageBeyondDeath(Feature): + """Beginning at 14th level, the divine power that fuels your rage allows you + to shrug off fatal blows. While you’re raging, having 0 hit points doesn’t + knock you unconscious. You still must make death saving throws, and you + suffer the normal effects of taking damage while at 0 hit points. However, + if you would die due to failing death saving throws, you don't die until + your rage ends, and you die then only if you still have 0 hit points. + + """ + name = "Rage Beyond Death" + source = "Barbarian (Zealot)" + diff --git a/dungeonsheets/stats.py b/dungeonsheets/stats.py index 641c261..b595e24 100644 --- a/dungeonsheets/stats.py +++ b/dungeonsheets/stats.py @@ -3,7 +3,8 @@ from collections import namedtuple from .armor import NoArmor, NoShield, HeavyArmor from .features import (UnarmoredDefenseMonk, UnarmoredDefenseBarbarian, DraconicResilience, Defense, FastMovement, - UnarmoredMovement, GiftOfTheDepths, RemarkableAthelete) + UnarmoredMovement, GiftOfTheDepths, RemarkableAthelete, + SeaSoul) from math import ceil @@ -162,4 +163,7 @@ class Speed(): if any([isinstance(f, GiftOfTheDepths) for f in char.features]): if 'swim' not in other_speed: other_speed += ' ({:d} swim)'.format(speed) + if any([isinstance(f, SeaSoul) for f in char.features]): + if 'swim' not in other_speed: + other_speed += ' (30 swim)' return '{:d}{:s}'.format(speed, other_speed)