from dungeonsheets.features.features import Feature, FeatureSelector


# 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
    still gain this benefit.

    This bonus is computed in the AC given on the Character Sheet above.

    """

    name = "Unarmored Defense"
    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.

    """

    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 incapacitated (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 following 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 bonus + 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 = "Vengeful Ancestors"
    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 Constitution
    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 Constitution
    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 damage 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 Constitution
    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 activated, 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 inspire 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)"
