- All 123 official subclasses (2014 books and the 2024 Player's Handbook), each with its book and features up to level 20; one file per class - The builder has a subclass step after the class: pick one, let a die suggest one, or decide later; its gifts arrive at the class's choice level - 2024 updates (Wild Heart, Warrior of the Elements) offer a one-click switch - The Road Ahead: a level 1-20 timeline on every sheet and in the builder - 33 new species (2024 Aasimar and Goliath, Monsters of the Multiverse) with chosen +2/+1 or +1/+1/+1 bonuses; species roll is now a d8 by family - The Artificer: class, half-caster slots from level 1, features, Flash of Genius - Class tables and counters run to level 20; a fifth Boon, Resolve Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
576 lines
37 KiB
JavaScript
576 lines
37 KiB
JavaScript
// What a player picks from in the story steps of the character builder:
|
||
// motivation, special abilities, background and appearance. A character's
|
||
// text for these is always composed from the entries below (see buildFlow.js),
|
||
// never typed freely, so the builder page fetches this file's contents rather
|
||
// than keeping its own copy.
|
||
//
|
||
// None of this feeds the calculation engine. Special abilities are written as
|
||
// table rules for the DM to apply, in plain words.
|
||
|
||
const MOTIVATIONS = [
|
||
{ key: 1, label: 'Revenge for a past wrong' },
|
||
{ key: 2, label: 'Seeking fortune or wealth' },
|
||
{ key: 3, label: 'Protecting someone they love' },
|
||
{ key: 4, label: 'Redemption for a past mistake' },
|
||
{ key: 5, label: 'Driven by curiosity or knowledge' },
|
||
{ key: 6, label: 'Duty or oath to a cause or order' },
|
||
];
|
||
|
||
// ---------------------------------------------------------------------------
|
||
// Special abilities
|
||
// ---------------------------------------------------------------------------
|
||
|
||
// Granted automatically by species.
|
||
const SPECIES_TRAITS = {
|
||
HUMAN: [{ name: 'Versatile', text: 'Once per day, reroll one skill check you just failed and keep the new result.' }],
|
||
HALF_ELF: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Fey Ancestry', text: 'Advantage on saves against being charmed, and magic cannot put you to sleep.' },
|
||
],
|
||
ELF: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Fey Ancestry', text: 'Advantage on saves against being charmed, and magic cannot put you to sleep.' },
|
||
{ name: 'Trance', text: 'You do not sleep. Four hours of meditation rests you as well as a full night.' },
|
||
],
|
||
GNOME: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Gnome Cunning', text: 'Advantage on Intelligence, Wisdom and Charisma saves against magic.' },
|
||
],
|
||
DWARF: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Dwarven Resilience', text: 'Advantage on saves against poison, and poison damage against you is halved.' },
|
||
],
|
||
HALFLING: [
|
||
{ name: 'Lucky', text: 'When you roll a 1 on a d20 for an attack, check or save, reroll it and use the new roll.' },
|
||
{ name: 'Brave', text: 'Advantage on saves against being frightened.' },
|
||
],
|
||
DRAGONBORN: [
|
||
{ name: 'Breath Weapon', text: 'Once per rest, exhale destructive energy: creatures in a 15-foot cone take 2d6 damage (Dexterity save for half).' },
|
||
{ name: 'Draconic Resistance', text: 'Damage of your breath weapon’s type against you is halved.' },
|
||
],
|
||
TIEFLING: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Hellish Resistance', text: 'Fire damage against you is halved.' },
|
||
],
|
||
HALF_ORC: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Relentless Endurance', text: 'Once per day, when you would drop to 0 hit points, drop to 1 instead.' },
|
||
],
|
||
ORC: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Aggressive', text: 'As a bonus action, move up to your speed toward an enemy you can see.' },
|
||
],
|
||
AASIMAR: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Celestial Resistance', text: 'Necrotic and radiant damage against you is halved.' },
|
||
{ name: 'Healing Hands', text: 'Once per long rest, touch a creature and restore hit points: roll a d4 for each point of your proficiency bonus.' },
|
||
{ name: 'Light Bearer', text: 'You know the Light cantrip (the DM grants it).' },
|
||
{ name: 'Celestial Revelation', text: 'From level 3, once per long rest, transform for a minute (bonus action), choosing: spectral wings (fly at your speed), an inner radiance (light, and radiant damage to those near you each turn) or a fearful shroud (enemies nearby make a Charisma save or are frightened). While transformed, one hit each turn deals extra damage equal to your proficiency bonus.' },
|
||
],
|
||
GOLIATH: [
|
||
{ name: 'Giant Ancestry', text: 'Choose a giant with your DM; use its gift your proficiency bonus times per long rest. Cloud: bonus-action teleport 30 ft. Fire: +1d10 fire on a hit. Frost: +1d6 cold on a hit and the target is slowed by 10 ft. Hill: knock a Large or smaller target you hit prone. Stone: reaction, reduce damage you take by 1d12 + Constitution modifier. Storm: reaction, deal 1d8 thunder to a creature that damaged you.' },
|
||
{ name: 'Large Form', text: 'From level 5, once per long rest, grow Large for 10 minutes (bonus action): advantage on Strength checks and +10 ft speed.' },
|
||
{ name: 'Powerful Build', text: 'You count as one size larger when working out what you can carry, push, drag or lift.' },
|
||
],
|
||
AARAKOCRA: [
|
||
{ name: 'Flight', text: 'You can fly at your walking speed, but not while wearing medium or heavy armor.' },
|
||
{ name: 'Talons', text: 'Your unarmed strikes deal 1d6 + Strength modifier slashing damage.' },
|
||
{ name: 'Wind Caller', text: 'From level 3, cast Gust of Wind once per long rest without a spell slot.' },
|
||
],
|
||
BUGBEAR: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Fey Ancestry', text: 'Advantage on saves against being charmed, and magic cannot put you to sleep.' },
|
||
{ name: 'Long-Limbed', text: 'On your turn, your melee attacks reach 5 feet further than normal.' },
|
||
{ name: 'Powerful Build', text: 'You count as one size larger when working out what you can carry, push, drag or lift.' },
|
||
{ name: 'Sneaky', text: 'You are proficient in Stealth (add the bonus by hand) and can squeeze through spaces made for Small creatures.' },
|
||
{ name: 'Surprise Attack', text: 'Hit a creature that has not yet taken a turn in the fight: it takes an extra 2d6 damage (once per combat).' },
|
||
],
|
||
CENTAUR: [
|
||
{ name: 'Charge', text: 'Move at least 30 feet straight toward a target and hit it with a melee attack: make a Hooves attack against it as a bonus action.' },
|
||
{ name: 'Equine Build', text: 'You count as one size larger for carrying, pushing and dragging. Climbing costs 4 extra feet for each foot you climb.' },
|
||
{ name: 'Hooves', text: 'Your unarmed strikes deal 1d6 + Strength modifier bludgeoning damage.' },
|
||
{ name: 'Natural Affinity', text: 'You are proficient in one of Animal Handling, Medicine, Nature or Survival (agree it with your DM).' },
|
||
],
|
||
CHANGELING: [
|
||
{ name: 'Shapechanger', text: 'Action: change your appearance and voice (height, features, hair, skin) to look like another humanoid of your size. Your gear does not change.' },
|
||
{ name: 'Changeling Instincts', text: 'You are proficient in two of Deception, Insight, Intimidation, Performance and Persuasion (agree them with your DM).' },
|
||
],
|
||
DEEP_GNOME: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 120 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Gnomish Magic Resistance', text: 'Advantage on Intelligence, Wisdom and Charisma saves against spells.' },
|
||
{ name: 'Svirfneblin Camouflage', text: 'Your proficiency bonus times per long rest, give yourself advantage on a Stealth check.' },
|
||
{ name: 'Gift of the Svirfneblin', text: 'From level 3, cast Disguise Self once per long rest; from level 5, Nondetection on yourself once per long rest.' },
|
||
],
|
||
DUERGAR: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 120 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Dwarven Resilience', text: 'Advantage on saves against poison, and poison damage against you is halved.' },
|
||
{ name: 'Psionic Fortitude', text: 'Advantage on saves against being charmed or stunned.' },
|
||
{ name: 'Duergar Magic', text: 'From level 3, cast Enlarge/Reduce on yourself once per long rest; from level 5, Invisibility on yourself once per long rest.' },
|
||
],
|
||
ELADRIN: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Fey Ancestry', text: 'Advantage on saves against being charmed, and magic cannot put you to sleep.' },
|
||
{ name: 'Trance', text: 'You do not sleep. Four hours of meditation rests you as well as a full night.' },
|
||
{ name: 'Keen Senses', text: 'You are proficient in Perception (add the bonus by hand).' },
|
||
{ name: 'Fey Step', text: 'Your proficiency bonus times per long rest, bonus action: teleport up to 30 feet. From level 3 it also has your season’s effect (agree it with your DM): autumn charms, winter frightens, spring lets you teleport an ally instead, summer burns those nearby.' },
|
||
],
|
||
FAIRY: [
|
||
{ name: 'Flight', text: 'You can fly at your walking speed, but not while wearing medium or heavy armor.' },
|
||
{ name: 'Fairy Magic', text: 'You know Druidcraft. From level 3 cast Faerie Fire, and from level 5 Enlarge/Reduce, each once per long rest without a slot.' },
|
||
{ name: 'Small', text: 'You are Small: heavy weapons are hard for you to wield (disadvantage).' },
|
||
],
|
||
FIRBOLG: [
|
||
{ name: 'Firbolg Magic', text: 'Cast Detect Magic and Disguise Self, each once per long rest without a slot.' },
|
||
{ name: 'Hidden Step', text: 'Your proficiency bonus times per long rest, bonus action: turn invisible until the start of your next turn or until you attack.' },
|
||
{ name: 'Powerful Build', text: 'You count as one size larger when working out what you can carry, push, drag or lift.' },
|
||
{ name: 'Speech of Beast and Leaf', text: 'Beasts and plants understand the meaning of your words, and you have advantage on Charisma checks to influence them.' },
|
||
],
|
||
AIR_GENASI: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Unending Breath', text: 'You can hold your breath indefinitely.' },
|
||
{ name: 'Lightning Resistance', text: 'Lightning damage against you is halved.' },
|
||
{ name: 'Mingle with the Wind', text: 'You know Shocking Grasp. From level 3 cast Feather Fall, and from level 5 Levitate, each once per long rest without a slot.' },
|
||
],
|
||
EARTH_GENASI: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Earth Walk', text: 'Difficult terrain made of earth or stone does not slow you.' },
|
||
{ name: 'Merge with Stone', text: 'You know Blade Ward and can cast it as a bonus action your proficiency bonus times per long rest. From level 5 cast Pass without Trace once per long rest without a slot.' },
|
||
],
|
||
FIRE_GENASI: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Fire Resistance', text: 'Fire damage against you is halved.' },
|
||
{ name: 'Reach to the Blaze', text: 'You know Produce Flame. From level 3 cast Burning Hands, and from level 5 Flame Blade, each once per long rest without a slot.' },
|
||
],
|
||
WATER_GENASI: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Acid Resistance', text: 'Acid damage against you is halved.' },
|
||
{ name: 'Amphibious', text: 'You can breathe air and water, and you have a swimming speed equal to your walking speed.' },
|
||
{ name: 'Call to the Wave', text: 'You know Acid Splash. From level 3 cast Create or Destroy Water, and from level 5 Water Walk, each once per long rest without a slot.' },
|
||
],
|
||
GITHYANKI: [
|
||
{ name: 'Astral Knowledge', text: 'After each long rest, pick one skill and one weapon or tool to be proficient in until the next (agree them with your DM).' },
|
||
{ name: 'Githyanki Psionics', text: 'You know Mage Hand (and the hand is invisible). From level 3 cast Jump, and from level 5 Misty Step, each once per long rest without a slot.' },
|
||
{ name: 'Psychic Resilience', text: 'Psychic damage against you is halved.' },
|
||
],
|
||
GITHZERAI: [
|
||
{ name: 'Mental Discipline', text: 'Advantage on saves against being charmed or frightened.' },
|
||
{ name: 'Githzerai Psionics', text: 'You know Mage Hand (and the hand is invisible). From level 3 cast Shield, and from level 5 Detect Thoughts, each once per long rest without a slot.' },
|
||
{ name: 'Psychic Resilience', text: 'Psychic damage against you is halved.' },
|
||
],
|
||
GOBLIN: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Fey Ancestry', text: 'Advantage on saves against being charmed, and magic cannot put you to sleep.' },
|
||
{ name: 'Fury of the Small', text: 'Your proficiency bonus times per long rest, when you hit a creature larger than you, deal extra damage equal to your proficiency bonus.' },
|
||
{ name: 'Nimble Escape', text: 'Bonus action: Disengage or Hide.' },
|
||
{ name: 'Small', text: 'You are Small: heavy weapons are hard for you to wield (disadvantage).' },
|
||
],
|
||
HARENGON: [
|
||
{ name: 'Hare-Trigger', text: 'Add your proficiency bonus to your initiative rolls.' },
|
||
{ name: 'Leporine Senses', text: 'You are proficient in Perception (add the bonus by hand).' },
|
||
{ name: 'Lucky Footwork', text: 'Reaction, when you fail a Dexterity save: add a d4 to it, which may turn it into a success.' },
|
||
{ name: 'Rabbit Hop', text: 'Your proficiency bonus times per long rest, bonus action: jump 5 × your proficiency bonus feet without provoking opportunity attacks.' },
|
||
],
|
||
HOBGOBLIN: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Fey Ancestry', text: 'Advantage on saves against being charmed, and magic cannot put you to sleep.' },
|
||
{ name: 'Fey Gift', text: 'Your proficiency bonus times per long rest, take the Help action as a bonus action. From level 3 it also gives temporary HP, speed, or makes the target’s next attack against you harder (agree which with your DM).' },
|
||
{ name: 'Fortune from the Many', text: 'Once per long rest, when you miss an attack or fail a check or save, add +1 for each ally you can see within 30 feet (up to +3).' },
|
||
],
|
||
KENKU: [
|
||
{ name: 'Expert Duplication', text: 'Advantage on checks to copy handwriting or craftwork.' },
|
||
{ name: 'Kenku Recall', text: 'You are proficient in two skills of your choice. Your proficiency bonus times per long rest, give yourself advantage on a check with a skill you are proficient in.' },
|
||
{ name: 'Mimicry', text: 'You can copy any sound or voice you have heard; telling it apart takes an Insight check against yours.' },
|
||
],
|
||
KOBOLD: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Draconic Cry', text: 'Your proficiency bonus times per long rest, bonus action: until the start of your next turn, you and your allies have advantage on attacks against enemies within 10 feet of you.' },
|
||
{ name: 'Kobold Legacy', text: 'Choose one with your DM: Craftiness (proficiency in Arcana, Investigation, Medicine, Sleight of Hand or Survival), Defiance (advantage on saves against being frightened), or Draconic Sorcery (one sorcerer cantrip).' },
|
||
{ name: 'Small', text: 'You are Small: heavy weapons are hard for you to wield (disadvantage).' },
|
||
],
|
||
LIZARDFOLK: [
|
||
{ name: 'Bite', text: 'Your unarmed strikes can be bites: 1d6 + Strength modifier piercing damage.' },
|
||
{ name: 'Hold Breath', text: 'You can hold your breath for up to 15 minutes, and you swim at your walking speed.' },
|
||
{ name: 'Hungry Jaws', text: 'Your proficiency bonus times per long rest, bonus action: a Bite attack that, on a hit, gives you temporary HP equal to your proficiency bonus.' },
|
||
{ name: 'Natural Armor', text: 'Without armor your AC is 13 + your Dexterity modifier (ask your DM to set your armor bonus). A shield still adds.' },
|
||
{ name: 'Nature’s Intuition', text: 'You are proficient in two of Animal Handling, Medicine, Nature, Perception, Stealth and Survival (agree them with your DM; add the bonus by hand).' },
|
||
],
|
||
MINOTAUR: [
|
||
{ name: 'Horns', text: 'Your unarmed strikes can gore: 1d6 + Strength modifier piercing damage.' },
|
||
{ name: 'Goring Rush', text: 'Right after you Dash and move at least 20 feet, make one Horns attack as a bonus action.' },
|
||
{ name: 'Hammering Horns', text: 'After you hit with a melee attack as part of the Attack action, shove the target up to 10 feet away as a bonus action (Strength save to resist).' },
|
||
{ name: 'Labyrinthine Recall', text: 'You always know which way is north, and you have advantage on checks to navigate or track.' },
|
||
],
|
||
SEA_ELF: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Fey Ancestry', text: 'Advantage on saves against being charmed, and magic cannot put you to sleep.' },
|
||
{ name: 'Trance', text: 'You do not sleep. Four hours of meditation rests you as well as a full night.' },
|
||
{ name: 'Child of the Sea', text: 'You breathe air and water, swim at your walking speed, and cold damage against you is halved.' },
|
||
{ name: 'Friend of the Sea', text: 'You can share simple ideas with beasts that breathe water.' },
|
||
],
|
||
SHADAR_KAI: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Fey Ancestry', text: 'Advantage on saves against being charmed, and magic cannot put you to sleep.' },
|
||
{ name: 'Trance', text: 'You do not sleep. Four hours of meditation rests you as well as a full night.' },
|
||
{ name: 'Necrotic Resistance', text: 'Necrotic damage against you is halved.' },
|
||
{ name: 'Blessing of the Raven Queen', text: 'Your proficiency bonus times per long rest, bonus action: teleport up to 30 feet. From level 3 you also halve all damage against you until the start of your next turn.' },
|
||
],
|
||
SHIFTER: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Bestial Instincts', text: 'You are proficient in one of Acrobatics, Athletics, Intimidation or Survival (agree it with your DM).' },
|
||
{ name: 'Shifting', text: 'Your proficiency bonus times per long rest, bonus action: shift for one minute and gain 2 × your proficiency bonus temporary HP, plus your kind’s benefit (agree it with your DM): Beasthide +1 AC, Longtooth a bonus-action bite, Swiftstride +10 ft speed, Wildhunt advantage on Wisdom checks.' },
|
||
],
|
||
TABAXI: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Cat’s Claws', text: 'Your unarmed strikes deal 1d6 + Strength modifier slashing damage, and you climb at your walking speed.' },
|
||
{ name: 'Cat’s Talent', text: 'You are proficient in Perception and Stealth (add the bonus by hand).' },
|
||
{ name: 'Feline Agility', text: 'On your turn, double your speed until the end of the turn. You can do it again after a turn in which you do not move.' },
|
||
],
|
||
TORTLE: [
|
||
{ name: 'Claws', text: 'Your unarmed strikes deal 1d6 + Strength modifier slashing damage.' },
|
||
{ name: 'Hold Breath', text: 'You can hold your breath for up to an hour.' },
|
||
{ name: 'Natural Armor', text: 'Your shell gives you AC 17, whatever your Dexterity; you cannot wear armor, but a shield still adds (ask your DM to set your armor bonus).' },
|
||
{ name: 'Shell Defense', text: 'Action: withdraw into your shell: +4 AC and advantage on Strength and Constitution saves, but speed 0, disadvantage on Dexterity saves and no reactions, until you come out (bonus action).' },
|
||
{ name: 'Nature’s Intuition', text: 'You are proficient in two of Animal Handling, Medicine, Nature, Perception, Stealth and Survival (agree them with your DM; add the bonus by hand).' },
|
||
],
|
||
TRITON: [
|
||
{ name: 'Amphibious', text: 'You can breathe air and water, and you have a swimming speed equal to your walking speed.' },
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Control Air and Water', text: 'Cast Fog Cloud; from level 3 Gust of Wind, and from level 5 Water Walk, each once per long rest without a slot.' },
|
||
{ name: 'Emissary of the Sea', text: 'You can share simple ideas with beasts, elementals and monstrosities that breathe water.' },
|
||
{ name: 'Guardian of the Depths', text: 'Cold damage against you is halved.' },
|
||
],
|
||
YUAN_TI: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 60 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Magic Resistance', text: 'Advantage on saves against spells.' },
|
||
{ name: 'Poison Resilience', text: 'Advantage on saves against being poisoned, and poison damage against you is halved.' },
|
||
{ name: 'Serpentine Spellcasting', text: 'You know Poison Spray, and you can cast Animal Friendship on snakes at will. From level 3 cast Suggestion once per long rest without a slot.' },
|
||
],
|
||
OWLIN: [
|
||
{ name: 'Darkvision', text: 'See in dim light within 120 feet as if it were bright, and in darkness as if it were dim.' },
|
||
{ name: 'Flight', text: 'You can fly at your walking speed, but not while wearing medium or heavy armor.' },
|
||
{ name: 'Silent Feathers', text: 'You are proficient in Stealth (add the bonus by hand).' },
|
||
],
|
||
SATYR: [
|
||
{ name: 'Ram', text: 'Your unarmed strikes can headbutt: 1d6 + Strength modifier bludgeoning damage.' },
|
||
{ name: 'Magic Resistance', text: 'Advantage on saves against spells.' },
|
||
{ name: 'Mirthful Leaps', text: 'Whenever you jump, roll a d8 and add it to the distance in feet.' },
|
||
{ name: 'Reveler', text: 'You are proficient in Performance and Persuasion (add the bonus by hand).' },
|
||
],
|
||
};
|
||
|
||
// Granted automatically by class, at level 1.
|
||
const CLASS_FEATURES = {
|
||
FIGHTER: [
|
||
{ name: 'Second Wind', text: 'Once per rest, as a bonus action, recover 1d10 + your level hit points.' },
|
||
{ name: 'Fighting Style', text: 'Choose one with your DM: +2 to ranged attacks, +1 AC in armor, or +2 damage with a one-handed weapon.' },
|
||
],
|
||
BARBARIAN: [
|
||
{ name: 'Rage', text: 'Twice per day, for one minute: +2 melee damage, advantage on Strength checks and saves, and physical damage against you is halved.' },
|
||
{ name: 'Unarmored Defense', text: 'Without armor, add your Constitution modifier to your AC (ask your DM to set your armor bonus).' },
|
||
],
|
||
ROGUE: [
|
||
{ name: 'Sneak Attack', text: 'Once per turn, deal an extra 1d6 damage to a target you have advantage against, or that has one of your allies next to it.' },
|
||
{ name: 'Thieves’ Cant', text: 'You know the secret slang and signs of the criminal underworld.' },
|
||
],
|
||
RANGER: [
|
||
{ name: 'Favored Enemy', text: 'Choose a kind of creature with your DM. Advantage on checks to track them and to recall what you know about them.' },
|
||
{ name: 'Natural Explorer', text: 'In the wild you cannot get lost, you find twice as much food, and difficult terrain does not slow your group.' },
|
||
],
|
||
WIZARD: [
|
||
{ name: 'Spellbook', text: 'Your spells are written in a book. You can copy new spells into it when you find them.' },
|
||
{ name: 'Arcane Recovery', text: 'Once per day, after a short rest, regain some of your spent magic.' },
|
||
],
|
||
SORCERER: [
|
||
{ name: 'Innate Magic', text: 'Your magic comes from within: you need no spellbook and no prayers.' },
|
||
{ name: 'Wild Talent', text: 'Once per day, reroll the damage dice of one spell and keep the better result.' },
|
||
],
|
||
CLERIC: [
|
||
{ name: 'Divine Domain', text: 'Choose with your DM what your god stands for (life, light, war, knowledge…). It shapes the favours you can ask.' },
|
||
{ name: 'Healing Hands', text: 'Once per rest, touch a creature to restore 1d8 + your Wisdom modifier hit points.' },
|
||
],
|
||
PALADIN: [
|
||
{ name: 'Divine Sense', text: 'A few times per day, sense any celestial, fiend or undead within 60 feet.' },
|
||
{ name: 'Lay on Hands', text: 'A pool of healing equal to 5 × your level per day, spent by touch however you like.' },
|
||
],
|
||
BARD: [
|
||
{ name: 'Bardic Inspiration', text: 'A few times per day, as a bonus action, give an ally a d6 to add to one attack, check or save.' },
|
||
{ name: 'Jack of Many Tales', text: 'You have heard a story about nearly everything: ask your DM for one useful rumour per session.' },
|
||
],
|
||
WARLOCK: [
|
||
{ name: 'Otherworldly Patron', text: 'Choose with your DM who granted your power, and what they want in return.' },
|
||
{ name: 'Pact Magic', text: 'Your magic returns after a short rest, not only a long one.' },
|
||
],
|
||
DRUID: [
|
||
{ name: 'Druidic', text: 'You know the secret language of druids and can leave hidden messages in it.' },
|
||
{ name: 'Nature’s Voice', text: 'You can calm and make simple requests of ordinary animals.' },
|
||
],
|
||
MONK: [
|
||
{ name: 'Martial Arts', text: 'Your unarmed strikes deal 1d4 damage and can use Dexterity. After attacking, make one unarmed strike as a bonus action.' },
|
||
{ name: 'Unarmored Defense', text: 'Without armor, add your Wisdom modifier to your AC (ask your DM to set your armor bonus).' },
|
||
],
|
||
ARTIFICER: [
|
||
{ name: 'Magical Tinkering', text: 'Touch a tiny object to give it a small magic: it shines, plays a recorded message, gives off a smell or sound, or shows a picture. You can keep as many going as your Intelligence modifier.' },
|
||
{ name: 'Spellcasting', text: 'You cast artificer spells through tools: thieves’ tools, artisan’s tools or an infused item serve as your focus.' },
|
||
],
|
||
};
|
||
|
||
// The player picks TALENT_PICKS of these.
|
||
const TALENT_PICKS = 2;
|
||
const TALENTS = [
|
||
{ key: 'ALERT', name: 'Alert', text: 'You cannot be surprised while you are awake.' },
|
||
{ key: 'KEEN_EYE', name: 'Keen Eye', text: 'Advantage on checks to spot hidden doors, traps and things out of place.' },
|
||
{ key: 'SILVER_TONGUE', name: 'Silver Tongue', text: 'Once per day, reroll a Persuasion or Deception check and keep the better result.' },
|
||
{ key: 'LIGHT_SLEEPER', name: 'Light Sleeper', text: 'You wake at the slightest sound, and keeping watch does not tire you.' },
|
||
{ key: 'IRON_STOMACH', name: 'Iron Stomach', text: 'Advantage on saves against spoiled food, strong drink and swallowed poisons.' },
|
||
{ key: 'ANIMAL_FRIEND', name: 'Animal Friend', text: 'Ordinary animals are calm around you unless provoked.' },
|
||
{ key: 'QUICK_HANDS', name: 'Quick Hands', text: 'Once per turn, draw, stow or pick up an object without using your action.' },
|
||
{ key: 'SURE_FOOTED', name: 'Sure-Footed', text: 'Advantage on checks to keep your balance or avoid being knocked down.' },
|
||
{ key: 'LINGUIST', name: 'Linguist', text: 'You speak two extra languages of your choice, agreed with your DM.' },
|
||
{ key: 'FIELD_MEDIC', name: 'Field Medic', text: 'Steadying a dying creature is automatic for you; no roll needed.' },
|
||
{ key: 'STRONG_BACK', name: 'Strong Back', text: 'You can carry, lift and drag twice as much as your size suggests.' },
|
||
{ key: 'GOOD_MEMORY', name: 'Good Memory', text: 'You recall exactly anything you have seen or heard in the last month.' },
|
||
{ key: 'STREETWISE', name: 'Streetwise', text: 'In any town you can find a place to sleep, a rumour, and someone who buys things without asking questions.' },
|
||
{ key: 'TOUGH_AS_NAILS', name: 'Tough as Nails', text: 'Once per day, shrug off a blow: reduce one instance of damage by 1d6.' },
|
||
];
|
||
|
||
// ---------------------------------------------------------------------------
|
||
// Background and appearance — groups of options. `min`/`max` say how many a
|
||
// player picks in each group.
|
||
// ---------------------------------------------------------------------------
|
||
|
||
const BACKGROUND_GROUPS = [
|
||
{
|
||
key: 'upbringing',
|
||
label: 'Upbringing',
|
||
prompt: 'What were you before you became an adventurer?',
|
||
min: 1,
|
||
max: 1,
|
||
options: [
|
||
{ key: 'SOLDIER', label: 'Soldier', text: 'Served in an army or militia, and still thinks in terms of orders and watches.' },
|
||
{ key: 'ACOLYTE', label: 'Acolyte', text: 'Raised in a temple, tending shrines and copying scripture.' },
|
||
{ key: 'CRIMINAL', label: 'Criminal', text: 'Made a living outside the law, and knows who to ask for what.' },
|
||
{ key: 'NOBLE', label: 'Noble', text: 'Born to wealth and a family name that opens doors — and makes enemies.' },
|
||
{ key: 'SCHOLAR', label: 'Scholar', text: 'Spent years among books, chasing answers to old questions.' },
|
||
{ key: 'FARMER', label: 'Farmer', text: 'Worked the land from dawn to dusk, and knows the value of a good harvest.' },
|
||
{ key: 'SAILOR', label: 'Sailor', text: 'Grew up on deck, at home with rope, salt and bad weather.' },
|
||
{ key: 'ARTISAN', label: 'Guild artisan', text: 'Learned a craft in a workshop and takes pride in good work.' },
|
||
{ key: 'ENTERTAINER', label: 'Entertainer', text: 'Sang, juggled or acted for coin in taverns and market squares.' },
|
||
{ key: 'OUTLANDER', label: 'Outlander', text: 'Raised far from towns, among hunters, herders or nomads.' },
|
||
{ key: 'URCHIN', label: 'Urchin', text: 'Grew up alone on city streets, surviving on wits and quick feet.' },
|
||
{ key: 'HERMIT', label: 'Hermit', text: 'Lived apart from the world for years, with only thoughts for company.' },
|
||
{ key: 'MERCHANT', label: 'Merchant', text: 'Travelled the trade roads buying low and selling high.' },
|
||
{ key: 'HEALER', label: 'Village healer', text: 'Set bones, brewed remedies and sat with the sick.' },
|
||
],
|
||
},
|
||
{
|
||
key: 'home',
|
||
label: 'Home',
|
||
prompt: 'Where did you grow up?',
|
||
min: 1,
|
||
max: 1,
|
||
options: [
|
||
{ key: 'CITY', label: 'A crowded city', text: 'Noise, alleys and a thousand strangers.' },
|
||
{ key: 'VILLAGE', label: 'A small village', text: 'Everyone knew everyone, and nothing stayed secret.' },
|
||
{ key: 'PORT', label: 'A harbour town', text: 'Ships, gulls and news from far away.' },
|
||
{ key: 'MOUNTAIN', label: 'A mountain hold', text: 'Thin air, stone halls and long winters.' },
|
||
{ key: 'FOREST', label: 'Deep in the forest', text: 'Under old trees, far from any road.' },
|
||
{ key: 'FRONTIER', label: 'A frontier fort', text: 'The last wall before the wild.' },
|
||
{ key: 'ROAD', label: 'On the road', text: 'Never in one place long enough to call it home.' },
|
||
{ key: 'MONASTERY', label: 'A remote monastery', text: 'Bells, silence and routine.' },
|
||
],
|
||
},
|
||
{
|
||
key: 'turningPoint',
|
||
label: 'Turning point',
|
||
prompt: 'What set you on the road?',
|
||
min: 1,
|
||
max: 1,
|
||
options: [
|
||
{ key: 'LOSS', label: 'Lost someone dear', text: 'And have not been the same since.' },
|
||
{ key: 'BETRAYED', label: 'Was betrayed', text: 'By someone they trusted completely.' },
|
||
{ key: 'DISASTER', label: 'Survived a disaster', text: 'Fire, flood, plague or war — and walked away when others did not.' },
|
||
{ key: 'SECRET', label: 'Found a secret', text: 'Something they were never meant to see.' },
|
||
{ key: 'DEBT', label: 'Owes a debt', text: 'One that cannot be repaid by staying home.' },
|
||
{ key: 'EXILED', label: 'Was cast out', text: 'Rightly or wrongly, there is no going back.' },
|
||
{ key: 'RESCUED', label: 'Was saved by a stranger', text: 'And means to pass the favour on.' },
|
||
{ key: 'CALLING', label: 'Heard a calling', text: 'A dream, a sign or a voice that would not let them rest.' },
|
||
{ key: 'BOREDOM', label: 'Could not stand the quiet', text: 'An ordinary life was never going to be enough.' },
|
||
],
|
||
},
|
||
{
|
||
key: 'personality',
|
||
label: 'Personality',
|
||
prompt: 'How do others describe you? Pick one or two.',
|
||
min: 1,
|
||
max: 2,
|
||
options: [
|
||
{ key: 'BRAVE', label: 'Brave' },
|
||
{ key: 'CAUTIOUS', label: 'Cautious' },
|
||
{ key: 'CURIOUS', label: 'Curious' },
|
||
{ key: 'KIND', label: 'Kind' },
|
||
{ key: 'HOT_HEADED', label: 'Hot-headed' },
|
||
{ key: 'SARCASTIC', label: 'Sarcastic' },
|
||
{ key: 'LOYAL', label: 'Loyal' },
|
||
{ key: 'HONEST', label: 'Honest to a fault' },
|
||
{ key: 'CHEERFUL', label: 'Cheerful' },
|
||
{ key: 'QUIET', label: 'Quiet' },
|
||
{ key: 'PROUD', label: 'Proud' },
|
||
{ key: 'SUPERSTITIOUS', label: 'Superstitious' },
|
||
{ key: 'GENEROUS', label: 'Generous' },
|
||
{ key: 'STUBBORN', label: 'Stubborn' },
|
||
],
|
||
},
|
||
{
|
||
key: 'flaw',
|
||
label: 'Flaw',
|
||
prompt: 'What gets you into trouble?',
|
||
min: 1,
|
||
max: 1,
|
||
options: [
|
||
{ key: 'GREEDY', label: 'Greedy', text: 'Cannot walk past treasure.' },
|
||
{ key: 'RECKLESS', label: 'Reckless', text: 'Acts first and thinks later.' },
|
||
{ key: 'VENGEFUL', label: 'Holds grudges', text: 'Never forgets a slight.' },
|
||
{ key: 'GULLIBLE', label: 'Too trusting', text: 'Believes a good story.' },
|
||
{ key: 'COWARDLY', label: 'Loses their nerve', text: 'When it matters most.' },
|
||
{ key: 'BOASTFUL', label: 'Boastful', text: 'Promises more than they can deliver.' },
|
||
{ key: 'SECRETIVE', label: 'Secretive', text: 'Keeps things even from friends.' },
|
||
{ key: 'SOFT_HEARTED', label: 'Soft-hearted', text: 'Cannot refuse someone in need.' },
|
||
{ key: 'TEMPER', label: 'Short temper', text: 'Easily provoked.' },
|
||
],
|
||
},
|
||
];
|
||
|
||
const APPEARANCE_GROUPS = [
|
||
{
|
||
key: 'build',
|
||
label: 'Build',
|
||
prompt: 'What shape are you?',
|
||
min: 1,
|
||
max: 1,
|
||
options: [
|
||
{ key: 'SLIGHT', label: 'Slight' },
|
||
{ key: 'LEAN', label: 'Lean' },
|
||
{ key: 'AVERAGE', label: 'Average' },
|
||
{ key: 'STOCKY', label: 'Stocky' },
|
||
{ key: 'MUSCULAR', label: 'Muscular' },
|
||
{ key: 'HEAVYSET', label: 'Heavyset' },
|
||
],
|
||
},
|
||
{
|
||
key: 'height',
|
||
label: 'Height',
|
||
prompt: 'For your species, are you…',
|
||
min: 1,
|
||
max: 1,
|
||
options: [
|
||
{ key: 'SHORT', label: 'Short' },
|
||
{ key: 'AVERAGE', label: 'Average height' },
|
||
{ key: 'TALL', label: 'Tall' },
|
||
{ key: 'TOWERING', label: 'Towering' },
|
||
],
|
||
},
|
||
{
|
||
key: 'hair',
|
||
label: 'Hair',
|
||
prompt: 'Hair (or what you have instead).',
|
||
min: 1,
|
||
max: 1,
|
||
options: [
|
||
{ key: 'BLACK', label: 'Black' },
|
||
{ key: 'BROWN', label: 'Brown' },
|
||
{ key: 'BLONDE', label: 'Blonde' },
|
||
{ key: 'RED', label: 'Red' },
|
||
{ key: 'GREY', label: 'Grey' },
|
||
{ key: 'WHITE', label: 'White' },
|
||
{ key: 'UNUSUAL', label: 'An unusual colour' },
|
||
{ key: 'BALD', label: 'Bald' },
|
||
{ key: 'NONE', label: 'None — scales, horns or crest' },
|
||
],
|
||
},
|
||
{
|
||
key: 'eyes',
|
||
label: 'Eyes',
|
||
prompt: 'Eye colour.',
|
||
min: 1,
|
||
max: 1,
|
||
options: [
|
||
{ key: 'BROWN', label: 'Brown' },
|
||
{ key: 'BLUE', label: 'Blue' },
|
||
{ key: 'GREEN', label: 'Green' },
|
||
{ key: 'GREY', label: 'Grey' },
|
||
{ key: 'AMBER', label: 'Amber' },
|
||
{ key: 'BLACK', label: 'Black' },
|
||
{ key: 'VIOLET', label: 'Violet' },
|
||
{ key: 'MISMATCHED', label: 'Mismatched' },
|
||
],
|
||
},
|
||
{
|
||
key: 'complexion',
|
||
label: 'Skin',
|
||
prompt: 'Skin or scales.',
|
||
min: 1,
|
||
max: 1,
|
||
options: [
|
||
{ key: 'PALE', label: 'Pale' },
|
||
{ key: 'FAIR', label: 'Fair' },
|
||
{ key: 'TANNED', label: 'Tanned' },
|
||
{ key: 'BROWN', label: 'Brown' },
|
||
{ key: 'DARK', label: 'Dark' },
|
||
{ key: 'WEATHERED', label: 'Weathered' },
|
||
{ key: 'ASHEN', label: 'Ashen grey' },
|
||
{ key: 'GREEN', label: 'Green-tinged' },
|
||
{ key: 'RED', label: 'Deep red' },
|
||
{ key: 'SCALED', label: 'Scaled' },
|
||
],
|
||
},
|
||
{
|
||
key: 'features',
|
||
label: 'Distinguishing features',
|
||
prompt: 'What would a stranger remember? Pick up to two, or none.',
|
||
min: 0,
|
||
max: 2,
|
||
options: [
|
||
{ key: 'SCAR', label: 'A scar across the face' },
|
||
{ key: 'TATTOO', label: 'A tattoo' },
|
||
{ key: 'FRECKLES', label: 'Freckles' },
|
||
{ key: 'BROKEN_NOSE', label: 'A broken nose' },
|
||
{ key: 'EYEPATCH', label: 'An eyepatch' },
|
||
{ key: 'BEARD', label: 'A braided beard' },
|
||
{ key: 'PIERCINGS', label: 'Piercings' },
|
||
{ key: 'BIRTHMARK', label: 'A birthmark' },
|
||
{ key: 'BURN', label: 'An old burn' },
|
||
{ key: 'MISSING_FINGER', label: 'A missing finger' },
|
||
{ key: 'LIMP', label: 'A slight limp' },
|
||
{ key: 'BIG_GRIN', label: 'An easy grin' },
|
||
],
|
||
},
|
||
{
|
||
key: 'style',
|
||
label: 'Usually wears',
|
||
prompt: 'What are you usually seen in?',
|
||
min: 1,
|
||
max: 1,
|
||
options: [
|
||
{ key: 'LEATHERS', label: 'Travel-worn leathers' },
|
||
{ key: 'ARMOR', label: 'Well-kept armor' },
|
||
{ key: 'CLOAK', label: 'A hooded cloak' },
|
||
{ key: 'FINE', label: 'Fine clothes' },
|
||
{ key: 'PATCHED', label: 'Patched and mended clothes' },
|
||
{ key: 'ROBES', label: 'Long robes' },
|
||
{ key: 'FURS', label: 'Furs and hides' },
|
||
{ key: 'BRIGHT', label: 'Bright colours' },
|
||
{ key: 'PLAIN', label: 'Plain, practical clothes' },
|
||
],
|
||
},
|
||
];
|
||
|
||
module.exports = {
|
||
MOTIVATIONS,
|
||
SPECIES_TRAITS,
|
||
CLASS_FEATURES,
|
||
TALENT_PICKS,
|
||
TALENTS,
|
||
BACKGROUND_GROUPS,
|
||
APPEARANCE_GROUPS,
|
||
};
|