Files
the-sunken-reach/backend/src/game/data/characterOptions.js
T
joshuaandClaude Opus 5.5 18d9e7301c V1.23.0: every subclass, 43 species, the Artificer, and the road to level 20
- 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>
2026-10-11 16:02:51 +02:00

576 lines
37 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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,
};