mirror of
https://github.com/Threnklyn/dungeon-sheets.git
synced 2026-06-13 16:13:32 +02:00
Added all racial features in PHB, EEPC, VGTM
This commit is contained in:
+198
-13
@@ -1,12 +1,6 @@
|
||||
from . import weapons
|
||||
from . import features as feats
|
||||
|
||||
|
||||
__all__ = ('Dwarf', 'HillDwarf', 'MountainDwarf', 'Elf', 'HighElf',
|
||||
'WoodElf', 'DarkElf', 'Halfling', 'LightfootHalfling',
|
||||
'StoutHalfling', 'Human', 'Dragonborn', 'Gnome', 'ForestGnome',
|
||||
'RockGnome', 'HalfElf', 'HalfOrc', 'Tiefling', 'Aasimar',
|
||||
'FallenAasimar', 'Lizardfolk', 'Kenku', 'Aarakocra')
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
class Race():
|
||||
@@ -20,6 +14,7 @@ class Race():
|
||||
skill_choices = ()
|
||||
num_skill_choices = 0
|
||||
features = tuple()
|
||||
features_by_level = defaultdict(list)
|
||||
strength_bonus = 0
|
||||
dexterity_bonus = 0
|
||||
constitution_bonus = 0
|
||||
@@ -27,6 +22,11 @@ class Race():
|
||||
wisdom_bonus = 0
|
||||
charisma_bonus = 0
|
||||
hit_point_bonus = 0
|
||||
|
||||
def __init__(self):
|
||||
self.features = tuple([f() for f in self.features])
|
||||
for i in range(1, 21):
|
||||
self.features_by_level[i] = [f() for f in self.features_by_level[i]]
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
@@ -42,15 +42,18 @@ class Dwarf(Race):
|
||||
speed = 25
|
||||
languages = ("Common", "Dwarvish")
|
||||
constitution_bonus = 2
|
||||
proficiencies_text = ('battleaxes', 'handaxes', 'throwing hammers', 'warhammers')
|
||||
proficiencies_text = ('battleaxes', 'handaxes', 'throwing hammers',
|
||||
'warhammers')
|
||||
weapon_proficiences = (weapons.Battleaxe, weapons.Handaxe,
|
||||
weapons.ThrowingHammer, weapons.Warhammer)
|
||||
features = (feats.Darkvision, feats.DwarvenResilience, feats.Stonecunning)
|
||||
|
||||
|
||||
class HillDwarf(Dwarf):
|
||||
name = "Hill Dwarf"
|
||||
wisdom_bonus = 1
|
||||
hit_point_bonus = 1
|
||||
features = Dwarf.features + (feats.DwarvenToughness,)
|
||||
|
||||
|
||||
class MountainDwarf(Dwarf):
|
||||
@@ -66,6 +69,7 @@ class Elf(Race):
|
||||
dexterity_bonus = 2
|
||||
skill_proficiencies = ('perception',)
|
||||
languages = ('Common', 'Elvish')
|
||||
features = (feats.Darkvision, feats.FeyAncestry, feats.Trance)
|
||||
|
||||
|
||||
class HighElf(Elf):
|
||||
@@ -75,6 +79,7 @@ class HighElf(Elf):
|
||||
proficiencies_text = ('longswords', 'shortswords', 'shortbows', 'longbows')
|
||||
intelligence_bonus = 1
|
||||
languages = ('Common', 'Elvish', '[choose one]')
|
||||
features = Elf.features + (feats.ElfCantrip,)
|
||||
|
||||
|
||||
class WoodElf(Elf):
|
||||
@@ -83,6 +88,8 @@ class WoodElf(Elf):
|
||||
weapons.Shortbow, weapons.Longbow)
|
||||
proficiencies_text = ('longswords', 'shortswords', 'shortbows', 'longbows')
|
||||
wisdom_bonus = 1
|
||||
speed = 35
|
||||
features = Elf.features + (feats.MaskOfTheWild,)
|
||||
|
||||
|
||||
class DarkElf(Elf):
|
||||
@@ -90,6 +97,8 @@ class DarkElf(Elf):
|
||||
weapon_proficiencies = (weapons.Rapier, weapons.Shortsword, weapons.HandCrossbow)
|
||||
proficiencies_text = ('rapiers', 'shortswords', 'hand crossbows')
|
||||
charisma_bonus = 1
|
||||
features = (feats.SuperiorDarkvision, feats.FeyAncestry, feats.Trance,
|
||||
feats.SunlightSensitivity, feats.DrowMagic)
|
||||
|
||||
|
||||
# Halflings
|
||||
@@ -99,16 +108,19 @@ class Halfling(Race):
|
||||
speed = 25
|
||||
dexterity_bonus = 2
|
||||
languages = ('Common', 'Halfling')
|
||||
features = (feats.Lucky, feats.Brave, feats.HalflingNimbleness)
|
||||
|
||||
|
||||
class LightfootHalfling(Halfling):
|
||||
name = "Lightfoot Halfling"
|
||||
charisma_bonus = 1
|
||||
|
||||
features = Halfling.features + (feats.NaturallyStealthy,)
|
||||
|
||||
|
||||
class StoutHalfling(Halfling):
|
||||
name = "Stout Halfling"
|
||||
constitution_bonus = 1
|
||||
features = Halfling.features + (feats.StoutResilience,)
|
||||
|
||||
|
||||
# Humans
|
||||
@@ -133,6 +145,8 @@ class Dragonborn(Race):
|
||||
strength_bonus = 2
|
||||
charisma_bonus = 1
|
||||
languages = ("Common", "Draconic")
|
||||
features = (feats.DraconicAncestry, feats.BreathWeapon,
|
||||
feats.DraconicResistance)
|
||||
|
||||
|
||||
# Gnomes
|
||||
@@ -142,25 +156,44 @@ class Gnome(Race):
|
||||
speed = 25
|
||||
intelligence_bonus = 2
|
||||
languages = ("Common", "Gnomish")
|
||||
features = (feats.Darkvision, feats.GnomeCunning)
|
||||
|
||||
|
||||
class ForestGnome(Gnome):
|
||||
name = "Forest Gnome"
|
||||
dexterity_bonus = 1
|
||||
|
||||
features = Gnome.features + (feats.NaturalIllusionist,
|
||||
feats.SpeakWithSmallBeasts)
|
||||
|
||||
|
||||
class RockGnome(Gnome):
|
||||
name = "Rock Gnome"
|
||||
constitution_bonus = 1
|
||||
features = Gnome.features + (feats.ArtificersLore,
|
||||
feats.Tinker)
|
||||
|
||||
|
||||
class DeepGnome(Gnome):
|
||||
name = "Deep Gnome"
|
||||
dexterity_bonus = 1
|
||||
languages = ("Common", "Gnomish", "Undercommon")
|
||||
features = (feats.SuperiorDarkvision, feats.GnomeCunning,
|
||||
feats.StoneCamouflage)
|
||||
|
||||
# Half-elves
|
||||
class HalfElf(Race):
|
||||
name = "Half-Elf"
|
||||
size = "medium"
|
||||
speed = 30
|
||||
charisma_bonus = 2
|
||||
skill_choices = ('acrobatics', 'animal handling', 'arcana',
|
||||
'athletics', 'deception', 'history', 'insight',
|
||||
'intimidation', 'investigation', 'medicine', 'nature',
|
||||
'perception', 'performance', 'persuasion', 'religion',
|
||||
'sleight of hand', 'stealth', 'survival')
|
||||
num_skill_choices = 2
|
||||
languages = ("Common", "Elvish", "[choose one]")
|
||||
features = (feats.Darkvision, feats.FeyAncestry)
|
||||
|
||||
|
||||
# Half-Orcs
|
||||
@@ -170,7 +203,10 @@ class HalfOrc(Race):
|
||||
speed = 30
|
||||
strength_bonus = 2
|
||||
constitution_bonus = 1
|
||||
skill_proficiencies = ('intimidation',)
|
||||
languages = ("Common", "Orc")
|
||||
features = (feats.Darkvision, feats.RelentlessEndurance,
|
||||
feats.SavageAttacks)
|
||||
|
||||
|
||||
# Tielflings
|
||||
@@ -181,6 +217,8 @@ class Tiefling(Race):
|
||||
intelligence_bonus = 1
|
||||
charisma_bonus = 2
|
||||
languages = ("Common", "Infernal")
|
||||
features = (feats.Darkvision, feats.HellishResistance,
|
||||
feats.InfernalLegacy)
|
||||
|
||||
|
||||
# Aassimar
|
||||
@@ -190,24 +228,71 @@ class Aasimar(Race):
|
||||
speed = 30
|
||||
charisma_bonus = 2
|
||||
languages = ("Common", "Celestial")
|
||||
features = (feats.Darkvision, feats.CelestialResistance,
|
||||
feats.HealingHands, feats.LightBearer)
|
||||
|
||||
|
||||
# Protector Aasimar
|
||||
class ProtectorAasimar(Aasimar):
|
||||
name = "Protector Aasimar"
|
||||
wisdom_bonus = 1
|
||||
features_by_level = defaultdict(list)
|
||||
features_by_level[3] += [feats.RadiantSoul]
|
||||
|
||||
|
||||
# Fallen Aasimar
|
||||
class ScourgeAasimar(Aasimar):
|
||||
name = "Scourge Aasimar"
|
||||
constitution_bonus = 1
|
||||
features_by_level = defaultdict(list)
|
||||
features_by_level[3] += [feats.RadiantConsumption]
|
||||
|
||||
|
||||
# Fallen Aasimar
|
||||
class FallenAasimar(Aasimar):
|
||||
name = "Fallen Aasimar"
|
||||
strength_bonus = 1
|
||||
features_by_level = defaultdict(list)
|
||||
features_by_level[3] += [feats.NecroticShroud]
|
||||
|
||||
|
||||
# Firbolg
|
||||
class Firbolg(Race):
|
||||
name = "Firbolg"
|
||||
size = "medium"
|
||||
speed = 30
|
||||
wisdom_bonus = 2
|
||||
strength_bonus = 1
|
||||
features = (feats.FirbolgMagic, feats.HiddenStep,
|
||||
feats.PowerfulBuild, feats.SpeechOfBeastAndLeaf)
|
||||
languages = ("Common", "Elvish", "Giant")
|
||||
|
||||
|
||||
# Goliath
|
||||
class Goliath(Race):
|
||||
name = "Goliath"
|
||||
size = "Medium"
|
||||
speed = 30
|
||||
skill_proficiencies = ("athletics",)
|
||||
languages = ("Common", "Giant")
|
||||
features = (feats.StonesEndurance, feats.PowerfulBuild,
|
||||
feats.MountainBorn)
|
||||
|
||||
|
||||
|
||||
# Lizardfolk
|
||||
class Lizardfolk(Race):
|
||||
name = 'Lizardfolk'
|
||||
size = 'medium'
|
||||
speed = """30 (+swim)"""
|
||||
speed = """30 (30 swim)"""
|
||||
constitution_bonus = 2
|
||||
wisdom_bonus = 1
|
||||
languages = ('Common', 'Draconic')
|
||||
weapon_proficiencies = (weapons.Bite,)
|
||||
proficiencies_text = ('bite',)
|
||||
features = (feats.CunningArtisan, feats.HoldBreath,
|
||||
feats.NaturalArmor, feats.HungryJaws)
|
||||
skill_choices = ('animal handling', 'nature', 'perception',
|
||||
'stealth', 'survival')
|
||||
|
||||
|
||||
# Kenku
|
||||
@@ -218,6 +303,37 @@ class Kenku(Race):
|
||||
dexterity_bonus = 2
|
||||
wisdom_bonus = 1
|
||||
languages = ('Common', 'Auran')
|
||||
skill_choices = ('acrobatics', 'deception', 'stealth',
|
||||
'sleight of hand')
|
||||
num_skill_choices = 2
|
||||
features = (feats.ExpertForgery, feats.Mimicry,)
|
||||
|
||||
|
||||
# Tabaxi
|
||||
class Tabaxi(Race):
|
||||
name = 'Tabaxi'
|
||||
size = 'medium'
|
||||
dexterity_bonus = 2
|
||||
charisma_bonus = 1
|
||||
speed = "30 (20 climb)"
|
||||
languages = ("Common", "[Choose One]")
|
||||
weapon_proficiencies = (weapons.Claws,)
|
||||
proficiences_text = ('Claws',)
|
||||
skill_proficiencies = ('perception', 'stealth')
|
||||
features = (feats.Darkvision, feats.FelineAgility,)
|
||||
|
||||
|
||||
# Triton
|
||||
class Triton(Race):
|
||||
name = "Triton"
|
||||
size = "medium"
|
||||
strength_bonus = 1
|
||||
constitution_bonus = 1
|
||||
charisma_bonus = 1
|
||||
speed = "30 (30 swim)"
|
||||
features = (feats.Amphibious, feats.ControlAirAndWater,
|
||||
feats.EmissaryOfTheSea, feats.GuardiansOfTheDepths)
|
||||
languages = ("Common", "Primordial")
|
||||
|
||||
|
||||
# Aarakocra
|
||||
@@ -229,4 +345,73 @@ class Aarakocra(Race):
|
||||
wisdom_bonus = 1
|
||||
languages = ('Common', 'Aarakocra', 'Auran')
|
||||
weapon_proficiencies = (weapons.Talons,)
|
||||
proficiences_text = ('talons',)
|
||||
proficiences_text = ('Talons',)
|
||||
|
||||
|
||||
# Genasi
|
||||
class Genasi(Race):
|
||||
constitution_bonus = 2
|
||||
size = 'medium'
|
||||
speed = 30
|
||||
languages = ("Common", 'Primoridal')
|
||||
|
||||
|
||||
class AirGenasi(Genasi):
|
||||
dexterity_bonus = 1
|
||||
features = (feats.UnendingBreath,
|
||||
feats.MingleWithTheWind)
|
||||
|
||||
|
||||
class EarthGenasi(Genasi):
|
||||
strength_bonus = 1
|
||||
features = (feats.EarthWalk, feats.MergeWithStone)
|
||||
|
||||
|
||||
class FireGenasi(Genasi):
|
||||
intelligence_bonus = 1
|
||||
features = (feats.Darkvision, feats.FireResistance,
|
||||
feats.ReachToTheBlaze)
|
||||
|
||||
|
||||
class WaterGenasi(Genasi):
|
||||
wisdom_bonus = 1
|
||||
speed = "30 (30 swim)"
|
||||
features = (feats.AcidResistance, feats.Amphibious,
|
||||
feats.CallToTheWave)
|
||||
|
||||
|
||||
race_dict = {
|
||||
"Hill Dwarf": HillDwarf,
|
||||
'Mountain Dwarf': MountainDwarf,
|
||||
'High Elf': HighElf,
|
||||
'Wood Elf': WoodElf,
|
||||
'Dark Elf': DarkElf,
|
||||
'Lightfoot Halfling': LightfootHalfling,
|
||||
'Stout Halfling': StoutHalfling,
|
||||
'Human': Human,
|
||||
'Dragonborn': Dragonborn,
|
||||
'Forest Gnome': ForestGnome,
|
||||
'Rock Gnome': RockGnome,
|
||||
'Deep Gnome': DeepGnome,
|
||||
'Half-Elf': HalfElf,
|
||||
'Half-Orc': HalfOrc,
|
||||
'Tiefling': Tiefling,
|
||||
'Fallen Aasimar': FallenAasimar,
|
||||
'Protector Aasimar': ProtectorAasimar,
|
||||
'Scourge Aasimar': ScourgeAasimar,
|
||||
'Firbolg': Firbolg,
|
||||
'Goliath': Goliath,
|
||||
'Lizardfolk': Lizardfolk,
|
||||
'Kenku': Kenku,
|
||||
'Tabaxi': Tabaxi,
|
||||
'Triton': Triton,
|
||||
'Aarakocra': Aarakocra,
|
||||
'Fire Genasi': FireGenasi,
|
||||
'Earth Genasi': EarthGenasi,
|
||||
'Water Genasi': WaterGenasi,
|
||||
'Air Genasi': AirGenasi,
|
||||
}
|
||||
|
||||
__all__ = tuple(race_dict.keys())
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user