diff --git a/dungeonsheets/classes/cleric.py b/dungeonsheets/classes/cleric.py index 21f7241..83fb54b 100644 --- a/dungeonsheets/classes/cleric.py +++ b/dungeonsheets/classes/cleric.py @@ -311,6 +311,30 @@ class GraveDomain(ClericDomain): features_by_level[8] = [features.PotentSpellcasting] features_by_level[17] = [features.KeeperOfSouls] +class DeathDomain(ClericDomain): + """The Death domain is concerned with the forces that cause death, as + well as the negative energy that gives rise to undead creatures. + Deities such as Chemosh, Myrkul, and Wee Jas are patrons of necromancers, + death knights, liches, mummy lords, and vampires. Gods of the Death + domain also embody murder (Anubis, Bhaal, and Pyremius), pain + (Iuz or Loviatar), disease or poison (Incabulos, Talona, or Morgion), + and the underworld (Hades and Hel).. + + """ + name = "Death Domain" + _domain_spells = {1: [spells.FalseLife, spells.RayOfSickness], + 3: [spells.BlindnessDeafness, spells.RayOfEnfeeblement], + 5: [spells.AnimateDead, spells.VampiricTouch], + 7: [spells.Blight, spells.DeathWard], + 9: [spells.AntilifeShell, spells.Cloudkill]} + weapon_proficiencies = (weapons.MartialWeapon,) + _proficiencies_text = ('martial weapons',) + features_by_level = defaultdict(list) + features_by_level[1] = [features.Reaper] + features_by_level[2] = [features.TouchOfDeathCleric] #a different one though + features_by_level[6] = [features.InescapableDestruction] + features_by_level[8] = [features.DivineStrikeDeath] + features_by_level[17] = [features.ImprovedReaper] class Cleric(CharClass): name = 'Cleric' @@ -332,7 +356,7 @@ class Cleric(CharClass): subclasses_available = (KnowledgeDomain, LifeDomain, LightDomain, NatureDomain, TempestDomain, TrickeryDomain, WarDomain, ArcanaDomain, ForgeDomain, - GraveDomain) + GraveDomain, DeathDomain) spellcasting_ability = 'wisdom' spell_slots_by_level = { # char_lvl: (cantrips, 1st, 2nd, 3rd, ...) diff --git a/dungeonsheets/features/cleric.py b/dungeonsheets/features/cleric.py index 493a52f..2a91367 100644 --- a/dungeonsheets/features/cleric.py +++ b/dungeonsheets/features/cleric.py @@ -779,3 +779,51 @@ class KeeperOfSouls(Feature): name = "Keeper of Souls" source = "Cleric (Grave Domain)" +class Reaper(Feature): + """At 1st level, you learn one necromancy cantrip of your choice from any + spell list. When you cast a necromancy cantrip that normally targets only + one creature, the spell can instead target two creatures within range and + within 5 feet of each other. + + """ + name = "Reaper" + source = "Cleric (Death Domain)" + +class TouchOfDeathCleric(Feature): + """Starting at 2nd level, you can use Channel Divinity to destroy another + creature's life force by touch. When you hit a creature with a melee + attack, you can use Channel Divinity to deal extra necrotic damage to + the target. The damage equals 5 + twice your cleric level. + + """ + name = "Channel Divinity: Touch of Death" + source = "Cleric (Death Domain)" + +class InescapableDestruction(Feature): + """Starting at 6th level, your ability to channel negative energy becomes + more potent. Necrotic damage dealt by your cleric spells and Channel + Divinity options ignores resistance to necrotic damage + + """ + name = "Inescapable Destruction" + source = "Cleric (Death Domain)" + +class DivineStrikeDeath(DivineStrike): + """At 8th level, you gain the ability to infuse your weapon strikes with + necrotic energy. Once on each of your turns when you hit a creature with + a weapon attack, you can cause the attack to deal an a 1d8 necrotic + damage to the target. When you reach 14th level, the extra damage + increases to 2d8. + + """ + source = "Cleric (Death Domain)" + +class ImprovedReaper(Feature): + """Starting at 17th level, when you cast a necromancy spell of 1st through + 5th level that targets only one creature, the spell can instead target two + creatures within range and within 5 feet of each other. If the spell + consumes its material components, you must provide them for each target. + + """ + name = "Improved Reaper" + source = "Cleric (Death Domain)" \ No newline at end of file diff --git a/dungeonsheets/features/races.py b/dungeonsheets/features/races.py index eda41f4..d505d1a 100644 --- a/dungeonsheets/features/races.py +++ b/dungeonsheets/features/races.py @@ -762,3 +762,115 @@ class SeveredFromDreams(Feature): """ name = "Severed from Dreams" source = "Race (Kalashtar)" + +#monsterous races +#bugbear +class LongLimbed(Feature): + """ When you make a melee attack on your turn, your reach for it is 5 feet greater than normal. + + """ + name = "Long-Limbed" + source = "Race (BugBear)" + +class SupriseAttack(Feature): + """ If you surprise a creature and hit it with an attack on your first turn + in combat, the attack deals an extra 2d6 damage to it. You can use this trait + only once per combat. + + """ + name = "Suprise Attack" + source = "Race (BugBear)" + +#goblin +class FuryOfTheSmall(Feature): + """When you damage a creature with an attack or a spell and the creature's size + is larger than yours, you can cause the attack or spell to deal extra damage to + the creature. The extra damage equals your level. Once you use this trait, you + can't use it again until you finish a short or long rest. + + """ + name = "Fury of the Small" + source = "Race (Goblin)" + +class NimbleEscape(Feature): + """ You can take the Disengage or Hide action as a bonus action on each of your turns. + + """ + name = "Nimble Escape" + source = "Race (Goblin)" + +#HobGoblin +class SavingFace(Feature): + """Hobgoblins are careful not to show weakness in front of their allies, for fear + of losing status. If you miss with an attack roll or fail an ability check or a + saving throw, you can gain a bonus to the roll equal to the number of allies you + can see within 30 feet of you (maximum bonus of +5). Once you use this trait, you + can't use it again until you finish a short or long rest. + + """ + name = "Saving Face" + source = "Race (HobGoblin)" + +class MartialTraining(Feature): #you have to add the weapons of choice to your sheet + """You are proficient with two martial weapons of your choice and with light armor. + + """ + name = "Martial Training" + source = "Race (HobGoblin)" + +#kobold +class GrovelCowerAndBeg(Feature): + """ As an action on your turn, you can cower pathetically to + distract nearby foes. Until the end of your next turn, your + allies gain advantage on attack rolls against enemies + within 10 feet of you that can see you. Once you use this + trait, you can't use it again until you finish a short + or long rest + + """ + name = "Grovel Cower and Beg" + source = "Race (Kobold)" + +class PackTactics(Feature): + """You have advantage on an attack roll against a creature + if at least one of your allies is within 5 feet of the + creature and the ally isn't incapacitated. + """ + name = "Pack Tactics" + source = "Race (Kobold)" + +class Aggressive(Feature): + """ As a bonus action, you can move up to your speed + toward an enemy of your choice that you can see or hear. + You must end this move closer to the enemy than you started. + + """ + name = "Aggressive" + source = "Race (Orc)" + +#yuan-ti pureblood +class InnateSpellcasting(Feature): + """You know the poison spray cantrip. You can cast animal + friendship an unlimited number of times with this trait, + but you can target only snakes with it. Starting at 3rd level, + you can also cast suggestion with this trait. Once you cast it, + you can't do so again until you finish a long rest. Charisma is + your spellcasting ability for these spells. + + """ + name = "Innate Spellcasting" + source = "Race (Yuan-Ti Pureblood)" + +class MagicResistance(Feature): + """ You have advantage on saving throws against spells and other magical effects. + + """ + name = "Magic Resistance" + source = "Race (Yuan_Ti Pureblood)" + +class PoisonImmunity(Feature): + """You are immune to poison damage and the poi~oned condition. + + """ + name = "Poison Immunity" + source = "Race (Yuan_Ti Pureblood)" diff --git a/dungeonsheets/race.py b/dungeonsheets/race.py index 5feac62..8457bbc 100644 --- a/dungeonsheets/race.py +++ b/dungeonsheets/race.py @@ -428,6 +428,70 @@ class Kalashtar(Race): languages = ("Common", "Quori",) # Not sure how to have a "+1 language of your choice" - naviabbot features = (feats.DualMind, feats.MentalDiscipline, feats.MindLink, feats.SeveredFromDreams) +class BugBear(Race): + name = "BugBear" + strength_bonus = 2 + dexterity_bonus = 1 + size = 'medium' + speed = 30 + features = (feats.Darkvision, feats.LongLimbed, + feats.PowerfulBuild, feats.SupriseAttack) + skill_proficiencies = ("stealth", ) + languages = ("Common", "Goblin") + +class Goblin(Race): + name = "Goblin" + dexterity_bonus = 2 + constitution_bonus = 1 + size = 'small' + speed = 30 + features = (feats.Darkvision, feats.FuryOfTheSmall, + feats.NimbleEscape) + languages = ("Common", "Goblin") + +class HobGoblin(Race): + name = "HobGoblin" + constitution_bonus = 2 + intelligence_bonus = 1 + size = 'medium' + speed = 30 + features = (feats.Darkvision, feats.SavingFace) + proficiencies_text = ('light armor', '[Chose two martial melee weapons]') + languages = ("Common", "Goblin") + +class Kobold(Race): + name = "Kobold" + dexterity_bonus = 2 + strength_bonus = -2 + size = 'small' + speed = 30 + features = (feats.Darkvision, feats.PackTactics, + feats.GrovelCowerAndBeg, feats.SunlightSensitivity) + languages = ("Common", "Draconic") + +class Orc(Race): + name = "Orc" + strength_bonus = 2 + constitution_bonus = 1 + intelligence_bonus = -2 + size = 'medium' + speed = 30 + skill_proficiencies = ('intimidation',) + features = (feats.Darkvision, feats.Aggressive, + feats.PowerfulBuild) + languages = ("Common", "Orc") + +class PureBlood(Race): + name = "Yuan-Ti Pureblood" + charisma_bonus = 2 + intelligence_bonus = 1 + size = 'medium' + speed = 30 + features = (feats.Darkvision, feats.InnateSpellcasting, + feats.MagicResistance, feats.PoisonImmunity) + spells_known = (spells.PoisonSpray,) + languages = ("Common", "Abyssal", "Draconic") + PHB_races = [HillDwarf, MountainDwarf, HighElf, WoodElf, DarkElf, LightfootHalfling, StoutHalfling, Rashemi, Dragonborn, @@ -439,9 +503,11 @@ VOLO_races = [ProtectorAasimar, ScourgeAasimar, FallenAasimar, EE_races = [Aarakocra, DeepGnome, AirGenasi, FireGenasi, EarthGenasi, WaterGenasi] +MONSTER_races = [BugBear, Goblin, HobGoblin, Kobold, Orc, PureBlood] + RFTLW_races = [Kalashtar] -available_races = PHB_races + VOLO_races + EE_races + RFTLW_races +available_races = PHB_races + VOLO_races + EE_races + MONSTER_races + RFTLW_races __all__ = tuple([r.name for r in available_races]) + ( - 'available_races', 'PHB_races', 'VOLO_races', 'EE_races, RFTLW_races') + 'available_races', 'PHB_races', 'VOLO_races', 'EE_races', 'MONSTER_races', 'RFTLW_races') diff --git a/examples/cleric2.pdf b/examples/cleric2.pdf index f9b89d2..c3015db 100644 Binary files a/examples/cleric2.pdf and b/examples/cleric2.pdf differ diff --git a/examples/cleric2.py b/examples/cleric2.py index 3dfde88..37184cc 100644 --- a/examples/cleric2.py +++ b/examples/cleric2.py @@ -16,7 +16,7 @@ player_name = "Ben" # Be sure to list Primary class first classes = ['Cleric'] # ex: ['Wizard'] or ['Rogue', 'Fighter'] levels = [20] # ex: [10] or [3, 2] -subclasses = ["War Domain"] # ex: ['Necromacy'] or ['Thief', None] +subclasses = ["Death Domain"] # ex: ['Necromacy'] or ['Thief', None] background = "Gladiator" race = "Lightfoot Halfling" alignment = "Chaotic good" diff --git a/setup.py b/setup.py index db6f854..742b70e 100644 --- a/setup.py +++ b/setup.py @@ -43,4 +43,4 @@ setup(name='dungeonsheets', 'Programming Language :: Python :: 3.7', 'Topic :: Games/Entertainment :: Role-Playing', ], - ) +)