Files
dungeon-sheets/dungeonsheets/classes/rogue.py
T
2021-08-23 16:27:48 -05:00

261 lines
9.7 KiB
Python

from collections import defaultdict
from dungeonsheets import features, weapons
from dungeonsheets.classes.classes import CharClass, SubClass
# PHB
class Thief(SubClass):
"""You hone your skills in the larcenous arts. Burglars, bandits, cutpurses,
and other criminals typically follow this archetype, but so do rogues who
prefer to think of themselves as professional treasure seekers, explorers,
delvers, and investigators. In addition to improving your agility and
stealth, you learn skills useful for delving into ancient ruins, reading
unfamiliar languages, and using magic items you normally couldn't employ
"""
name = "Thief"
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):
"""You focus your training on the grim art of death. Those who adhere to this
archetype are diverse: hired killers, spies, bounty hunters, and even
specially anointed priests trained to exterminate the enemies of their
deity. Stealth, poison, and disguise help you eliminate your foes with
deadly efficiency
"""
name = "Assassin"
_proficiencies_text = ("disguise kit", "poisoner's kit")
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):
"""Some rogues enhance their fine-honed skills of stealth and agility with
magic, learning tricks of enchantment and illusion. These rogues include
pickpockets and burglars, but also pranksters, mischief-makers, and a
significant number of adventurers.
"""
name = "Arcane Trickster"
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"
multiclass_spellslots_by_level = {
# char_lvl: (cantrips, 1st, 2nd, 3rd, ...)
1: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
2: (0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
3: (3, 2, 0, 0, 0, 0, 0, 0, 0, 0),
4: (3, 3, 0, 0, 0, 0, 0, 0, 0, 0),
5: (3, 3, 0, 0, 0, 0, 0, 0, 0, 0),
6: (3, 3, 0, 0, 0, 0, 0, 0, 0, 0),
7: (3, 4, 2, 0, 0, 0, 0, 0, 0, 0),
8: (3, 4, 2, 0, 0, 0, 0, 0, 0, 0),
9: (3, 4, 2, 0, 0, 0, 0, 0, 0, 0),
10: (4, 4, 3, 0, 0, 0, 0, 0, 0, 0),
11: (4, 4, 3, 0, 0, 0, 0, 0, 0, 0),
12: (4, 4, 3, 0, 0, 0, 0, 0, 0, 0),
13: (4, 4, 3, 2, 0, 0, 0, 0, 0, 0),
14: (4, 4, 3, 2, 0, 0, 0, 0, 0, 0),
15: (4, 4, 3, 2, 0, 0, 0, 0, 0, 0),
16: (4, 4, 3, 3, 0, 0, 0, 0, 0, 0),
17: (4, 4, 3, 3, 0, 0, 0, 0, 0, 0),
18: (4, 4, 3, 3, 0, 0, 0, 0, 0, 0),
19: (4, 4, 3, 3, 1, 0, 0, 0, 0, 0),
20: (4, 4, 3, 3, 1, 0, 0, 0, 0, 0),
}
# XGTE
class Inquisitive(SubClass):
"""As an archetypal Inquisitive, you excel at rooting out se- crets and
unraveling mysteries. You rely on your sharp eye for detail, but also on
your finely honed ability to read the words and deeds of other creatures to
deter- mine their true intent. You excel at defeating creatures that hide
among and prey upon ordinary folk, and your mastery of lore and your keen
deductions make you well equipped to expose and end hidden evils
"""
name = "Inquisitive"
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):
"""Your focus is on people and on the influence and secrets they have. Many
spies, courtiers, and schemers follow this archetype, leading lives of
intrigue. Words are your weapons as often as knives or poison, and secrets
and favors are some of your favorite treasures.
"""
name = "Mastermind"
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):
"""You are skilled in stealth and surviving far from the streets of a city,
allowing you to scout ahead of your companions during expeditions. Rogues
who embrace this archetype are at home in the wilderness and among
barbarians and rangers, and many Scouts serve as the eyes and ears of war
bands. Ambusher, spy, bounty hunter#these are just a few of the roles that
Scouts as- sume as they range the world.
"""
name = "Scout"
skill_proficiencies = ("nature", "survival")
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 Soulknife(SubClass):
"""Most assassins strike with physical weapons, and many burglars and
spies use thieves' tools to infiltrate secure locations. In
contrast, a Soulknife strikes and infiltrates with the mind,
cutting through barriers both physical and psychic. These rogues
discover psionic power within themselves and channel it to do
their roguish work. They find easy employment as members of
thieves' guilds, though they are often mistrusted by rogues who
are leery of anyone using strange mind powers to conduct their
business. Most governments would also be happy to employ a
Soulknife as a spy.
Amid the trees of ancient forests on the Material Plane and in the
Feywild, some wood elves walk the path of the Soulknife, serving
as silent, lethal guardians of their woods. In the endless war
among the gith, a githzerai is encouraged to become a Soulknife
when stealth is required against the githyanki foe.
As a Soulknife, your psionic abilities might have haunted you
since you were a child, only revealing their full potential as you
experienced the stress of adventure. Or you might have sought out
a reclusive order of psychic adepts and spent years learning how
to manifest your power.
"""
name = "Soulknife"
features_by_level = defaultdict(list)
features_by_level[3] = [features.PsionicPower, features.PsychicBlades]
features_by_level[9] = [features.SoulBlades]
features_by_level[13] = [features.PsychicVeil]
features_by_level[17] = [features.RendMind]
class Swashbuckler(SubClass):
"""You focus your training on the art of the blade, relying on speed,
elegance, and charm in equal parts. While some warriors are brutes clad in
heavy armor, your method of fighting looks almost like a performance.
Duelists and pirates typically belong to this archetype. A Swashbuckler
excels in single combat, and can fight with two weapons while safely
darting away from an opponent
"""
name = "Swashbuckler"
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):
name = "Rogue"
hit_dice_faces = 8
subclass_select_level = 3
saving_throw_proficiencies = ("dexterity", "intelligence")
primary_abilities = ("dexterity",)
_proficiencies_text = (
"light armor",
"simple weapons",
"hand crossbows",
"longswords",
"rapiers",
"shortswords",
"thieves' tools",
)
weapon_proficiencies = (
weapons.SimpleWeapon,
weapons.HandCrossbow,
weapons.Longsword,
weapons.Rapier,
weapons.Shortsword,
)
multiclass_weapon_proficiencies = ()
_multiclass_proficiencies_text = (
"light armor",
"thieves' tools",
"[choose one skill from Rogue list]",
)
class_skill_choices = (
"Acrobatics",
"Athletics",
"Deception",
"Insight",
"Intimidation",
"Investigation",
"Perception",
"Performance",
"Persuasion",
"Sleight of Hand",
"Stealth",
)
num_skill_choices = 4
features_by_level = defaultdict(list)
features_by_level[1] = [features.RogueExpertise, features.SneakAttack]
features_by_level[2] = [features.CunningAction]
features_by_level[5] = [features.UncannyDodge]
features_by_level[7] = [features.Evasion]
features_by_level[11] = [features.ReliableTalent]
features_by_level[14] = [features.BlindSense]
features_by_level[15] = [features.SlipperyMind]
features_by_level[18] = [features.Elusive]
features_by_level[20] = [features.StrokeOfLuck]
subclasses_available = (
Thief,
Assassin,
ArcaneTrickster,
Inquisitive,
Mastermind,
Scout,
Soulknife,
Swashbuckler,
)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# slippery mind feature
if self.owner.Rogue.level >= 15:
self.saving_throw_proficiencies = ("dexterity", "intelligence", "wisdom")