diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml index 2ad145a..bde6410 100644 --- a/.github/workflows/validate.yml +++ b/.github/workflows/validate.yml @@ -25,3 +25,9 @@ jobs: - name: Validate ancestries run: npx -y ajv-cli validate -s schema/ancestry.json -d "data/ancestry/*.json" + + - name: Validate gear + run: npx -y ajv-cli validate -s schema/item.json -r schema/coins.json -d "data/gear/*.json" + + - name: Validate monsters + run: npx -y ajv-cli validate -s schema/monster.json -r schema/distance.json -d "data/monster/*.json" diff --git a/data/ancestry/goblin.json b/data/ancestry/goblin.json new file mode 100644 index 0000000..3acb644 --- /dev/null +++ b/data/ancestry/goblin.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../schema/ancestry.json", + "name": "Goblin", + "ability": "Keen Senses. You can't be surprised.", + "languages": ["Common", "Goblin"], + "source": "data/source/quickstart-set.json" +} diff --git a/data/ancestry/half-orc.json b/data/ancestry/half-orc.json new file mode 100644 index 0000000..0a7830d --- /dev/null +++ b/data/ancestry/half-orc.json @@ -0,0 +1,7 @@ +{ + "$schema": "../../schema/ancestry.json", + "name": "Half-Orc", + "ability": "Mighty. You have a +1 bonus to attack and damage rolls with melee weapons.", + "languages": ["Common", "Orcish"], + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/arrows.json b/data/gear/arrows.json new file mode 100644 index 0000000..e1dd810 --- /dev/null +++ b/data/gear/arrows.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Arrows (20)", + "description": "Ammunition for shortbows or longbows.", + "cost": { "gp": 1 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/backpack.json b/data/gear/backpack.json new file mode 100644 index 0000000..4aeb6ab --- /dev/null +++ b/data/gear/backpack.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Backpack", + "description": "Holds all the gear you can carry. Don't lose it.", + "cost": { "gp": 2 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/caltrops.json b/data/gear/caltrops.json new file mode 100644 index 0000000..3097dfe --- /dev/null +++ b/data/gear/caltrops.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Caltrops (one bag)", + "description": "Tiny, triangle-shaped iron spikes. Living creatures who step on caltrops take 1 damage and can only move at half speed for 10 rounds.", + "cost": { "sp": 5 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/crossbow-bolts.json b/data/gear/crossbow-bolts.json new file mode 100644 index 0000000..0911a58 --- /dev/null +++ b/data/gear/crossbow-bolts.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Crossbow Bolts (20)", + "description": "Ammunition for crossbows.", + "cost": { "gp": 1 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/crowbar.json b/data/gear/crowbar.json new file mode 100644 index 0000000..2ca2895 --- /dev/null +++ b/data/gear/crowbar.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Crowbar", + "description": "Grants advantage on checks to pry open stuck objects.", + "cost": { "sp": 5 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/flask-or-bottle.json b/data/gear/flask-or-bottle.json new file mode 100644 index 0000000..b9f8bc1 --- /dev/null +++ b/data/gear/flask-or-bottle.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Flask or Bottle", + "description": "Glass containers that hold one draught of liquid.", + "cost": { "sp": 3 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/flint-and-steel.json b/data/gear/flint-and-steel.json new file mode 100644 index 0000000..45cc57b --- /dev/null +++ b/data/gear/flint-and-steel.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Flint and Steel", + "description": "A small fire starter. With it, routine attempts to light a fire always succeed.", + "cost": { "sp": 5 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/grappling-hook.json b/data/gear/grappling-hook.json new file mode 100644 index 0000000..b37d3fe --- /dev/null +++ b/data/gear/grappling-hook.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Grappling Hook", + "description": "A rope anchor with three curved tines.", + "cost": { "gp": 1 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/iron-spikes.json b/data/gear/iron-spikes.json new file mode 100644 index 0000000..02b56be --- /dev/null +++ b/data/gear/iron-spikes.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Iron Spikes (10)", + "description": "Strong spikes. Each has a hole for threading rope. Can be hammered in with weapons or other iron spikes.", + "cost": { "gp": 1 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/lantern.json b/data/gear/lantern.json new file mode 100644 index 0000000..5d1e571 --- /dev/null +++ b/data/gear/lantern.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Lantern", + "description": "Casts light up to a double near distance. Requires oil. Has a shutter to hide the light.", + "cost": { "gp": 5 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/mirror.json b/data/gear/mirror.json new file mode 100644 index 0000000..475a8b9 --- /dev/null +++ b/data/gear/mirror.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Mirror", + "description": "A small, polished mirror.", + "cost": { "gp": 10 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/oil-flask.json b/data/gear/oil-flask.json new file mode 100644 index 0000000..3dbb78c --- /dev/null +++ b/data/gear/oil-flask.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Oil, Flask", + "description": "Fuels a lantern for one hour of real time. One flask covers a close area and burns for 4 rounds, dealing 1d4 damage each round.", + "cost": { "sp": 5 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/pole.json b/data/gear/pole.json new file mode 100644 index 0000000..f12f52c --- /dev/null +++ b/data/gear/pole.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Pole", + "description": "Wooden, 10' long.", + "cost": { "sp": 5 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/rations.json b/data/gear/rations.json new file mode 100644 index 0000000..d8ec29c --- /dev/null +++ b/data/gear/rations.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Rations (3)", + "description": "One day of food and water supply for one person.", + "cost": { "sp": 5 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/rope.json b/data/gear/rope.json new file mode 100644 index 0000000..e381ace --- /dev/null +++ b/data/gear/rope.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Rope, 60'", + "description": "Hemp, 60' long.", + "cost": { "gp": 1 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/gear/torch.json b/data/gear/torch.json new file mode 100644 index 0000000..8151a5c --- /dev/null +++ b/data/gear/torch.json @@ -0,0 +1,8 @@ +{ + "$schema": "../../schema/item.json", + "name": "Torch", + "description": "Sheds light to a near distance. Burns for one hour of real time.", + "cost": { "sp": 5 }, + "slots": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/aboleth.json b/data/monster/aboleth.json new file mode 100644 index 0000000..8d17c9e --- /dev/null +++ b/data/monster/aboleth.json @@ -0,0 +1,21 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Aboleth", + "description": "Enormous, antediluvian catfish covered in slime and tentacles. They hate all intelligent beings.", + "ac": 16, + "hp": 39, + "attacks": [ + { "name": "tentacle", "count": 2, "range": "Near", "bonus": 5, "damage": "1d8", "special": "curse" }, + { "name": "tail", "count": 1, "bonus": 5, "damage": "3d6" } + ], + "movement": "Near (swim)", + "stats": { "str": 4, "dex": -1, "con": 3, "int": 4, "wis": 2, "cha": 2 }, + "alignment": "C", + "level": 8, + "special_abilities": [ + { "name": "Curse", "description": "DC 15 CON or target gains a magical curse, turning into a deep one over 2d10 days." }, + { "name": "Enslave", "description": "In place of attacks, one creature within far must make DC 15 WIS or the aboleth controls it for 1d4 rounds." }, + { "name": "Telepathic", "description": "Read the thoughts of all creatures within far." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/acolyte.json b/data/monster/acolyte.json new file mode 100644 index 0000000..2863d60 --- /dev/null +++ b/data/monster/acolyte.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Acolyte", + "description": "A religious trainee who knows basic rites and rituals.", + "ac": 12, + "hp": 4, + "attacks": [ + { "name": "mace", "count": 1, "bonus": 1, "damage": "1d6" }, + { "name": "spell", "count": 1, "bonus": 2, "damage": "1d4" } + ], + "movement": "Near", + "stats": { "str": 1, "dex": -1, "con": 0, "int": -1, "wis": 2, "cha": 0 }, + "alignment": "L", + "level": 1, + "special_abilities": [ + { "name": "Healing Touch (WIS Spell)", "description": "DC 11. Heal one creature within close for 1d4 HP." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/animated-armor.json b/data/monster/animated-armor.json new file mode 100644 index 0000000..211ffd3 --- /dev/null +++ b/data/monster/animated-armor.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Animated Armor", + "description": "An old suit of armor magically animated by a vengeful spirit.", + "ac": 15, + "hp": 11, + "attacks": [ + { "name": "longsword", "count": 1, "bonus": 3, "damage": "1d8" } + ], + "movement": "Near", + "stats": { "str": 3, "dex": -1, "con": 2, "int": -1, "wis": 1, "cha": 0 }, + "alignment": "C", + "level": 2, + "special_abilities": [ + { "name": "Statue", "description": "When standing still, looks exactly like a suit of armor." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/bandit.json b/data/monster/bandit.json new file mode 100644 index 0000000..9ea6358 --- /dev/null +++ b/data/monster/bandit.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Bandit", + "description": "Hard-bitten rogue in tattered leathers and a hooded cloak.", + "ac": 13, + "hp": 4, + "attacks": [ + { "name": "club", "count": 1, "bonus": 1, "damage": "1d4" }, + { "name": "shortbow", "count": 1, "range": "Far", "bonus": 0, "damage": "1d4" } + ], + "movement": "Near", + "stats": { "str": 1, "dex": 0, "con": 0, "int": -1, "wis": 0, "cha": -1 }, + "alignment": "C", + "level": 1, + "special_abilities": [ + { "name": "Ambush", "description": "Deal an extra die of damage when undetected." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/bat-giant.json b/data/monster/bat-giant.json new file mode 100644 index 0000000..7256ef4 --- /dev/null +++ b/data/monster/bat-giant.json @@ -0,0 +1,15 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Bat, Giant", + "description": "Leathery, eagle-sized mammal with a taste for flesh.", + "ac": 12, + "hp": 9, + "attacks": [ + { "name": "bite", "count": 1, "bonus": 2, "damage": "1d6" } + ], + "movement": "Near (fly)", + "stats": { "str": -1, "dex": 2, "con": 0, "int": -3, "wis": 1, "cha": -3 }, + "alignment": "N", + "level": 2, + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/bear-brown.json b/data/monster/bear-brown.json new file mode 100644 index 0000000..f9b945b --- /dev/null +++ b/data/monster/bear-brown.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Bear, Brown", + "description": "A hulking, swaying brute with claws as long as a finger.", + "ac": 13, + "hp": 25, + "attacks": [ + { "name": "claw", "count": 2, "bonus": 4, "damage": "1d8" } + ], + "movement": "Near (climb)", + "stats": { "str": 4, "dex": 1, "con": 3, "int": -2, "wis": 1, "cha": -2 }, + "alignment": "N", + "level": 5, + "special_abilities": [ + { "name": "Crush", "description": "Deals an extra die of damage if it hits the same target with both claws." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/beastman.json b/data/monster/beastman.json new file mode 100644 index 0000000..8364548 --- /dev/null +++ b/data/monster/beastman.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Beastman", + "description": "A cave hominid with scraggly fur and a stone-tipped spear.", + "ac": 12, + "hp": 5, + "attacks": [ + { "name": "spear", "count": 1, "bonus": 2, "damage": "1d6" } + ], + "movement": "Near", + "stats": { "str": 2, "dex": 1, "con": 1, "int": -2, "wis": 1, "cha": -1 }, + "alignment": "C", + "level": 1, + "special_abilities": [ + { "name": "Brutal", "description": "+1 damage with melee weapons (included in damage)." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/boar.json b/data/monster/boar.json new file mode 100644 index 0000000..da5d009 --- /dev/null +++ b/data/monster/boar.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Boar", + "description": "Ornery wild pig with bristly, russet hair and yellowed tusks.", + "ac": 12, + "hp": 14, + "attacks": [ + { "name": "tusk", "count": 2, "bonus": 3, "damage": "1d6" } + ], + "movement": "Near", + "stats": { "str": 3, "dex": 0, "con": 1, "int": -2, "wis": 1, "cha": -2 }, + "alignment": "N", + "level": 3, + "special_abilities": [ + { "name": "Gore", "description": "Deals an extra die of damage if it hits the same target with both tusks." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/cave-brute.json b/data/monster/cave-brute.json new file mode 100644 index 0000000..4d0535f --- /dev/null +++ b/data/monster/cave-brute.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Cave Brute", + "description": "A hulking, insectoid beast with long mandibles, four eyes, and thick arms covered in bristles.", + "ac": 14, + "hp": 28, + "attacks": [ + { "name": "claw", "count": 2, "bonus": 5, "damage": "1d8" }, + { "name": "mandible", "count": 1, "bonus": 5, "damage": "1d10" } + ], + "movement": "Near (burrow)", + "stats": { "str": 4, "dex": 1, "con": 1, "int": -3, "wis": 1, "cha": -3 }, + "alignment": "N", + "level": 6, + "special_abilities": [ + { "name": "Bewilder", "description": "Creatures within near that see the cave brute's eyes must make DC 12 CHA at the start of their turn or be dazed and lose their action." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/cave-creeper.json b/data/monster/cave-creeper.json new file mode 100644 index 0000000..a9a9620 --- /dev/null +++ b/data/monster/cave-creeper.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Cave Creeper", + "description": "Chittering centipedes the size of horses with grasping tentacles.", + "ac": 12, + "hp": 18, + "attacks": [ + { "name": "bite", "count": 1, "bonus": 3, "damage": "1d6" }, + { "name": "tentacles", "count": 1, "bonus": 3, "damage": "1d8", "special": "toxin" } + ], + "movement": "Near (climb)", + "stats": { "str": 2, "dex": 2, "con": 0, "int": -3, "wis": 1, "cha": -3 }, + "alignment": "N", + "level": 4, + "special_abilities": [ + { "name": "Toxin", "description": "DC 12 CON or paralyzed 1d4 rounds." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/crocodile.json b/data/monster/crocodile.json new file mode 100644 index 0000000..bbab506 --- /dev/null +++ b/data/monster/crocodile.json @@ -0,0 +1,15 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Crocodile", + "description": "Fat, scaly reptiles with stumpy legs and long, thrashing tails.", + "ac": 14, + "hp": 20, + "attacks": [ + { "name": "bite", "count": 2, "bonus": 3, "damage": "1d8" } + ], + "movement": "Near (swim)", + "stats": { "str": 3, "dex": 1, "con": 2, "int": -2, "wis": 1, "cha": -2 }, + "alignment": "N", + "level": 4, + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/cultist.json b/data/monster/cultist.json new file mode 100644 index 0000000..c5cdb4b --- /dev/null +++ b/data/monster/cultist.json @@ -0,0 +1,20 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Cultist", + "description": "A cloaked, wild-eyed zealot chanting the guttural prayers of a dark god.", + "ac": 14, + "hp": 9, + "attacks": [ + { "name": "longsword", "count": 1, "bonus": 1, "damage": "1d8" }, + { "name": "spell", "count": 1, "bonus": 2, "damage": "2d4" } + ], + "movement": "Near", + "stats": { "str": 1, "dex": -1, "con": 0, "int": -1, "wis": 2, "cha": 0 }, + "alignment": "C", + "level": 2, + "special_abilities": [ + { "name": "Fearless", "description": "Immune to morale checks." }, + { "name": "Deathtouch (WIS Spell)", "description": "DC 12. 2d4 damage to one creature within close." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/darkmantle.json b/data/monster/darkmantle.json new file mode 100644 index 0000000..6805f73 --- /dev/null +++ b/data/monster/darkmantle.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Darkmantle", + "description": "A floating, black octopus with rows of red eyes and a webbed skirt of tentacles.", + "ac": 13, + "hp": 4, + "attacks": [ + { "name": "bite", "count": 1, "bonus": 3, "damage": "1d4" } + ], + "movement": "Near (fly)", + "stats": { "str": -2, "dex": 3, "con": 0, "int": -3, "wis": 0, "cha": -3 }, + "alignment": "N", + "level": 1, + "special_abilities": [ + { "name": "Darkness", "description": "Extinguish all light sources within near." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/dragon-swamp.json b/data/monster/dragon-swamp.json new file mode 100644 index 0000000..e8ab283 --- /dev/null +++ b/data/monster/dragon-swamp.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Dragon, Swamp", + "description": "This black, wingless beast slithers through dank swamps.", + "ac": 16, + "hp": 58, + "attacks": [ + { "name": "rend", "count": 3, "bonus": 8, "damage": "2d10" } + ], + "movement": "Double Near (burrow, swim)", + "stats": { "str": 5, "dex": 3, "con": 4, "int": 4, "wis": 3, "cha": 3 }, + "alignment": "C", + "level": 12, + "special_abilities": [ + { "name": "Smog Breath", "description": "Fills a near-sized cube extending from the dragon. DC 15 CON or 2d10 damage and blinded for 1 round." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/dryad.json b/data/monster/dryad.json new file mode 100644 index 0000000..600f689 --- /dev/null +++ b/data/monster/dryad.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Dryad", + "description": "A coy, emerald-skinned fey covered in leaves. It bonds with and protects a tree.", + "ac": 13, + "hp": 19, + "attacks": [ + { "name": "staff", "count": 1, "bonus": -1, "damage": "1d4" } + ], + "movement": "Near", + "stats": { "str": -1, "dex": 2, "con": 1, "int": 1, "wis": 3, "cha": 4 }, + "alignment": "N", + "level": 4, + "special_abilities": [ + { "name": "Charm", "description": "Near range, one creature, DC 14 CHA or friendship for 1d8 days." }, + { "name": "Meld", "description": "Step inside bonded tree." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/dung-beetle-giant.json b/data/monster/dung-beetle-giant.json new file mode 100644 index 0000000..4dc2406 --- /dev/null +++ b/data/monster/dung-beetle-giant.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Dung Beetle, Giant", + "description": "A trundling, barrel-sized beetle with a T-shaped horn.", + "ac": 13, + "hp": 10, + "attacks": [ + { "name": "horn", "count": 1, "bonus": 1, "damage": "1d4", "special": "knock" } + ], + "movement": "Near", + "stats": { "str": 1, "dex": -1, "con": 1, "int": -3, "wis": -1, "cha": -3 }, + "alignment": "N", + "level": 2, + "special_abilities": [ + { "name": "Knock", "description": "DC 9 STR or pushed a close distance and fall down." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/ettercap.json b/data/monster/ettercap.json new file mode 100644 index 0000000..8bd8dbe --- /dev/null +++ b/data/monster/ettercap.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Ettercap", + "description": "Bipedal, eight-eyed spiderfolk with spindly legs and purple fur.", + "ac": 12, + "hp": 14, + "attacks": [ + { "name": "bite", "count": 2, "bonus": 2, "damage": "1d6" }, + { "name": "poison web", "count": 1, "range": "Near", "bonus": 2, "damage": "1d4", "special": "stuck" } + ], + "movement": "Near (climb)", + "stats": { "str": 0, "dex": 2, "con": 1, "int": 0, "wis": 0, "cha": -1 }, + "alignment": "C", + "level": 3, + "special_abilities": [ + { "name": "Poison Web", "description": "One target stuck in place and takes 1d4 damage per round. DC 12 DEX on turn to escape." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/fairy.json b/data/monster/fairy.json new file mode 100644 index 0000000..a9324de --- /dev/null +++ b/data/monster/fairy.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Fairy", + "description": "Miniature fey folk with fluttering moth or butterfly wings.", + "ac": 13, + "hp": 4, + "attacks": [ + { "name": "needle", "count": 1, "bonus": 3, "damage": "1", "special": "poison" } + ], + "movement": "Near (fly)", + "stats": { "str": -2, "dex": 3, "con": 0, "int": 1, "wis": 0, "cha": 1 }, + "alignment": "N", + "level": 1, + "special_abilities": [ + { "name": "Poison", "description": "DC 12 CON or fall into deep sleep for 1d4 hours." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/gelatinous-cube.json b/data/monster/gelatinous-cube.json new file mode 100644 index 0000000..3829b8f --- /dev/null +++ b/data/monster/gelatinous-cube.json @@ -0,0 +1,20 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Gelatinous Cube", + "description": "A translucent cube of slime that silently mows through tunnels.", + "ac": 11, + "hp": 24, + "attacks": [ + { "name": "touch", "count": 1, "bonus": 4, "damage": "1d8", "special": "toxin + engulf" } + ], + "movement": "Near", + "stats": { "str": 3, "dex": 1, "con": 2, "int": -4, "wis": 1, "cha": -4 }, + "alignment": "N", + "level": 5, + "special_abilities": [ + { "name": "Engulf", "description": "DC 12 STR or trapped inside cube. Touch attack auto-hits engulfed targets each round. DC 12 STR on turn to escape. Fail checks if paralyzed." }, + { "name": "Rubbery", "description": "Half damage from stabbing weapons." }, + { "name": "Toxin", "description": "DC 15 CON or paralyzed 1d4 rounds." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/ghost.json b/data/monster/ghost.json new file mode 100644 index 0000000..3f143cf --- /dev/null +++ b/data/monster/ghost.json @@ -0,0 +1,21 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Ghost", + "description": "A wavering spirit with a face contorted in rage or sadness.", + "ac": 13, + "hp": 27, + "attacks": [ + { "name": "death touch", "count": 2, "bonus": 5, "damage": "1d8", "special": "life drain" } + ], + "movement": "Near (fly)", + "stats": { "str": -2, "dex": 3, "con": 0, "int": 0, "wis": 0, "cha": 4 }, + "alignment": "C", + "level": 6, + "special_abilities": [ + { "name": "Greater Undead", "description": "Immune to morale checks. Only damaged by silver or magical sources." }, + { "name": "Incorporeal", "description": "In place of attacks, become corporeal or incorporeal." }, + { "name": "Life Drain", "description": "1d4 CON damage. Death if reduced to 0 CON." }, + { "name": "Possess", "description": "Must be corporeal. One target, close range. Contested CHA check. If ghost wins, it inhabits target's body and controls it for 2d4 rounds." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/gnome-deep.json b/data/monster/gnome-deep.json new file mode 100644 index 0000000..1b39823 --- /dev/null +++ b/data/monster/gnome-deep.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Gnome, Deep", + "description": "Gray-skinned, white-haired fey the size of halflings. They hunt for gems and rare cave flora.", + "ac": 14, + "hp": 14, + "attacks": [ + { "name": "pick", "count": 1, "bonus": 3, "damage": "1d6" }, + { "name": "dart", "count": 1, "range": "Near", "bonus": 2, "damage": "1d4" } + ], + "movement": "Near", + "stats": { "str": 2, "dex": 1, "con": 1, "int": 1, "wis": 1, "cha": 1 }, + "alignment": "L", + "level": 3, + "special_abilities": [ + { "name": "Stone Meld", "description": "2/day, underground only. Turn invisible for 3 rounds." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/goblin.json b/data/monster/goblin.json new file mode 100644 index 0000000..86344ff --- /dev/null +++ b/data/monster/goblin.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Goblin", + "description": "A short, hairless humanoid with green skin and pointy ears.", + "ac": 11, + "hp": 5, + "attacks": [ + { "name": "club", "count": 1, "bonus": 0, "damage": "1d4" }, + { "name": "shortbow", "count": 1, "range": "Far", "bonus": 1, "damage": "1d4" } + ], + "movement": "Near", + "stats": { "str": 0, "dex": 1, "con": 1, "int": -1, "wis": -1, "cha": -2 }, + "alignment": "C", + "level": 1, + "special_abilities": [ + { "name": "Keen Senses", "description": "Can't be surprised." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/golem-stone.json b/data/monster/golem-stone.json new file mode 100644 index 0000000..50e6d0c --- /dev/null +++ b/data/monster/golem-stone.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Golem, Stone", + "description": "A wide-limbed, lumbering statue that shakes the ground.", + "ac": 18, + "hp": 40, + "attacks": [ + { "name": "slam", "count": 3, "bonus": 6, "damage": "1d10" } + ], + "movement": "Near", + "stats": { "str": 4, "dex": -1, "con": 4, "int": -2, "wis": 0, "cha": -2 }, + "alignment": "N", + "level": 8, + "special_abilities": [ + { "name": "Golem", "description": "Immune to damage from fire, cold, electricity, or non-magical sources." }, + { "name": "Slow", "description": "Far range, one target. DC 15 CON or speed halved 1d4 rounds." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/grick.json b/data/monster/grick.json new file mode 100644 index 0000000..772f91e --- /dev/null +++ b/data/monster/grick.json @@ -0,0 +1,20 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Grick", + "description": "A huge worm with four suckered tentacles and a snapping beak.", + "ac": 14, + "hp": 19, + "attacks": [ + { "name": "beak", "count": 1, "bonus": 3, "damage": "1d8" }, + { "name": "tentacle", "count": 1, "bonus": 3, "damage": "1d6", "special": "grab" } + ], + "movement": "Near (climb)", + "stats": { "str": 3, "dex": 2, "con": 1, "int": -3, "wis": 1, "cha": -3 }, + "alignment": "N", + "level": 4, + "special_abilities": [ + { "name": "Camouflage", "description": "Hard to see in cave terrain or rocks." }, + { "name": "Grab", "description": "Target is immobilized. DC 15 Strength check on turn to break free." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/hobgoblin.json b/data/monster/hobgoblin.json new file mode 100644 index 0000000..0830825 --- /dev/null +++ b/data/monster/hobgoblin.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Hobgoblin", + "description": "A sturdy, tall goblin with russet skin. Militant and strategic.", + "ac": 15, + "hp": 10, + "attacks": [ + { "name": "longsword", "count": 1, "bonus": 3, "damage": "1d8" }, + { "name": "longbow", "count": 1, "range": "Far", "bonus": 0, "damage": "1d8" } + ], + "movement": "Near", + "stats": { "str": 3, "dex": 0, "con": 1, "int": 2, "wis": 1, "cha": 1 }, + "alignment": "C", + "level": 2, + "special_abilities": [ + { "name": "Phalanx", "description": "+1 to attacks and AC when in close range of an allied hobgoblin." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/knight.json b/data/monster/knight.json new file mode 100644 index 0000000..08b3eea --- /dev/null +++ b/data/monster/knight.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Knight", + "description": "A warrior in shining plate mail and the surcoat of a knightly order.", + "ac": 17, + "hp": 14, + "attacks": [ + { "name": "bastard sword", "count": 2, "bonus": 3, "damage": "1d8" } + ], + "movement": "Near", + "stats": { "str": 3, "dex": 0, "con": 1, "int": 0, "wis": 0, "cha": 1 }, + "alignment": "L", + "level": 3, + "special_abilities": [ + { "name": "Oath", "description": "3/day, advantage on a roll made in service of the knight's order." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/kobold.json b/data/monster/kobold.json new file mode 100644 index 0000000..1fbaacf --- /dev/null +++ b/data/monster/kobold.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Kobold", + "description": "Puny, scaled coyote-lizards that dwell underground.", + "ac": 13, + "hp": 1, + "attacks": [ + { "name": "spear", "count": 1, "bonus": 0, "damage": "1d6" } + ], + "movement": "Near", + "stats": { "str": -2, "dex": 2, "con": 0, "int": -1, "wis": 0, "cha": -1 }, + "alignment": "C", + "level": 0, + "special_abilities": [ + { "name": "Dodge", "description": "1/day, an attack that would hit misses instead." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/leech-giant.json b/data/monster/leech-giant.json new file mode 100644 index 0000000..99c183d --- /dev/null +++ b/data/monster/leech-giant.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Leech, Giant", + "description": "A glossy black, blood-drinking slug as large as a cat.", + "ac": 9, + "hp": 10, + "attacks": [ + { "name": "bite", "count": 1, "bonus": 1, "damage": "1d4", "special": "attach" } + ], + "movement": "Near (swim)", + "stats": { "str": 1, "dex": -1, "con": 1, "int": -3, "wis": -1, "cha": -3 }, + "alignment": "N", + "level": 2, + "special_abilities": [ + { "name": "Attach", "description": "Attach to target; bite auto-hits next round. DC 12 STR on turn to tear off." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/minotaur.json b/data/monster/minotaur.json new file mode 100644 index 0000000..8339dbb --- /dev/null +++ b/data/monster/minotaur.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Minotaur", + "description": "Ferocious bull-men with hooves and curved horns. They live in mazelike tunnels.", + "ac": 14, + "hp": 34, + "attacks": [ + { "name": "greataxe", "count": 2, "bonus": 6, "damage": "1d10" }, + { "name": "horns", "count": 1, "bonus": 6, "damage": "1d12" } + ], + "movement": "Near", + "stats": { "str": 4, "dex": 1, "con": 3, "int": 1, "wis": 2, "cha": 1 }, + "alignment": "C", + "level": 7, + "special_abilities": [ + { "name": "Charge", "description": "In place of attacks, move up to double near in a straight line and make 1 horn attack. If hit, deals x2 damage." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/moose.json b/data/monster/moose.json new file mode 100644 index 0000000..7fdc2b3 --- /dev/null +++ b/data/monster/moose.json @@ -0,0 +1,15 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Moose", + "description": "A towering, brown-haired grazer with weighty, flat antlers.", + "ac": 11, + "hp": 19, + "attacks": [ + { "name": "antler", "count": 2, "bonus": 3, "damage": "1d6" } + ], + "movement": "Double Near", + "stats": { "str": 3, "dex": 0, "con": 1, "int": -2, "wis": 0, "cha": -2 }, + "alignment": "N", + "level": 4, + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/ochre-jelly.json b/data/monster/ochre-jelly.json new file mode 100644 index 0000000..e35b437 --- /dev/null +++ b/data/monster/ochre-jelly.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Ochre Jelly", + "description": "An orange puddle of quivering slime.", + "ac": 9, + "hp": 20, + "attacks": [ + { "name": "tentacle", "count": 2, "bonus": 3, "damage": "1d6" } + ], + "movement": "Near (climb)", + "stats": { "str": 2, "dex": -1, "con": 2, "int": -4, "wis": -3, "cha": -4 }, + "alignment": "N", + "level": 4, + "special_abilities": [ + { "name": "Split", "description": "If cut or chopped, splits into two smaller oozes (divide remaining HP between both). Can split up to four times." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/ogre.json b/data/monster/ogre.json new file mode 100644 index 0000000..132f5d8 --- /dev/null +++ b/data/monster/ogre.json @@ -0,0 +1,15 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Ogre", + "description": "A massive, dim-witted brute with tusks and a heavy frame. Often lords over goblins or orcs.", + "ac": 9, + "hp": 30, + "attacks": [ + { "name": "greatclub", "count": 2, "bonus": 6, "damage": "2d6" } + ], + "movement": "Near", + "stats": { "str": 4, "dex": -1, "con": 3, "int": -2, "wis": -2, "cha": -2 }, + "alignment": "C", + "level": 6, + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/orc.json b/data/monster/orc.json new file mode 100644 index 0000000..6cbc51b --- /dev/null +++ b/data/monster/orc.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Orc", + "description": "A tusked, tall humanoid with gray skin and pointed ears.", + "ac": 15, + "hp": 4, + "attacks": [ + { "name": "greataxe", "count": 1, "bonus": 2, "damage": "1d8" } + ], + "movement": "Near", + "stats": { "str": 2, "dex": 0, "con": 0, "int": -1, "wis": 0, "cha": -1 }, + "alignment": "C", + "level": 1, + "special_abilities": [ + { "name": "Rage", "description": "1/day, immune to morale checks and deals +1d4 damage for 3 rounds." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/peasant.json b/data/monster/peasant.json new file mode 100644 index 0000000..6926700 --- /dev/null +++ b/data/monster/peasant.json @@ -0,0 +1,15 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Peasant", + "description": "A commoner in worn clothes.", + "ac": 10, + "hp": 4, + "attacks": [ + { "name": "club", "count": 1, "bonus": 0, "damage": "1d4" } + ], + "movement": "Near", + "stats": { "str": 0, "dex": 0, "con": 0, "int": 0, "wis": 0, "cha": 0 }, + "alignment": "L", + "level": 1, + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/rat-giant.json b/data/monster/rat-giant.json new file mode 100644 index 0000000..43358c2 --- /dev/null +++ b/data/monster/rat-giant.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Rat, Giant", + "description": "Cunning rats as large as cats. Mangy fur and wormlike tails.", + "ac": 11, + "hp": 5, + "attacks": [ + { "name": "bite", "count": 1, "bonus": 1, "damage": "1d4", "special": "disease" } + ], + "movement": "Near", + "stats": { "str": -2, "dex": 1, "con": 1, "int": -2, "wis": 1, "cha": -2 }, + "alignment": "N", + "level": 1, + "special_abilities": [ + { "name": "Disease", "description": "DC 12 CON or 1d4 CON damage (can't heal while ill). Repeat check once per day; ends on success. Die at 0 CON." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/reaver.json b/data/monster/reaver.json new file mode 100644 index 0000000..d2aa8e1 --- /dev/null +++ b/data/monster/reaver.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Reaver", + "description": "A knight in blackened armor riddled with cruel barbs.", + "ac": 17, + "hp": 28, + "attacks": [ + { "name": "bastard sword", "count": 3, "bonus": 4, "damage": "1d8" } + ], + "movement": "Near", + "stats": { "str": 3, "dex": 0, "con": 1, "int": 0, "wis": 0, "cha": 2 }, + "alignment": "C", + "level": 6, + "special_abilities": [ + { "name": "Bloodlust", "description": "+2 damage with melee weapons (included in damage)." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/rust-monster.json b/data/monster/rust-monster.json new file mode 100644 index 0000000..03ba636 --- /dev/null +++ b/data/monster/rust-monster.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Rust Monster", + "description": "A mud-brown insect as big as a wolf with two feathery antennae. Consumes metal.", + "ac": 13, + "hp": 19, + "attacks": [ + { "name": "claw", "count": 2, "bonus": 3, "damage": "1d6" } + ], + "movement": "Near (climb)", + "stats": { "str": 2, "dex": 3, "con": 1, "int": -3, "wis": 1, "cha": -3 }, + "alignment": "N", + "level": 4, + "special_abilities": [ + { "name": "Corrosive", "description": "Metal that touches the rust monster is destroyed on a d6 roll of 1-3." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/scarab-swarm.json b/data/monster/scarab-swarm.json new file mode 100644 index 0000000..fb7b6bb --- /dev/null +++ b/data/monster/scarab-swarm.json @@ -0,0 +1,15 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Scarab, Swarm", + "description": "A chittering cloud of iridescent, oval-shaped beetles.", + "ac": 13, + "hp": 14, + "attacks": [ + { "name": "bite", "count": 2, "bonus": 3, "damage": "1d6" } + ], + "movement": "Near (fly)", + "stats": { "str": -1, "dex": 3, "con": 1, "int": -3, "wis": 0, "cha": -3 }, + "alignment": "N", + "level": 3, + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/skeleton.json b/data/monster/skeleton.json new file mode 100644 index 0000000..65b8f1c --- /dev/null +++ b/data/monster/skeleton.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Skeleton", + "description": "A bleach-boned skeleton with red pinpoints of light in its eyes.", + "ac": 13, + "hp": 11, + "attacks": [ + { "name": "shortsword", "count": 1, "bonus": 1, "damage": "1d6" }, + { "name": "shortbow", "count": 1, "range": "Far", "bonus": 0, "damage": "1d4" } + ], + "movement": "Near", + "stats": { "str": 1, "dex": 0, "con": 2, "int": -2, "wis": 0, "cha": -1 }, + "alignment": "C", + "level": 2, + "special_abilities": [ + { "name": "Undead", "description": "Immune to morale checks." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/snake-giant.json b/data/monster/snake-giant.json new file mode 100644 index 0000000..2517907 --- /dev/null +++ b/data/monster/snake-giant.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Snake, Giant", + "description": "An enormous, mottled serpent that can swallow a cow whole.", + "ac": 12, + "hp": 23, + "attacks": [ + { "name": "bite", "count": 2, "bonus": 4, "damage": "1d6" }, + { "name": "constrict", "count": 1, "range": "Near", "bonus": 4, "damage": "1d6", "special": "immobilize" } + ], + "movement": "Near (climb)", + "stats": { "str": 3, "dex": 2, "con": 1, "int": -2, "wis": 0, "cha": -2 }, + "alignment": "N", + "level": 5, + "special_abilities": [ + { "name": "Constrict", "description": "Contested STR to hold target immobile for one round." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/soldier.json b/data/monster/soldier.json new file mode 100644 index 0000000..14ec4b4 --- /dev/null +++ b/data/monster/soldier.json @@ -0,0 +1,16 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Soldier", + "description": "An armed footsoldier trained in the ways of battlefield combat.", + "ac": 15, + "hp": 10, + "attacks": [ + { "name": "longsword", "count": 1, "bonus": 2, "damage": "1d8" }, + { "name": "crossbow", "count": 1, "range": "Far", "bonus": 1, "damage": "1d6" } + ], + "movement": "Near", + "stats": { "str": 1, "dex": 0, "con": 1, "int": 0, "wis": 0, "cha": 0 }, + "alignment": "L", + "level": 2, + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/spider-giant.json b/data/monster/spider-giant.json new file mode 100644 index 0000000..aaf1ea5 --- /dev/null +++ b/data/monster/spider-giant.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Spider, Giant", + "description": "Bulbous abdomen and eight, spindly legs. Ambush hunter.", + "ac": 13, + "hp": 13, + "attacks": [ + { "name": "bite", "count": 1, "bonus": 3, "damage": "1d4", "special": "poison" } + ], + "movement": "Near (climb)", + "stats": { "str": 2, "dex": 3, "con": 0, "int": -2, "wis": 1, "cha": -2 }, + "alignment": "N", + "level": 3, + "special_abilities": [ + { "name": "Poison", "description": "DC 12 CON or paralyzed 1d4 hours." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/spider-swarm.json b/data/monster/spider-swarm.json new file mode 100644 index 0000000..4f82566 --- /dev/null +++ b/data/monster/spider-swarm.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Spider, Swarm", + "description": "A scurrying carpet of spiders.", + "ac": 13, + "hp": 9, + "attacks": [ + { "name": "bite", "count": 2, "bonus": 3, "damage": "1d4", "special": "poison" } + ], + "movement": "Near (climb)", + "stats": { "str": -1, "dex": 3, "con": 0, "int": -3, "wis": 1, "cha": -3 }, + "alignment": "N", + "level": 2, + "special_abilities": [ + { "name": "Poison", "description": "DC 12 CON or paralyzed 1d4 rounds." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/stingbat.json b/data/monster/stingbat.json new file mode 100644 index 0000000..372a903 --- /dev/null +++ b/data/monster/stingbat.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Stingbat", + "description": "Darting, orange insect-bat with four wings and a needlelike beak.", + "ac": 12, + "hp": 4, + "attacks": [ + { "name": "beak", "count": 1, "bonus": 2, "damage": "1d4", "special": "blood drain" } + ], + "movement": "Near (fly)", + "stats": { "str": -2, "dex": 2, "con": 0, "int": -2, "wis": 0, "cha": -2 }, + "alignment": "N", + "level": 1, + "special_abilities": [ + { "name": "Blood Drain", "description": "Attach to bitten target; auto-hit the next round. DC 9 STR on turn to remove." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/troll.json b/data/monster/troll.json new file mode 100644 index 0000000..866e4a7 --- /dev/null +++ b/data/monster/troll.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Troll", + "description": "Green, lanky giants with warty skin and territorial rage. Lair in deep forests and swamps.", + "ac": 12, + "hp": 24, + "attacks": [ + { "name": "claw", "count": 2, "bonus": 4, "damage": "1d6" }, + { "name": "bite", "count": 1, "bonus": 4, "damage": "1d10" } + ], + "movement": "Near", + "stats": { "str": 3, "dex": 2, "con": 2, "int": -1, "wis": 0, "cha": -1 }, + "alignment": "C", + "level": 5, + "special_abilities": [ + { "name": "Regenerate", "description": "Regains 2d6 HP on its turn unless its wounds are cauterized with fire or acid." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/unicorn.json b/data/monster/unicorn.json new file mode 100644 index 0000000..594aacf --- /dev/null +++ b/data/monster/unicorn.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Unicorn", + "description": "A silvery horse with a flowing mane and a single spiral horn.", + "ac": 12, + "hp": 20, + "attacks": [ + { "name": "hooves", "count": 1, "bonus": 3, "damage": "1d6" } + ], + "movement": "Double Near", + "stats": { "str": 3, "dex": 2, "con": 2, "int": 1, "wis": 2, "cha": 3 }, + "alignment": "L", + "level": 4, + "special_abilities": [ + { "name": "Healing Horn", "description": "A touch heals 2d6 HP or ends one curse or disease." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/wasp-giant.json b/data/monster/wasp-giant.json new file mode 100644 index 0000000..46b198c --- /dev/null +++ b/data/monster/wasp-giant.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Wasp, Giant", + "description": "Man-sized wasps with glossy, yellow-striped abdomens.", + "ac": 13, + "hp": 9, + "attacks": [ + { "name": "sting", "count": 1, "bonus": 3, "damage": "1d6", "special": "venom" } + ], + "movement": "Near (fly)", + "stats": { "str": 1, "dex": 3, "con": 0, "int": -3, "wis": 0, "cha": -3 }, + "alignment": "N", + "level": 2, + "special_abilities": [ + { "name": "Venom", "description": "DC 9 CON or go to 0 HP." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/weald-hag.json b/data/monster/weald-hag.json new file mode 100644 index 0000000..61f08b3 --- /dev/null +++ b/data/monster/weald-hag.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Weald Hag", + "description": "Eyes dark as moonless nights, skin made of rotting wood, hair of tangled roots and vines.", + "ac": 14, + "hp": 28, + "attacks": [ + { "name": "claw", "count": 2, "bonus": 4, "damage": "1d8" } + ], + "movement": "Near", + "stats": { "str": 3, "dex": 2, "con": 1, "int": 1, "wis": 2, "cha": 3 }, + "alignment": "C", + "level": 6, + "special_abilities": [ + { "name": "Drink Pain", "description": "Near range. DC 12 CHA to deal 2d4 damage to a creature; regain that many HP." }, + { "name": "Shapechange", "description": "Instantly change to look like any other humanoid." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/werewolf.json b/data/monster/werewolf.json new file mode 100644 index 0000000..8ea3031 --- /dev/null +++ b/data/monster/werewolf.json @@ -0,0 +1,19 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Werewolf", + "description": "A bipedal, wolf-faced humanoid covered in brown fur.", + "ac": 12, + "hp": 20, + "attacks": [ + { "name": "rend", "count": 2, "bonus": 3, "damage": "1d6" } + ], + "movement": "Double Near", + "stats": { "str": 3, "dex": 2, "con": 2, "int": 0, "wis": 1, "cha": 0 }, + "alignment": "C", + "level": 4, + "special_abilities": [ + { "name": "Impervious", "description": "Only damaged by silver or magic sources." }, + { "name": "Lycanthropy", "description": "If a character takes 12 or more damage from the same werewolf, they contract lycanthropy." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/wight.json b/data/monster/wight.json new file mode 100644 index 0000000..aa5b2c8 --- /dev/null +++ b/data/monster/wight.json @@ -0,0 +1,20 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Wight", + "description": "A pale, armored undead warrior with sinister intelligence.", + "ac": 14, + "hp": 15, + "attacks": [ + { "name": "bastard sword", "count": 1, "bonus": 3, "damage": "1d10" }, + { "name": "life drain", "count": 1, "bonus": 3, "damage": "1d4", "special": "CON damage" } + ], + "movement": "Near", + "stats": { "str": 3, "dex": 1, "con": 2, "int": 1, "wis": 0, "cha": 3 }, + "alignment": "C", + "level": 3, + "special_abilities": [ + { "name": "Greater Undead", "description": "Immune to morale checks. Only damaged by silver or magical sources." }, + { "name": "Life Drain", "description": "1d4 CON damage. Death if reduced to 0 CON." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/will-o-wisp.json b/data/monster/will-o-wisp.json new file mode 100644 index 0000000..20f686b --- /dev/null +++ b/data/monster/will-o-wisp.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Will-o'-Wisp", + "description": "A bobbing marsh light animated by an evil spirit. It tries to lead the living into danger.", + "ac": 13, + "hp": 10, + "attacks": [ + { "name": "life drain", "count": 1, "bonus": 3, "damage": "1d4", "special": "CON damage" } + ], + "movement": "Near (fly)", + "stats": { "str": -3, "dex": 3, "con": 1, "int": -1, "wis": -1, "cha": -2 }, + "alignment": "C", + "level": 2, + "special_abilities": [ + { "name": "Life Drain", "description": "1d4 CON damage. Death if reduced to 0 CON." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/monster/wolf.json b/data/monster/wolf.json new file mode 100644 index 0000000..ccfd36c --- /dev/null +++ b/data/monster/wolf.json @@ -0,0 +1,18 @@ +{ + "$schema": "../../schema/monster.json", + "name": "Wolf", + "description": "A giant canine with a gray pelt, yellow eyes, and dripping jaws.", + "ac": 12, + "hp": 10, + "attacks": [ + { "name": "bite", "count": 1, "bonus": 2, "damage": "1d6" } + ], + "movement": "Double Near", + "stats": { "str": 2, "dex": 2, "con": 1, "int": -2, "wis": 1, "cha": 0 }, + "alignment": "N", + "level": 2, + "special_abilities": [ + { "name": "Pack Hunter", "description": "Deals +1 damage while an ally is close." } + ], + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/acid-arrow.json b/data/spell/acid-arrow.json new file mode 100644 index 0000000..9b63ee3 --- /dev/null +++ b/data/spell/acid-arrow.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Acid Arrow", + "tier": 2, + "class": ["wizard"], + "duration": "Focus", + "range": "Far", + "description": "You conjure a corrosive bolt that hits one foe, dealing 1d6 damage a round. The bolt remains in the target for as long as you focus.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/alter-self.json b/data/spell/alter-self.json new file mode 100644 index 0000000..6abf68b --- /dev/null +++ b/data/spell/alter-self.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Alter Self", + "tier": 2, + "class": ["wizard"], + "duration": "5 rounds", + "range": "Close", + "description": "You magically change your physical form, gaining one feature that modifies your existing anatomy. For example, you can grow functional gills on your neck or bear claws on your fingers. This spell can't grow wings or limbs.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/augury.json b/data/spell/augury.json new file mode 100644 index 0000000..f8c7e25 --- /dev/null +++ b/data/spell/augury.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Augury", + "tier": 2, + "class": ["priest"], + "duration": "Instant", + "range": "Close", + "description": "You interpret the meaning of supernatural portents and omens. Ask the GM one question about a specific course of action. The GM says whether the action will lead to \"weal\" or \"woe.\"", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/bless.json b/data/spell/bless.json new file mode 100644 index 0000000..77e5e3c --- /dev/null +++ b/data/spell/bless.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Bless", + "tier": 2, + "class": ["priest"], + "duration": "Instant", + "range": "Close", + "description": "One creature you touch gains a luck token.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/blind-deafen.json b/data/spell/blind-deafen.json new file mode 100644 index 0000000..e02959f --- /dev/null +++ b/data/spell/blind-deafen.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Blind/Deafen", + "tier": 2, + "class": ["priest"], + "duration": "Focus", + "range": "Near", + "description": "You utter a divine censure, blinding or deafening one creature you can see in range. The creature has disadvantage on tasks requiring the lost sense.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/cleansing-weapon.json b/data/spell/cleansing-weapon.json new file mode 100644 index 0000000..5b2895b --- /dev/null +++ b/data/spell/cleansing-weapon.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Cleansing Weapon", + "tier": 2, + "class": ["priest"], + "duration": "5 rounds", + "range": "Close", + "description": "One weapon you touch is wreathed in purifying flames. It deals an additional 1d4 damage (1d6 vs. undead) for the duration.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/detect-thoughts.json b/data/spell/detect-thoughts.json new file mode 100644 index 0000000..ab83434 --- /dev/null +++ b/data/spell/detect-thoughts.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Detect Thoughts", + "tier": 2, + "class": ["wizard"], + "duration": "Focus", + "range": "Near", + "description": "You peer into the mind of one creature you can see within the spell's range. Each round, you learn the target's immediate thoughts. On its turn, the target makes a Wisdom check vs. your last spellcasting check. If the target succeeds, it notices your presence in its mind and the spell ends.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/fixed-object.json b/data/spell/fixed-object.json new file mode 100644 index 0000000..475e456 --- /dev/null +++ b/data/spell/fixed-object.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Fixed Object", + "tier": 2, + "class": ["wizard"], + "duration": "5 rounds", + "range": "Close", + "description": "An object you touch that weighs no more than 5 pounds becomes fixed in its current location. It can support up to 5,000 pounds of weight for the duration of the spell.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/hold-person.json b/data/spell/hold-person.json new file mode 100644 index 0000000..b2f546a --- /dev/null +++ b/data/spell/hold-person.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Hold Person", + "tier": 2, + "class": ["wizard"], + "duration": "Focus", + "range": "Near", + "description": "You magically paralyze one humanoid creature of LV 4 or less you can see within range.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/invisibility.json b/data/spell/invisibility.json new file mode 100644 index 0000000..e1e4f55 --- /dev/null +++ b/data/spell/invisibility.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Invisibility", + "tier": 2, + "class": ["wizard"], + "duration": "10 rounds", + "range": "Close", + "description": "A creature you touch becomes invisible for the spell's duration. The spell ends if the target attacks or casts a spell.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/knock.json b/data/spell/knock.json new file mode 100644 index 0000000..bc77b2f --- /dev/null +++ b/data/spell/knock.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Knock", + "tier": 2, + "class": ["wizard"], + "duration": "Instant", + "range": "Near", + "description": "A door, window, gate, chest, or portal you can see within range instantly opens, defeating all mundane locks and barriers. This spell creates a loud knock audible to all within earshot.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/levitate.json b/data/spell/levitate.json new file mode 100644 index 0000000..ee2341f --- /dev/null +++ b/data/spell/levitate.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Levitate", + "tier": 2, + "class": ["wizard"], + "duration": "Focus", + "range": "Close", + "description": "You can float a near distance vertically per round on your turn. You can also push against solid objects to move horizontally.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/mirror-image.json b/data/spell/mirror-image.json new file mode 100644 index 0000000..776ed4b --- /dev/null +++ b/data/spell/mirror-image.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Mirror Image", + "tier": 2, + "class": ["wizard"], + "duration": "5 rounds", + "range": "Close", + "description": "You create a number of illusory duplicates of yourself equal to half your level rounded down (minimum 1). The duplicates surround you and mimic you. Each time a creature attacks you, the attack misses and causes one of the duplicates to evaporate. If all of the illusions have disappeared, the spell ends.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/misty-step.json b/data/spell/misty-step.json new file mode 100644 index 0000000..b7fb83a --- /dev/null +++ b/data/spell/misty-step.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Misty Step", + "tier": 2, + "class": ["wizard"], + "duration": "Instant", + "range": "Close", + "description": "In a puff of smoke, you teleport a near distance to an area you can see.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/silence.json b/data/spell/silence.json new file mode 100644 index 0000000..092ca35 --- /dev/null +++ b/data/spell/silence.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Silence", + "tier": 2, + "class": ["wizard"], + "duration": "Focus", + "range": "Far", + "description": "You magically mute sound in a near cube within the spell's range. Creatures inside the area are deafened, and any sounds they create cannot be heard.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/smite.json b/data/spell/smite.json new file mode 100644 index 0000000..c5da951 --- /dev/null +++ b/data/spell/smite.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Smite", + "tier": 2, + "class": ["priest"], + "duration": "Instant", + "range": "Near", + "description": "You call down punishing flames on a creature you can see within range. It takes 1d6 damage.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/web.json b/data/spell/web.json new file mode 100644 index 0000000..73cd242 --- /dev/null +++ b/data/spell/web.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Web", + "tier": 2, + "class": ["wizard"], + "duration": "5 rounds", + "range": "Far", + "description": "You create a near-sized cube of sticky, dense spider web within the spell's range. A creature stuck in the web can't move and must succeed on a Strength check vs. your spellcasting check to free itself.", + "source": "data/source/quickstart-set.json" +} diff --git a/data/spell/zone-of-truth.json b/data/spell/zone-of-truth.json new file mode 100644 index 0000000..f6c299b --- /dev/null +++ b/data/spell/zone-of-truth.json @@ -0,0 +1,10 @@ +{ + "$schema": "../../schema/spell.json", + "name": "Zone of Truth", + "tier": 2, + "class": ["priest"], + "duration": "Focus", + "range": "Near", + "description": "You compel a creature you can see to speak truth. It can't utter a deliberate lie while within range.", + "source": "data/source/quickstart-set.json" +} diff --git a/schema/monster.json b/schema/monster.json new file mode 100644 index 0000000..d8bac44 --- /dev/null +++ b/schema/monster.json @@ -0,0 +1,78 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Monster", + "type": "object", + "required": ["name", "ac", "hp", "attacks", "movement", "stats", "alignment", "level"], + "properties": { + "name": { + "type": "string", + "description": "The monster's name." + }, + "description": { + "type": "string", + "description": "Flavor text describing the monster." + }, + "ac": { + "type": "number", + "description": "Armor class." + }, + "hp": { + "type": "number", + "description": "Average hit points." + }, + "attacks": { + "type": "array", + "description": "List of attacks the monster can make.", + "items": { + "type": "object", + "required": ["name", "bonus", "damage"], + "properties": { + "name": { "type": "string" }, + "count": { "type": "number", "default": 1 }, + "range": { "$ref": "./distance.json" }, + "bonus": { "type": "number" }, + "damage": { "type": "string" }, + "special": { "type": "string" } + } + } + }, + "movement": { + "type": "string", + "description": "Movement speed and mode (e.g. 'Near', 'Near (fly)', 'Double Near')." + }, + "stats": { + "type": "object", + "required": ["str", "dex", "con", "int", "wis", "cha"], + "properties": { + "str": { "type": "number" }, + "dex": { "type": "number" }, + "con": { "type": "number" }, + "int": { "type": "number" }, + "wis": { "type": "number" }, + "cha": { "type": "number" } + } + }, + "alignment": { + "type": "string", + "enum": ["L", "N", "C"], + "description": "Lawful, Neutral, or Chaotic." + }, + "level": { + "type": "number", + "minimum": 0, + "description": "Monster level." + }, + "special_abilities": { + "type": "array", + "items": { + "type": "object", + "required": ["name", "description"], + "properties": { + "name": { "type": "string" }, + "description": { "type": "string" } + } + } + }, + "source": { "type": "string" } + } +}