diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..7b14cde --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,28 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "type": "dart", + "command": "dart", + "cwd": "", + "args": [ + "doc", + "." + ], + "problemMatcher": [], + "label": "dart: dart doc .", + "detail": "" + }, + { + "label": "Auto-fix all fixable problems", + "type": "dart", + "command": "dart", + "detail": "dart fix --apply", + "args": [ + "fix", + "--apply" + ], + "problemMatcher": [] + }, + ] +} diff --git a/lib/alignment.dart b/lib/alignment.dart index 3952010..cbc86fe 100644 --- a/lib/alignment.dart +++ b/lib/alignment.dart @@ -50,6 +50,9 @@ class Alignment with KeyMixin { "key": key, "description": description, }; + + @override + String get displayName => description; } class AlignmentValues { diff --git a/lib/base.dart b/lib/base.dart index 6044b27..6e75e64 100644 --- a/lib/base.dart +++ b/lib/base.dart @@ -1,4 +1,14 @@ +import 'package:dungeon_world_data/dungeon_world_data.dart'; + mixin KeyMixin { /// This entity's unique key abstract final String key; + + String get displayName; + + EntityReference get reference => EntityReference( + key: key, + name: displayName, + type: runtimeType.toString(), + ); } diff --git a/lib/character_class.dart b/lib/character_class.dart index b13beea..b58d04a 100644 --- a/lib/character_class.dart +++ b/lib/character_class.dart @@ -106,4 +106,7 @@ class CharacterClass with KeyMixin { "bonds": List.from(bonds.map((x) => x)), "gearChoices": List.from(gearChoices.map((x) => x.toJson())), }; + + @override + String get displayName => name; } diff --git a/lib/data/classes.dart b/lib/data/classes.dart index e793b2f..872f2f5 100644 --- a/lib/data/classes.dart +++ b/lib/data/classes.dart @@ -1668,7 +1668,12 @@ List getCharacterClassList() => [ "neutral": "Help an animal or spirit of the wild.", "chaotic": "Free someone from literal or figurative bonds." }, - "bonds": [], + "bonds": [ + "I have guided ______________________ before and they owe me for it.", + "______________________ is a friend of nature, so I will be their friend as well.", + "______________________ has no respect for nature, so I have no respect for them.", + "______________________ does not understand life in the wild, so I will teach them.", + ], "gearChoices": [ { "key": "b81a5df6-2a18-4880-a664-6b07b34f2219", @@ -1827,7 +1832,7 @@ List getCharacterClassList() => [ "description": "Choose one", "selections": [ { - "key": "adventuring_gear", + "key": "adventuring_gear_and_dungeon_rations", "description": "Adventuring Gear", "options": [ { @@ -1855,12 +1860,42 @@ List getCharacterClassList() => [ ] }, "amount": 1.0 - } + }, + { + "key": "dungeon_rations", + "item": { + "_meta": {"language": "EN", "createdBy": "__repo__"}, + "key": "dungeon_rations", + "name": "Dungeon Rations", + "description": "Not tasty, but not bad either.", + "tags": [ + { + "name": "Ration", + "value": null, + "description": "It's edible, more or less." + }, + {"name": "Uses", "value": 5, "description": "It can only be used n times."}, + { + "name": "Coins", + "value": 3, + "description": + "How much it costs to buy, normally. If the cost includes \"-Charisma\" a little negotiation subtracts the haggler's Charisma score (not modifier) from the price." + }, + { + "name": "Weight", + "value": 1, + "description": + "Count the listed amount against your load. Something with no listed weight isn't designed to be carried. 100 coins in standard denominations is 1 weight. The same value in gems or fine art may be lighter or heavier." + } + ] + }, + "amount": 1.0, + }, ], "coins": 0.0 }, { - "key": "adventuring_gear", + "key": "adventuring_gear_and_bundle_of_arrows", "description": "Adventuring Gear", "options": [ { @@ -1888,6 +1923,35 @@ List getCharacterClassList() => [ ] }, "amount": 1.0 + }, + { + "key": "bundle_of_arrows", + "item": { + "_meta": {"language": "EN", "createdBy": "__repo__"}, + "key": "bundle_of_arrows", + "name": "Bundle of Arrows", + "description": "", + "tags": [ + { + "name": "Ammo", + "value": 3, + "description": + "It counts as ammunition for appropriate ranged weapons. The number indicated does not represent individual arrows or sling stones, but represents what you have left on hand." + }, + { + "name": "Coins", + "value": 1, + "description": + "How much it costs to buy, normally. If the cost includes \"-Charisma\" a little negotiation subtracts the haggler's Charisma score (not modifier) from the price." + }, + { + "name": "Weight", + "value": 1, + "description": + "Count the listed amount against your load. Something with no listed weight isn't designed to be carried. 100 coins in standard denominations is 1 weight. The same value in gems or fine art may be lighter or heavier." + } + ] + }, } ], "coins": 0.0 diff --git a/lib/data/moves.dart b/lib/data/moves.dart index 95e1e79..5edb8f6 100644 --- a/lib/data/moves.dart +++ b/lib/data/moves.dart @@ -268,7 +268,9 @@ List getMoveList() => [ "When you **weave a performance into a basic spell**, choose an ally and an effect:\n\n* Heal 1d8 damage\n* +1d4 forward to damage\n* Their mind is shaken clear of one enchantment\n* The next time someone successfully assists the target with aid, they get +2 instead of +1\n\nThen roll+Cha.\n\n* On a 10+, the ally gets the selected effect.\n* On a 7-9, your spell still works, but you draw unwanted attention or your magic reverberates to other targets affecting them as well, GM's choice", "explanation": "", "dice": ["2d6+CHA", "1d8", "1d4"], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -280,7 +282,9 @@ List getMoveList() => [ "Choose an area of expertise:\n\n* Spells and Magicks\n* The Dead and Undead\n* Grand Histories of the Known World\n* A Bestiary of Creatures Unusual\n* The Planar Spheres\n* Legends of Heroes Past\n* Gods and Their Servants\n\nWhen you **first encounter an important creature, location, or item (your call) covered by your bardic lore** you can ask the GM any one question about it; the GM will answer truthfully. The GM may then ask you what tale, song, or legend you heard that information in.", "explanation": "", "dice": [], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -292,7 +296,9 @@ List getMoveList() => [ "When you **speak frankly with someone**, you can ask their player a question from the list below. They must answer it truthfully, then they may ask you a question from the list (which you must answer truthfully).\n\n* Whom do you serve?\n* What do you wish I would do?\n* How can I get you to __________?\n* What are you really feeling right now?\n* What do you most desire?", "explanation": "", "dice": [], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -304,7 +310,9 @@ List getMoveList() => [ "When you return to a civilized settlement you've visited before, tell the GM when you were last here. They'll tell you how it's changed since then.", "explanation": "", "dice": [], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -315,7 +323,9 @@ List getMoveList() => [ "description": "When you heal with Arcane Art you heal +1d8 damage.", "explanation": "", "dice": ["1d8"], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -327,7 +337,9 @@ List getMoveList() => [ "When you **grant bonus damage with Arcane Art**, you grant an extra +1d4 damage.", "explanation": "", "dice": ["1d4"], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -339,7 +351,9 @@ List getMoveList() => [ "When you unleash a crazed performance (a righteous lute solo or mighty brass blast, maybe) choose a target who can hear you and roll+CHA.\n\n * On a 10+ the target attacks their nearest ally in range.\n * On a 7-9 they attack their nearest ally, but you also draw their attention and ire.", "explanation": "", "dice": ["2d6+CHA"], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -351,7 +365,9 @@ List getMoveList() => [ "When you shout with great force or play a shattering note choose a target and roll+CON.\n\n * On a 10+ the target takes 1d10 damage and is deafened for a few minutes.\n * On a 7-9 you still damage your target, but it's out of control: the GM will choose an additional target nearby.", "explanation": "", "dice": ["2d6+CON"], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -362,7 +378,9 @@ List getMoveList() => [ "description": "When you successfully aid someone you take +1 forward as well.", "explanation": "", "dice": [], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -374,7 +392,9 @@ List getMoveList() => [ "Your Arcane Art is strong, allowing you to choose two effects instead of one.", "explanation": "", "dice": [], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -385,7 +405,9 @@ List getMoveList() => [ "description": "When you Hack & Slash, you take +1 armor forward.", "explanation": "", "dice": [], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -396,7 +418,9 @@ List getMoveList() => [ "description": "When you Parley with someone, on a 7+ you also take +1 forward with them.", "explanation": "", "dice": [], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -408,7 +432,15 @@ List getMoveList() => [ "Get one move from another class. Treat your level as one lower for choosing the move.", "explanation": "", "dice": [], - "classKeys": ["bard", "cleric", "fighter"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"}, + { + "key": "cleric", + "name": "Cleric", + "type": "CharacterClass", + }, + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -420,7 +452,10 @@ List getMoveList() => [ "Get one move from another class. Treat your level as one lower for choosing the move.", "explanation": "", "dice": [], - "classKeys": ["bard", "fighter"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"}, + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -431,7 +466,9 @@ List getMoveList() => [ "description": "When you heal with Arcane Art, you heal +2d8 damage.", "explanation": "", "dice": ["2d8"], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -443,7 +480,9 @@ List getMoveList() => [ "When you **grant bonus damage with Arcane Art**, you grant an extra +2d4 damage.", "explanation": "", "dice": ["2d4"], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -455,7 +494,9 @@ List getMoveList() => [ "When you **meet someone you've met before** (your call) after some time apart you take +1 forward against them.", "explanation": "", "dice": [], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -467,7 +508,9 @@ List getMoveList() => [ "When you **first meet someone who's heard songs about you**, roll+CHA.\n\n * On a 10+, tell the GM two things they've heard about you.\n * On a 7-9, tell the GM one thing they've heard, and the GM tells you one thing.", "explanation": "", "dice": ["2d6+CHA"], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -479,7 +522,9 @@ List getMoveList() => [ "When you use Arcane Art, you choose two effects. You also get to choose one of those effects to double.", "explanation": "", "dice": [], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -491,7 +536,9 @@ List getMoveList() => [ "When you hear an enemy cast a spell the GM will tell you the name of the spell and its effects. Take +1 forward when acting on the answers.", "explanation": "", "dice": [], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -503,7 +550,9 @@ List getMoveList() => [ "When you use **Charming and Open** you may also ask \"How are you vulnerable to me?\" Your subject may not ask this question of you.", "explanation": "", "dice": [], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -514,7 +563,9 @@ List getMoveList() => [ "description": "When you **Hack & Slash**, you take +2 armor forward.", "explanation": "", "dice": [], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -526,7 +577,9 @@ List getMoveList() => [ "Get a move from another class. Treat your level as one lower for choosing the move.", "explanation": "", "dice": [], - "classKeys": ["bard"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -538,7 +591,9 @@ List getMoveList() => [ "You serve and worship some deity or power which grants you spells. Give your god a name (maybe Helferth, Sucellus, Zorica or Krugon the Bleak) and choose your deity's domain:\n\n* Healing and Restoration\n* Bloody Conquest\n* Civilization\n* Knowledge and Hidden Things\n* The Downtrodden and Forgotten\n* What Lies Beneath\n\nChoose one precept of your religion:\n\n* Your religion preaches the sanctity of suffering, add Petition: Suffering\n* Your religion is cultish and insular, add Petition: Gaining Secrets\n* Your religion has important sacrificial rites, add Petition: Offering\n* Your religion believes in trial by combat, add Petition: Personal Victory", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -550,7 +605,9 @@ List getMoveList() => [ "When you petition your deity according to the precept of your religion, you are granted some useful knowledge or boon related to your deity's domain. The GM will tell you what.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -562,7 +619,9 @@ List getMoveList() => [ "When you hold your holy symbol aloft and call on your deity for protection, roll+Wis.\n* On a 7+, so long as you continue to pray and brandish your holy symbol, no undead may come within reach of you.\n* On a 10+, you also momentarily daze intelligent undead and cause mindless undead to flee. Aggression breaks the effects and they are able to act as normal. Intelligent undead may still find ways to harry you from afar. They're clever like that.", "explanation": "", "dice": ["2d6+WIS"], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -574,7 +633,9 @@ List getMoveList() => [ "When you spend uninterrupted time (an hour or so) in quiet communion with your deity, you:\n\n* Lose any spells already granted to you.\n* Are granted new spells of your choice whose total levels don't exceed your own level+1, and none of which is a higher level than your own level.\n* Prepare all of your rotes, which never count against your limit.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -586,7 +647,10 @@ List getMoveList() => [ "When you unleash a spell granted to you by your deity, roll+Wis.\n* On a 10+, the spell is successfully cast and your deity does not revoke the spell, so you may cast it again.\n* On a 7-9, the spell is cast, but choose one:\n\n* You draw unwelcome attention or put yourself in a spot. The GM will tell you how.\n* Your casting distances you from your deity-take -1 ongoing to cast a spell until the next time you commune.\n* After you cast it, the spell is revoked by your deity. You cannot cast the spell again until you commune and have it granted to you.\nNote that maintaining spells with ongoing effects will sometimes cause a penalty to your roll to cast a spell.", "explanation": "", "dice": ["2d6+WIS"], - "classKeys": ["cleric", "wizard"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"}, + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -597,7 +661,9 @@ List getMoveList() => [ "description": "Choose one spell. You are granted that spell as if it was one level lower.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -608,7 +674,9 @@ List getMoveList() => [ "description": "When you heal someone they take +2 forward to their damage.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -620,7 +688,9 @@ List getMoveList() => [ "When someone takes their last breath in your presence, they take +1 to the roll.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -631,7 +701,9 @@ List getMoveList() => [ "description": "When you Cast a Spell you ignore the first -1 penalty from ongoing spells.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -643,7 +715,9 @@ List getMoveList() => [ "Cure Light Wounds is a rote for you, and therefore doesn't count against your limit of granted spells.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -655,7 +729,9 @@ List getMoveList() => [ "When you Commune you get 1 hold and lose any hold you already had. Spend that hold when you or an ally takes damage to call on your deity, they intervene with an appropriate manifestation (a sudden gust of wind, a lucky slip, a burst of light) and negate the damage.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -667,7 +743,9 @@ List getMoveList() => [ "When you take damage and embrace the pain, you may take +1d4 damage (ignoring armor). If you do, take +1 forward to cast a spell.", "explanation": "", "dice": ["1d4"], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -679,7 +757,9 @@ List getMoveList() => [ "When you Cast a Spell, on a 10+ you have the option of choosing from the 7-9 list. If you do, you may choose one of these effects as well:\n\n* The spell's effects are doubled\n* The spell's targets are doubled", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -691,7 +771,9 @@ List getMoveList() => [ "When you sacrifice something of value to your deity and pray for guidance, your deity tells you what it would have you do. If you do it, mark experience.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -702,7 +784,10 @@ List getMoveList() => [ "description": "When you wear no armor or Shield you get 2 armor.", "explanation": "", "dice": [], - "classKeys": ["cleric", "paladin"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"}, + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -714,7 +799,9 @@ List getMoveList() => [ "When you heal someone else of damage, add your level to the amount of damage healed.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -726,7 +813,9 @@ List getMoveList() => [ "Choose one spell in addition to the one you picked for chosen one. You are granted that spell as if it was one level lower.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -738,7 +827,9 @@ List getMoveList() => [ "The first time you spend time in prayer as appropriate to your god after taking this move, choose a feature associated with your deity (rending claws, wings of sapphire feathers, an all-seeing third eye, etc.). When you emerge from prayer, you permanently gain that physical feature.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -750,7 +841,9 @@ List getMoveList() => [ "When you take time after a conflict to dedicate your victory to your deity and deal with the dead, take +1 forward.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -761,7 +854,9 @@ List getMoveList() => [ "description": "You ignore the -1 penalty from two spells you maintain.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -773,7 +868,9 @@ List getMoveList() => [ "Cure Moderate Wounds is a rote for you, and therefore doesn't count against your limit of granted spells.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -785,7 +882,9 @@ List getMoveList() => [ "When you Commune you gain 2 hold and lose any hold you already had. Spend that hold when you or an ally takes damage to call on your deity, who intervenes with an appropriate manifestation (a sudden gust of wind, a lucky slip, a burst of light) and negates the damage.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -797,7 +896,9 @@ List getMoveList() => [ "When you take damage and embrace the pain, you may take +1d4 damage (ignoring armor). If you do, take +1 forward to cast a spell and add your level to any damage done or healed by the spell.", "explanation": "", "dice": ["1d4"], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -808,7 +909,9 @@ List getMoveList() => [ "description": "When you wear no armor or shield you get 3 armor.", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -820,7 +923,9 @@ List getMoveList() => [ "When you cast a spell, on a 10-11 you have the option of choosing from the 7-9 list. If you do, you may choose one of these effects as well.\n* On a 12+ you get to choose one of these effects for free.\n\n* The spell's effects are doubled\n* The spell's targets are doubled", "explanation": "", "dice": [], - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -832,7 +937,15 @@ List getMoveList() => [ "Get one move from another class. Treat your level as one lower for choosing the move.", "explanation": "", "dice": [], - "classKeys": ["bard", "cleric", "fighter"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"}, + { + "key": "cleric", + "name": "Cleric", + "type": "CharacterClass", + }, + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -844,7 +957,9 @@ List getMoveList() => [ "You learned your magic in a place whose spirits are strong and ancient and they've marked you as one of their own. No matter where you go, they live within you and allow you to take their shape. Choose one of the following. It is the land to which you are attuned-when shapeshifting you may take the shape of any animal who might live in your Land.\n\n* The Great Forests\n* The Whispering Plains\n* The Vast Desert\n* The Stinking Mire\n* The River Delta\n* The Depths of the Earth\n* The Sapphire Islands\n* The Open Sea\n* The Towering Mountains\n* The Frozen North\n* The Blasted Wasteland\n\nChoose a tell-a physical attribute that marks you as born of the soil-that reflects the spirit of your land. It may be an animal feature like antlers or leopard's spots or something more general: hair like leaves or eyes of glittering crystal. Your tell remains no matter what shape you take.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -856,7 +971,9 @@ List getMoveList() => [ "You don't need to eat or drink. If a move tells you to mark off a ration just ignore it.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -868,7 +985,9 @@ List getMoveList() => [ "The grunts, barks, chirps, and calls of the creatures of the wild are as language to you. You can understand any animal native to your land or akin to one whose essence you have studied.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -880,7 +999,9 @@ List getMoveList() => [ "When you call upon the spirits to change your shape, roll+Wis.\n\n* On a 10+ hold 3.\n* On a 7-9 hold 2.\n* On a miss hold 1 in addition to whatever the GM says.\n\nYou may take on the physical form of any species whose essence you have studied or who lives in your land: you and your possessions meld into a perfect copy of the species' form.\n\n* You have any innate abilities and weaknesses of the form: claws, wings, gills, breathing water instead of air.\n* You still use your normal stats but some moves may be harder to trigger-a housecat will find it hard to do battle with an ogre.\n\nThe GM will also tell you one or more moves associated with your new form. Spend 1 hold to make that move. Once you're out of hold, you return to your natural form. At any time, you may spend all your hold and revert to your natural form.", "explanation": "", "dice": ["2d6+WIS"], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -892,7 +1013,9 @@ List getMoveList() => [ "When you spend time in contemplation of an animal spirit, you may add its species to those you can assume using shapeshifting.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -903,7 +1026,9 @@ List getMoveList() => [ "description": "Choose one move from the ranger class list.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -915,7 +1040,9 @@ List getMoveList() => [ "When you are in an appropriate animal form (something dangerous) increase your damage to d8.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -927,7 +1054,9 @@ List getMoveList() => [ "When you spend time in a place, making note of its resident spirits and calling on the spirits of the land, roll+Wis. You will be granted a vision of significance to you, your allies, and the spirits around you.\n* On a 10+ the vision will be clear and helpful to you.\n* On a 7-9 the vision is unclear, its meaning murky. On a miss, the vision is upsetting, frightening, or traumatizing. The GM will describe it. Take -1 forward.", "explanation": "", "dice": ["2d6+WIS"], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -938,7 +1067,9 @@ List getMoveList() => [ "description": "So long as your feet touch the ground you have +1 armor.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -950,7 +1081,9 @@ List getMoveList() => [ "When you mark an animal (with mud, dirt, or blood) you can see through that animal's eyes as if they were your own, no matter what distance separates you. Only one animal at a time may be marked in this way.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -962,7 +1095,9 @@ List getMoveList() => [ "When you take damage while shapeshifted you may choose to revert to your natural form to negate the damage.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -974,7 +1109,9 @@ List getMoveList() => [ "You see the spirits in the sand, the sea and the stone. You may now apply your spirit tongue, shapeshifting and studied essence to inanimate natural objects (plants and rocks) or creatures made thereof, as well as animals. Thing-talker forms can be exact copies or can be mobile vaguely humanoid-shaped entities.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -986,7 +1123,9 @@ List getMoveList() => [ "When you shapeshift choose a stat: you take +1 ongoing to rolls using that stat while shifted. The GM will choose a stat, too: you take -1 ongoing to rolls using that stat while shifted.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -998,7 +1137,9 @@ List getMoveList() => [ "When you call on the primal spirits of fire, water, earth or air to perform a task for you roll+Wis.\n* On a 10+ choose two.\n* On a 7-9 choose one. On a miss, some catastrophe occurs as a result of your calling.\n\n* The effect you desire comes to pass\n* You avoid paying nature's price\n* You retain control", "explanation": "", "dice": ["2d6+WIS"], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1010,7 +1151,9 @@ List getMoveList() => [ "When you deal damage, take 1 balance. When you touch someone and channel the spirits of life you may spend balance. For each balance spent, heal 1d4 HP.", "explanation": "", "dice": ["1d4"], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1021,7 +1164,9 @@ List getMoveList() => [ "description": "When you shapeshift, roll 1d4 and add that total to your hold.", "explanation": "", "dice": ["1d4"], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1033,7 +1178,9 @@ List getMoveList() => [ "You are able to study the essence of specific individuals to take their exact form, including men, elves, or the like. Suppressing your tell is possible, but if you do, take -1 ongoing until you return to your own form.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1045,7 +1192,9 @@ List getMoveList() => [ "When you are in an appropriate animal form (something dangerous) increase your damage to d10.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1057,7 +1206,9 @@ List getMoveList() => [ "When you take this move, the next opportunity that you have safety and time to spend in an appropriate location, you may attune yourself to a new land. This effect occurs only once and the GM will tell you how long it will take and what cost you must pay. From then on, you are considered to be born of the soil in both lands.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1069,7 +1220,9 @@ List getMoveList() => [ "You see the patterns that make up the fabric of the world. You may now apply your spirit tongue, shapeshifter and studied essence moves to pure elements-fire, water, air and earth.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1080,7 +1233,9 @@ List getMoveList() => [ "description": "Choose one move from the ranger class list.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1092,7 +1247,9 @@ List getMoveList() => [ "You may increase your armor by 1 or deal an additional +1d4 damage while in an animal form. Choose which when you shapeshift.", "explanation": "", "dice": ["1d4"], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1104,7 +1261,9 @@ List getMoveList() => [ "When you shapeshift, you may create a merged form of up to three different shapes. You may be a bear with the wings of an eagle and the head of a ram, for example. Each feature will grant you a different move to make. Your chimera form follows the same rules as shapeshifter otherwise.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1116,7 +1275,9 @@ List getMoveList() => [ "When you are under open skies when the sun rises the GM will ask you what the weather will be that day. Tell them whatever you like, it comes to pass.", "explanation": "", "dice": [], - "classKeys": ["druid"], + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1128,7 +1289,9 @@ List getMoveList() => [ "When you use pure strength to destroy an inanimate obstacle, roll+Str.\n* On a 10+, choose 3.\n* On a 7-9 choose 2.\n\n* It doesn't take a very long time\n* Nothing of value is damaged\n* It doesn't make an inordinate amount of noise\n* You can fix the thing again without a lot of effort", "explanation": "", "dice": ["2d6+STR"], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1139,7 +1302,10 @@ List getMoveList() => [ "description": "You ignore the clumsy tag on armor you wear.", "explanation": "", "dice": [], - "classKeys": ["fighter", "paladin"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"}, + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1151,7 +1317,9 @@ List getMoveList() => [ "This is your weapon. There are many like it, but this one is yours. Your weapon is your best friend. It is your life. You master it as you master your life. Your weapon, without you, is useless. Without your weapon, you are useless. You must wield your weapon true.\n\nChoose a base description, all are 2 weight:\n\n* Sword\n* Axe\n* Hammer\n* Spear\n* Flail\n* Fists\n\nChoose the range that best fits your weapon:\n\n* Hand\n* Close\n* Reach\n\nChoose two enhancements:\n\n* Hooks and spikes. +1 damage, but +1 weight.\n* Sharp. +2 piercing.\n* Perfectly weighted. Add precise.\n* Serrated edges. +1 damage.\n* Glows in the presence of one type of creature, your choice.\n* Huge. Add messy and forceful.\n* Versatile. Choose an additional range.\n* Well-crafted. -1 weight.\n\nChoose a look:\n\n* Ancient\n* Unblemished\n* Ornate\n* Blood-stained\n* Sinister", "explanation": "", "dice": [], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1162,7 +1330,9 @@ List getMoveList() => [ "description": "When you deal damage, deal +1d4 damage.", "explanation": "", "dice": ["1d4"], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1174,7 +1344,9 @@ List getMoveList() => [ "When you consult the spirits that reside within your signature weapon, they will give you an insight relating to the current situation, and might ask you some questions in return, roll+CHA.\n* On a 10+, the GM will give you good detail.\n* On a 7-9, the GM will give you an impression.", "explanation": "", "dice": ["2d6+CHA"], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1186,7 +1358,9 @@ List getMoveList() => [ "When you make your armor take the brunt of damage dealt to you, the damage is negated but you must reduce the armor value of your armor or shield (your choice) by 1. The value is reduced each time you make this choice. If the reduction leaves the item with 0 armor it is destroyed.", "explanation": "", "dice": [], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1197,7 +1371,9 @@ List getMoveList() => [ "description": "Choose one extra enhancement for your signature weapon.", "explanation": "", "dice": [], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1208,7 +1384,9 @@ List getMoveList() => [ "description": "When you Discern Realities during combat, you take +1.", "explanation": "", "dice": [], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1220,7 +1398,9 @@ List getMoveList() => [ "When you Parley using threats of impending violence as leverage, you may use STR instead of CHA.", "explanation": "", "dice": [], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1232,7 +1412,9 @@ List getMoveList() => [ "When you Hack & Slash an enemy, your next attack against that same foe deals +1d4 damage.", "explanation": "", "dice": ["1d4"], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1244,7 +1426,15 @@ List getMoveList() => [ "Get one move from another class. Treat your level as one lower for choosing the move.", "explanation": "", "dice": [], - "classKeys": ["bard", "cleric", "fighter"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"}, + { + "key": "cleric", + "name": "Cleric", + "type": "CharacterClass", + }, + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1255,7 +1445,9 @@ List getMoveList() => [ "description": "You gain +1 armor.", "explanation": "", "dice": [], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1267,7 +1459,9 @@ List getMoveList() => [ "When you have access to a forge you can graft the magical powers of a weapon onto your signature weapon. This process destroys the magical weapon. Your signature weapon gains the magical powers of the destroyed weapon.", "explanation": "", "dice": [], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1278,7 +1472,9 @@ List getMoveList() => [ "description": "When you deal damage, deal +1d8 damage.", "explanation": "", "dice": ["1d8"], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1290,7 +1486,9 @@ List getMoveList() => [ "When you choose to let your armor take the brunt of damage dealt to you, the damage is negated and you take +1 forward against the attacker, but you must reduce the armor value of your armor or shield (your choice) by 1. The value is reduced each time you make this choice. If the reduction leaves the item with 0 armor it is destroyed.", "explanation": "", "dice": [], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1302,7 +1500,9 @@ List getMoveList() => [ "When you enter combat, roll+CHA.\n* On a 10+, hold 2.\n* On a 7-9, hold 1. Spend your hold to make eye contact with an NPC present, who freezes or flinches and can't act until you break it off.\n* On a 6-, your enemies immediately identify you as their biggest threat.", "explanation": "", "dice": ["2d6+CHA"], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1314,7 +1514,9 @@ List getMoveList() => [ "When you Hack & Slash an enemy, your next attack against that same foe deals +1d8 damage.", "explanation": "", "dice": ["1d8"], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1326,7 +1528,10 @@ List getMoveList() => [ "Get one move from another class. Treat your level as one lower for choosing the move.", "explanation": "", "dice": [], - "classKeys": ["bard", "fighter"], + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"}, + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1337,7 +1542,9 @@ List getMoveList() => [ "description": "You gain +2 armor.", "explanation": "", "dice": [], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1349,7 +1556,9 @@ List getMoveList() => [ "When you go into battle, roll+WIS.\n* On a 10+, name someone who will live and someone who will die.\n* On a 7-9, name someone who will live or someone who will die. Name NPCs, not player characters. The GM will make your vision come true, if it's even remotely possible.\n* On a 6- you see your own death and consequently take -1 ongoing throughout the battle.", "explanation": "", "dice": ["2d6+WIS"], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1361,7 +1570,9 @@ List getMoveList() => [ "When you look over an enemy's weaponry, ask the GM how much damage they do.", "explanation": "", "dice": [], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1373,7 +1584,9 @@ List getMoveList() => [ "When you Hack & Slash on a 12+ you deal your damage, avoid their attack, and impress, dismay, or frighten your enemy.", "explanation": "", "dice": [], - "classKeys": ["fighter"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1385,7 +1598,9 @@ List getMoveList() => [ "When you touch someone, skin to skin, and pray for their well-being , roll+CHA.\n* On a 10+ you heal 1d8 damage or remove one disease.\n* On a 7-9, they are healed, but the damage or disease is transferred to you.", "explanation": "", "dice": ["2d6+CHA", "1d8"], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1396,7 +1611,10 @@ List getMoveList() => [ "description": "You ignore the clumsy tag on armor you wear.", "explanation": "", "dice": [], - "classKeys": ["fighter", "paladin"], + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"}, + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1408,7 +1626,9 @@ List getMoveList() => [ "When you give an NPC an order based on your divine authority, roll+Cha.\n* On a 7+, they choose one:\n\n\t* Do what you say\n\t* Back away cautiously, then flee\n\t* Attack you\n* On a 10+, you also take +1 forward against them.\n* On a miss, they do as they please and you take -1 forward against them.", "explanation": "", "dice": ["2d6+CHA"], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1420,7 +1640,9 @@ List getMoveList() => [ "When you dedicate yourself to a mission through prayer and ritual cleansing, state what you set out to do:\n\n* Slay __________, a great blight on the land\n* Defend __________ from the iniquities that beset them\n* Discover the truth of __________\n\nThen choose up to two boons:\n\n* An unwavering sense of direction to __________.\n* Invulnerability to __________ (e.g., edged weapons, fire, enchantment, etc.)\n* A mark of divine authority\n* Senses that pierce lies\n* A voice that transcends language\n* A freedom from hunger, thirst, and sleep\n\nThe GM will then tell you what vow or vows is required of you to maintain your blessing:\n\n* Honor (forbidden: cowardly tactics and tricks)\n* Temperance (forbidden: gluttony in food, drink, and pleasure of the flesh)\n* Piety (required: observance of daily holy services)\n* Valor (forbidden: suffering an evil creature to live)\n* Truth (forbidden: lies)\n* Hospitality (required: comfort to those in need, no matter who they are)", "explanation": "", "dice": [], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1432,7 +1654,9 @@ List getMoveList() => [ "Dedicate yourself to a deity (name a new one or choose one that's already been established). You gain the commune and cast a spell cleric moves. When you select this move, treat yourself as a cleric of level 1 for using spells. Every time you gain a level thereafter, increase your effective cleric level by 1.", "explanation": "", "dice": [], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1444,7 +1668,9 @@ List getMoveList() => [ "When you take damage you can grit your teeth and accept the blow. If you do you take no damage but instead suffer a debility of your choice. If you already have all six debilities you can't use this move.", "explanation": "", "dice": [], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1455,7 +1681,9 @@ List getMoveList() => [ "description": "While on a quest you deal +1d4 damage.", "explanation": "", "dice": ["1d4"], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1467,7 +1695,9 @@ List getMoveList() => [ "When you speak aloud your promise to defeat an enemy, you deal +2d4 damage against that enemy and -4 damage against anyone else. This effect lasts until the enemy is defeated. If you fail to defeat the enemy or give up the fight, you can admit your failure, but the effect continues until you find a way to redeem yourself.", "explanation": "", "dice": ["2d4"], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1478,7 +1708,9 @@ List getMoveList() => [ "description": "When you lead the charge into combat, those you lead take +1 forward.", "explanation": "", "dice": [], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1489,7 +1721,9 @@ List getMoveList() => [ "description": "When you Defend you always get +1 hold, even on a 6-.", "explanation": "", "dice": [], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1501,7 +1735,9 @@ List getMoveList() => [ "When you Hack & Slash, choose an ally. Their next attack against your target does +1d4 damage.", "explanation": "", "dice": ["1d4"], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1512,7 +1748,9 @@ List getMoveList() => [ "description": "You get +1 armor while on a quest.", "explanation": "", "dice": [], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1523,7 +1761,9 @@ List getMoveList() => [ "description": "Take +1 to order hirelings.", "explanation": "", "dice": [], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1534,7 +1774,9 @@ List getMoveList() => [ "description": "When you heal an ally, you heal +1d8 damage.", "explanation": "", "dice": ["1d8"], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1546,7 +1788,9 @@ List getMoveList() => [ "When you see divine magic as it happens, you can ask the GM which deity granted the spell and its effects. Take +1 when acting on the answers.", "explanation": "", "dice": [], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1557,7 +1801,9 @@ List getMoveList() => [ "description": "While on a quest you deal +1d8 damage.", "explanation": "", "dice": ["1d8"], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1569,7 +1815,9 @@ List getMoveList() => [ "When you lead the charge into combat, those you lead take +1 forward and +2 armor forward.", "explanation": "", "dice": [], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1581,7 +1829,9 @@ List getMoveList() => [ "When you Defend you always get +1 hold, even on a 6-. When you get a 12+ to defend instead of getting hold the nearest attacking creature is stymied giving you a clear advantage, the GM will describe it.", "explanation": "", "dice": [], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1593,7 +1843,9 @@ List getMoveList() => [ "When you Hack & Slash, choose an ally. Their next attack against your target does +1d4 damage and they take +1 forward against them.", "explanation": "", "dice": ["1d4"], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1604,7 +1856,10 @@ List getMoveList() => [ "description": "When you wear no armor or Shield you get 2 armor.", "explanation": "", "dice": [], - "classKeys": ["cleric", "paladin"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"}, + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1616,7 +1871,9 @@ List getMoveList() => [ "Take +1 to order hirelings. When you roll a 12+ the hireling transcends their moment of fear and doubt and carries out your order with particular effectiveness or efficiency.", "explanation": "", "dice": [], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1627,7 +1884,9 @@ List getMoveList() => [ "description": "When you heal an ally, you heal +2d8 damage.", "explanation": "", "dice": ["2d8"], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1639,7 +1898,9 @@ List getMoveList() => [ "When you suffer a debility (even through Bloody Aegis) take +1 forward against whatever caused it.", "explanation": "", "dice": [], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1650,7 +1911,9 @@ List getMoveList() => [ "description": "When you Quest you choose three boons instead of two.", "explanation": "", "dice": [], - "classKeys": ["paladin"], + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1662,7 +1925,9 @@ List getMoveList() => [ "When you follow a trail of clues left behind by passing creatures, roll+WIS.\n* On a 7+, you follow the creature's trail until there's a significant change in its direction or mode of travel.\n* On a 10+, you also choose 1:\n\n* Gain a useful bit of information about your quarry, the GM will tell you what\n* Determine what caused the trail to end", "explanation": "", "dice": ["2d6+WIS"], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1674,7 +1939,9 @@ List getMoveList() => [ "When you attack a defenseless or surprised enemy at range, you can choose to deal your damage or name your target and roll+DEX.\n\n* Head 10+: As 7-9, plus your damage 7-9: They do nothing but stand and drool for a few moments.\n* Arms 10+: As 7-9, plus your damage 7-9: They drop anything they're holding.\n* Legs 10+: As 7-9, plus your damage 7-9: They're hobbled and slow moving.", "explanation": "", "dice": ["2d6+DEX"], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1686,7 +1953,9 @@ List getMoveList() => [ "You have a supernatural connection with a loyal animal. You can't talk to it per se but it always acts as you wish it to. Name your animal companion and choose a species:\nWolf, cougar, bear, eagle, dog, hawk, cat, owl, pigeon, rat, mule\n\nChoose a base:\n\n* Ferocity +2, Cunning +1, 1 Armor, Instinct +1\n* Ferocity +2, Cunning +2, 0 Armor, Instinct +1\n* Ferocity +1, Cunning +2, 1 Armor, Instinct +1\n* Ferocity +3, Cunning +1, 1 Armor, Instinct +2\n\nChoose as many strengths as its ferocity:\nFast, burly, huge, calm, adaptable, quick reflexes, tireless, camouflage, ferocious, intimidating, keen senses, stealthy\n\nYour animal companion is trained to fight humanoids. Choose as many additional trainings as its cunning:\nHunt, search, scout, guard, fight monsters, perform, labor, travel\n\nChoose as many weaknesses as its instinct:\nFlighty, savage, slow, broken, frightening, forgetful, stubborn, lame", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1698,7 +1967,9 @@ List getMoveList() => [ "When you work with your animal companion on something it's trained in…\n\n* …and you attack the same target, add its ferocity to your damage\n* …and you track, add its cunning to your roll\n* …and you take damage, add its armor to your armor\n* …and you Discern Realities, add its cunning to your roll\n* …and you parley, add its cunning to your roll\n* …and someone interferes with you, add its instinct to their roll", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1710,7 +1981,9 @@ List getMoveList() => [ "Somewhere in your lineage lies mixed blood and it begins to show its presence. You gain the elf starting move if you took the human one at character creation or vice versa.\n\nYou may take this move only if it is your first advancement.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1721,7 +1994,9 @@ List getMoveList() => [ "description": "You can speak with and understand animals.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1732,7 +2007,9 @@ List getMoveList() => [ "description": "When you Spout Lore about a monster you use WIS instead of INT.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1744,7 +2021,9 @@ List getMoveList() => [ "When you strike an enemy with two weapons at once, add an extra 1d4 damage for your off-hand strike.", "explanation": "", "dice": ["1d4"], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1756,7 +2035,9 @@ List getMoveList() => [ "When you keep still in natural surroundings, enemies never spot you until you make a movement.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1768,7 +2049,9 @@ List getMoveList() => [ "When you allow your animal companion to take a blow that was meant for you, the damage is negated and your animal companion's ferocity becomes 0. If its ferocity is already 0 you can't use this ability. When you have a few hours of rest with your animal companion its ferocity returns to normal.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1780,7 +2063,9 @@ List getMoveList() => [ "When you Volley you may spend extra ammo before rolling. For each point of ammo spent you may choose an extra target. Roll once and apply damage to all targets.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1791,7 +2076,9 @@ List getMoveList() => [ "description": "Choose another training for your animal companion.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1803,7 +2090,9 @@ List getMoveList() => [ "Dedicate yourself to a deity (name a new one or choose one that's already been established). You gain the Commune and Cast a Spell cleric moves. When you select this move, treat yourself as a cleric of level 1 for using spells. Every time you gain a level thereafter, increase your effective cleric level by 1.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1815,7 +2104,9 @@ List getMoveList() => [ "When you Undertake a Perilous Journey you can take two roles. You make a separate roll for each.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1826,7 +2117,9 @@ List getMoveList() => [ "description": "When you set the watch for the night, everyone takes +1 to Take Watch.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -1837,7 +2130,9 @@ List getMoveList() => [ "description": "You can speak with and understand any non-magical, non-planar creature.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1849,7 +2144,9 @@ List getMoveList() => [ "When you Spout Lore about a monster you use WIS instead of INT.\n* On a 12+, in addition to the normal effects, you get to ask the GM any one question about the subject.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1861,7 +2158,9 @@ List getMoveList() => [ "When you strike an enemy with two weapons at once, add an extra 1d8 damage for your off-hand strike.", "explanation": "", "dice": ["1d8"], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1872,7 +2171,9 @@ List getMoveList() => [ "description": "When you know your target's weakest point your arrows have 2 piercing.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1884,7 +2185,9 @@ List getMoveList() => [ "When you Undertake a Perilous Journey you can take two roles. Roll twice and use the better result for both roles.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1896,7 +2199,9 @@ List getMoveList() => [ "When you set the watch for the night everyone takes +1 to Take Watch. After a night in camp when you set the watch everyone takes +1 forward.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1908,7 +2213,9 @@ List getMoveList() => [ "When you Hunt and Track, on a hit you may also ask one question about the creature you are tracking from the Discern Realities list for free.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1920,7 +2227,9 @@ List getMoveList() => [ "Choose a move from another class. So long as you are working with your animal companion you have access to that move.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1932,7 +2241,9 @@ List getMoveList() => [ "Your animal companion is a monster, not an animal. Describe it. Give it +2 ferocity and +1 instinct, plus a new training.", "explanation": "", "dice": [], - "classKeys": ["ranger"], + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -1944,7 +2255,9 @@ List getMoveList() => [ "When you spend a moment to survey a dangerous area, roll+DEX.\n* On a 10+, hold 3.\n* On a 7-9, hold 1. Spend your hold as you walk through the area to ask these questions:\n\n\t* Is there a trap here and if so, what activates it?\n\t* What does the trap do when activated?\n\t* What else is hidden here?", "explanation": "", "dice": ["2d6+DEX"], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1956,7 +2269,9 @@ List getMoveList() => [ "When you pick locks or pockets or disable traps, roll+DEX.\n* On a 10+, you do it, no problem.\n* On a 7-9, you still do it, but the GM will offer you two options between suspicion, danger, or cost.", "explanation": "", "dice": ["2d6+DEX"], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1968,7 +2283,9 @@ List getMoveList() => [ "When you attack a surprised or defenseless enemy with a melee weapon, you can choose to deal your damage or roll+DEX.\n* On a 10+ choose two.\n* On a 7-9 choose one.\n\n* You don't get into melee with them\n* You deal your damage+1d6\n* You create an advantage, +1 forward to you or an ally acting on it\n* Reduce their armor by 1 until they repair it", "explanation": "", "dice": ["2d6+DEX", "1d6"], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1980,7 +2297,9 @@ List getMoveList() => [ "When someone tries to detect your alignment you can tell them any alignment you like.", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -1992,7 +2311,9 @@ List getMoveList() => [ "You've mastered the care and use of a poison. Choose a poison from the list below; that poison is no longer dangerous for you to use. You also start with three uses of the poison you choose. Whenever you have time to gather materials and a safe place to brew you can make three uses of the poison you choose for free. Note that some poisons are applied, meaning you have to carefully apply it to the target or something they eat or drink. Touch poisons just need to touch the target, they can even be used on the blade of a weapon.\n\n* Oil of Tagit (applied): The target falls into a light sleep\n* Bloodweed (touch): The target deals -1d4 damage ongoing until cured\n* Goldenroot (applied): The target treats the next creature they see as a trusted ally, until proved otherwise\n* Serpent's Tears (touch): Anyone dealing damage to the target rolls twice and takes the better result.", "explanation": "", "dice": ["1d4"], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2004,7 +2325,9 @@ List getMoveList() => [ "When using a precise or hand weapon, your Backstab deals an extra +1d6 damage.", "explanation": "", "dice": ["1d6"], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2015,7 +2338,9 @@ List getMoveList() => [ "description": "When you use Trap Expert you always get +1 hold, even on a 6-.", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2027,7 +2352,9 @@ List getMoveList() => [ "When you make a show of flashing around your most valuable possession, choose someone present. They will do anything they can to obtain your item or one like it.", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2039,7 +2366,9 @@ List getMoveList() => [ "You're never caught by surprise. When an enemy would get the drop on you, you get to act first instead.", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2050,7 +2379,9 @@ List getMoveList() => [ "description": "After you've used a poison once it's no longer dangerous for you to use.", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2062,7 +2393,9 @@ List getMoveList() => [ "You can apply even complex poisons with a pinprick. When you apply a poison that's not dangerous for you to use to your weapon it's touch instead of applied.", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2074,7 +2407,9 @@ List getMoveList() => [ "When you have time to gather materials and a safe place to brew you can create three doses of any one poison you've used before.", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2085,7 +2420,9 @@ List getMoveList() => [ "description": "When you're outnumbered, you have +1 armor.", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2097,7 +2434,9 @@ List getMoveList() => [ "When you put out word to the criminal underbelly about something you want or need, roll+CHA.\n* On a 10+, someone has it, just for you.\n* On a 7-9, you'll have to settle for something close or it comes with strings attached, your call.", "explanation": "", "dice": ["2d6+CHA"], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2109,7 +2448,9 @@ List getMoveList() => [ "When using a precise or hand weapon, your backstab deals an extra +1d8 damage and all other attacks deal +1d4 damage.", "explanation": "", "dice": ["1d8", "1d4"], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2121,7 +2462,9 @@ List getMoveList() => [ "When you use Trap Expert you always get +1 hold, even on a 6-.\n* On a 12+ you get 3 hold and the next time you come near a trap the GM will immediately tell you what it does, what triggers it, who set it, and how you can use it to your advantage.", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2133,7 +2476,9 @@ List getMoveList() => [ "When you have you have time to gather materials and a safe place to brew you can create three doses of any poison you've used before. Alternately you can describe the effects of a poison you'd like to create. The GM will tell you that you can create it, but with one or more caveats:\n\n* It will only work under specific circumstances\n* The best you can manage is a weaker version\n* It'll take a while to take effect\n* It'll have obvious side effects", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2144,7 +2489,9 @@ List getMoveList() => [ "description": "You have +1 armor. When you're outnumbered, you have +2 armor instead.", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2156,7 +2503,9 @@ List getMoveList() => [ "When you Defy Danger on a 12+, you transcend the danger. You not only do what you set out to, but the GM will offer you a better outcome, true beauty, or a moment of grace.", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2168,7 +2517,9 @@ List getMoveList() => [ "You can throw any melee weapon, using it to Volley. A thrown melee weapon is gone; you can never choose to reduce ammo on a 7-9.", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2180,7 +2531,9 @@ List getMoveList() => [ "When you're in too deep and need a way out, name your escape route and roll+DEX.\n* On a 10+ you're gone.\n* On a 7-9 you can stay or go, but if you go it costs you: leave something behind or take something with you, the GM will tell you what.", "explanation": "", "dice": ["2d6+DEX"], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2192,7 +2545,9 @@ List getMoveList() => [ "When you have time and materials you can create a disguise that will fool anyone into thinking you're another creature of about the same size and shape. Your actions can give you away but your appearance won't.", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2204,7 +2559,9 @@ List getMoveList() => [ "When you take time to make a plan to steal something, name the thing you want to steal and ask the GM these questions. When acting on the answers you and your allies take +1 forward.\n\n* Who will notice it's missing?\n* What's its most powerful defense?\n* Who will come after it?\n* Who else wants it?", "explanation": "", "dice": [], - "classKeys": ["thief"], + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2216,7 +2573,9 @@ List getMoveList() => [ "You have mastered several spells and inscribed them in your spellbook. You start out with three first level spells in your spellbook as well as the cantrips. Whenever you gain a level, you add a new spell of your level or lower to your spellbook. You spellbook is 1 weight.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2228,7 +2587,9 @@ List getMoveList() => [ "When you spend uninterrupted time (an hour or so) in quiet contemplation of your spellbook, you:\nLose any spells you already have prepared\n\nPrepare new spells of your choice from your spellbook whose total levels don't exceed your own level+1.\n\nPrepare your cantrips which never count against your limit.\n* Lose any spells you already have prepared\n* Prepare new spells of your choice from your spellbook whose total levels don't exceed your own level+1.\n* Prepare your cantrips which never count against your limit.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2240,7 +2601,9 @@ List getMoveList() => [ "You may end any ongoing spell immediately and use the energy of its dissipation to deflect an oncoming attack. The spell ends and you subtract its level from the damage done to you.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2252,7 +2615,9 @@ List getMoveList() => [ "When you draw on a place of power to create a magical effect, tell the GM what you're trying to achieve. Ritual effects are always possible, but the GM will give you one to four of the following conditions:\n\n* It's going to take days/weeks/months\n* First you must __________\n* You'll need help from __________\n* It will require a lot of money\n* The best you can do is a lesser version, unreliable and limited\n* You and your allies will risk danger from __________\n* You'll have to disenchant __________ to do it", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2264,7 +2629,10 @@ List getMoveList() => [ "When you unleash a spell granted to you by your deity, roll+Wis.\n* On a 10+, the spell is successfully cast and your deity does not revoke the spell, so you may cast it again.\n* On a 7-9, the spell is cast, but choose one:\n\n* You draw unwelcome attention or put yourself in a spot. The GM will tell you how.\n* Your casting distances you from your deity-take -1 ongoing to cast a spell until the next time you commune.\n* After you cast it, the spell is revoked by your deity. You cannot cast the spell again until you commune and have it granted to you.\nNote that maintaining spells with ongoing effects will sometimes cause a penalty to your roll to cast a spell.", "explanation": "", "dice": ["2d6+WIS"], - "classKeys": ["cleric", "wizard"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"}, + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2275,7 +2643,9 @@ List getMoveList() => [ "description": "Choose a spell. You prepare that spell as if it were one level lower.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2287,7 +2657,9 @@ List getMoveList() => [ "When you Cast a Spell, on a 10+ you have the option of choosing from the 7-9 list. If you do, you may choose one of these as well:\nThe spell's effects are maximized\n\nThe spell's targets are doubled\n* The spell's effects are maximized\n* The spell's targets are doubled", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2299,7 +2671,9 @@ List getMoveList() => [ "When you Spout Lore about something no one else has any clue about, take +1.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2311,7 +2685,9 @@ List getMoveList() => [ "When another player's character comes to you for advice and you tell them what you think is best, they get +1 forward when following your advice and you mark experience if they do.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2322,7 +2698,9 @@ List getMoveList() => [ "description": "Add a new spell from the spell list of any class to your spellbook.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2334,7 +2712,9 @@ List getMoveList() => [ "When you have time and safety with a magic item you may ask the GM what it does, the GM will answer you truthfully.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2346,7 +2726,9 @@ List getMoveList() => [ "When you use strict deduction to analyze your surroundings, you can Discern Realities with INT instead of WIS.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2358,7 +2740,9 @@ List getMoveList() => [ "As long as you have at least one prepared spell of first level or higher, you have +2 armor.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2370,7 +2754,9 @@ List getMoveList() => [ "When you attempt to counter an arcane spell that will otherwise affect you, stake one of your prepared spells on the defense and roll+Int.\n* On a 10+, the spell is countered and has no effect on you.\n* On a 7-9, the spell is countered and you forget the spell you staked. Your counterspell protects only you; if the countered spell has other targets they get its effects.", "explanation": "", "dice": ["2d6+INT"], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2382,7 +2768,9 @@ List getMoveList() => [ "When you see the effects of an arcane spell, ask the GM the name of the spell and its effects. You take +1 when acting on the answers.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2394,7 +2782,9 @@ List getMoveList() => [ "Choose one spell in addition to the one you picked for prodigy. You prepare that spell as if it were one level lower.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2406,7 +2796,9 @@ List getMoveList() => [ "When you Cast a Spell, on a 10-11 you have the option of choosing from the 7-9 list. If you do, you may choose one of these effects as well.\n* On a 12+ you get to choose one of these effects for free:\nThe spell's effects are doubled\n\nThe spell's targets are doubled\n* The spell's effects are doubled\n* The spell's targets are doubled", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2418,7 +2810,9 @@ List getMoveList() => [ "When you have time and safety with a magic item in a place of power you can empower that item so that the next time you use it its effects are amplified, the GM will tell you exactly how.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2430,7 +2824,9 @@ List getMoveList() => [ "When you use strict deduction to analyze your surroundings, you can Discern Realities with Int instead of Wis.\n* On a 12+ you get to ask the GM any three questions, not limited by the list.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2442,7 +2838,9 @@ List getMoveList() => [ "As long as you have at least one prepared spell of first level or higher, you have +4 armor.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2454,7 +2852,9 @@ List getMoveList() => [ "When an ally within sight of you is affected by an arcane spell, you can counter it as if it affected you. If the spell affects multiple allies you must counter for each ally separately.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2466,7 +2866,9 @@ List getMoveList() => [ "When you have time with a willing or helpless subject you can craft an ethereal tether with them. You perceive what they perceive and can Discern Realities about someone tethered to you or their surroundings no matter the distance. Someone willingly tethered to you can communicate with you over the tether as if you were in the room with them.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2478,7 +2880,9 @@ List getMoveList() => [ "When you use magic to control a person's actions they have no memory of what you had them do and bear you no ill will.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2490,7 +2894,9 @@ List getMoveList() => [ "When you deal damage to a creature you can shunt a spell's energy into them-end one of your ongoing spells and add the spell's level to the damage dealt.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2502,7 +2908,9 @@ List getMoveList() => [ "When you have time, arcane materials, and a safe space, you can create your own place of power. Describe to the GM what kind of power it is and how you're binding it to this place, the GM will tell you one kind of creature that will have an interest in your workings.", "explanation": "", "dice": [], - "classKeys": ["wizard"], + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2514,7 +2922,9 @@ List getMoveList() => [ "When you conjure a weapon of pure flame, roll+CON.\n* On a 10+ choose two of the following tags, on a 7-9 choose one. You may treat your INT as your STR or DEX in regards to making attacks with this weapon. The weapon always begins with the fiery, touch, dangerous, and 3 uses tags. Each attack with the weapon consumes one use.\n\n\n\n- hand\n\n- thrown, near\n\n- +1 damage\n\n- remove the dangerous tag", "explanation": "", "dice": ["2d6+CON"], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2526,7 +2936,9 @@ List getMoveList() => [ "When you take damage, and that damage is odd (after armor) the flames within you come to your aid. Roll 1d4 and either add that many uses to your burning brand (if active), take that result forward to summon your burning brand, or reduce the damage by that amount, your choice.", "explanation": "", "dice": ["1d4"], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2538,7 +2950,9 @@ List getMoveList() => [ "When you bend a flame to your will, roll+WIS.\n* On a 10+ it does as you command, taking the shape and movement you desire for as long as it has fuel on which to burn.\n* On a 7-9 the effect is short-lived, lasting only a moment.", "explanation": "", "dice": ["2d6+WIS"], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2550,7 +2964,9 @@ List getMoveList() => [ "When you **gaze intensely into someone eyes**, you may ask their player \"what fuels the flames of your desire?\" they'll answer with the truth, even if the character does not know or would otherwise keep this hidden.", "explanation": "", "dice": [], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2562,7 +2978,9 @@ List getMoveList() => [ "You may use your hands in place of tools and fire to craft metal objects. Mundane weapons, armor and metal jewelry can all be formed from their raw components. You may unmake these things, as well, but to do so without time and safety might require that you Defy Danger first.", "explanation": "", "dice": [], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2574,7 +2992,9 @@ List getMoveList() => [ "When you **stare into a source of fire, looking for answers**, roll+WIS On a hit, the GM will tell you something new and interesting about the current situation.\n* On a 10+, the GM will give you good detail.\n* On a 7-9, the GM will give you an impression. If you already know all there is to know, the GM will tell you that.", "explanation": "", "dice": ["2d6+WIS"], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2586,7 +3006,9 @@ List getMoveList() => [ "When you **channel the flames of fate**, you may treat a missed roll as a 7-9 or a 7-9 result as a 10+. This may be a roll you or another character has made. Tell the GM something you've lost; an emotion, a memory or some innate piece of your being. You may not use this move again until you've used Burns Half As Long.", "explanation": "", "dice": [], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2598,7 +3020,9 @@ List getMoveList() => [ "You gain this move when you gain Burns Twice as Bright.\n\nWhen you sacrifice a victory to the flames of fate, treat any roll of 10+ as a miss.", "explanation": "", "dice": [], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2610,7 +3034,9 @@ List getMoveList() => [ "Add the following tags to your options for Burning Brand: **messy, forceful, reach, near, far**", "explanation": "", "dice": [], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2622,7 +3048,9 @@ List getMoveList() => [ "When you **introduce a new idea to an NPC**, roll+CHA.\n* On a 10+ They believe the idea to be their own and take to it with fervor\n* On a 7-9, Their passion fades after a day or two. On a miss, they respond negatively, speaking out against the idea.", "explanation": "", "dice": ["2d6+CHA"], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2634,7 +3062,9 @@ List getMoveList() => [ "Gain the Wizard move Ritual. The GM will always tell you what you have to sacrifice to gain the effect you desire.", "explanation": "", "dice": [], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2646,7 +3076,9 @@ List getMoveList() => [ "When you tempt a weak mind with your inner fire, roll+WIS.\n* On a 10+ their will is suppressed, they'll follow you and do as you desire, so long as nothing startles or surprises them.\n* On a 7-9, the effect is only strong enough to distract or confuse them. On a miss, they become agitated and upset, your fire having sparked their hidden desires.", "explanation": "", "dice": ["2d6+WIS"], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2658,7 +3090,9 @@ List getMoveList() => [ "When you would take your last breath, don't. Instead, you may erase one of your Bonds. This is permanent and lowers your total available Bonds forever. You are alive and have 1d6 hp. If you have no more Bonds, take your last breath as normal.", "explanation": "", "dice": ["1d6"], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2670,7 +3104,9 @@ List getMoveList() => [ "When you bolster the courage of others roll+CHA.\n* On a 10+ they shake off all fear and doubt, becoming brave in an instant.\n* On a 7-9, this effect is fleeting, they realize its superficiality and resort to cowardice after a moment or two. On a miss, they're cowed or terrified by your presence.", "explanation": "", "dice": ["2d6+CHA"], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2682,7 +3118,9 @@ List getMoveList() => [ "When you insult an NPC, roll + CHA.\n* On a 10+ you leave them no room to react, they bear your insult and the scorn of all who hear it.\n* On a 7-9 you cross a line, they will have their revenge, someday. On a miss you've gone too far, they blow up here and now.", "explanation": "", "dice": [], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2694,7 +3132,9 @@ List getMoveList() => [ "Whenever you summon fire with any of your moves, you can replace it with the black fires of hell itself. This fire does not burn with heat and ignores armor, scorching the soul itself. Those creatures without souls cannot be harmed by this type of flame.", "explanation": "", "dice": [], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2706,7 +3146,9 @@ List getMoveList() => [ "When you **fuse a willing person's soul to yours**, roll+CHA. On a hit you are bound together, able to sense each other at any distance, as well as sharing your emotional state.\n* On a 7-9, the connection is unstable and dangerous, when you take a debility, so do they (and vice versa).\n* On a miss, the branding is rejected and you both erase any Bonds you have to each other. You may write new Bonds with them at the End of Session as usual. This fusion, once performed, cannot be undone by mortal means.", "explanation": "", "dice": ["2d6+CHA"], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2718,7 +3160,9 @@ List getMoveList() => [ "You may apply the effects of your Firebrand move to a group of people - a dozen or so - all at once.", "explanation": "", "dice": [], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2730,7 +3174,9 @@ List getMoveList() => [ "When you **open a channel to the burning planes and call a firestorm**, tell the GM what you're sacrificing and roll+WIS. The sky opens up and fire pours like rain from it within an area about equal to a small village. Everyone and everything in the area takes damage as appropriate.\n* On a 10+ you can extinguish the storm with a little effort.\n* On a 7-9 the fires rage out of your control, spreading and gusting where they are carried by wind and weather. On a miss, something cruel, intelligent and hungry comes with the storm.", "explanation": "", "dice": ["2d6+WIS"], - "classKeys": ["immolator"], + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2742,7 +3188,9 @@ List getMoveList() => [ "Others may content themselves with just a taste of wine, or dominion over a servant or two, but you want more. Choose two appetites. While pursuing one of your appetites if you would roll for a move, instead of rolling 2d6 you roll 1d6+1d8. If the d6 is the higher die of the pair, the GM will also introduce a complication or danger that comes about due to your heedless pursuits.\n\n* Pure destruction\n* Power over others\n* Mortal pleasures\n* Conquest\n* Riches and property\n* Fame and glory", "explanation": "", "dice": ["2d6", "1d6", "1d8"], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2754,7 +3202,9 @@ List getMoveList() => [ "You take +1 ongoing to last breath rolls. When you take your last breath, on a 7-9 you make an offer to Death in return for your life. If Death accepts he will return you to life. If not, you die.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2765,7 +3215,9 @@ List getMoveList() => [ "description": "While you wield a weapon it gains the forceful and messy tags.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2777,7 +3229,9 @@ List getMoveList() => [ "When you cry out a challenge to your enemies, roll+Con.\n\n* On a 10+ they treat you as the most obvious threat to be dealt with and ignore your companions, take +2 damage ongoing against them.\n* On a 7-9 only a few (the weakest or most foolhardy among them) fall prey to your taunting.", "explanation": "", "dice": ["2d6+CON"], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "starting" }), @@ -2788,7 +3242,9 @@ List getMoveList() => [ "description": "You ignore the clumsy tag on armor you wear.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2800,7 +3256,9 @@ List getMoveList() => [ "So long as you are below your Load and neither wear armor nor carry a shield, take +1 armor.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2811,7 +3269,9 @@ List getMoveList() => [ "description": "Choose an additional appetite.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2823,7 +3283,9 @@ List getMoveList() => [ "Take a move from the fighter, bard or thief class list. You may not take multiclass moves from those classes.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2835,7 +3297,9 @@ List getMoveList() => [ "When you perform a feat of strength, name someone present whom you have impressed and take +1 forward to parley with them.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2847,7 +3311,9 @@ List getMoveList() => [ "At the end of a session, if during this session you have crushed your enemies, seen them driven before you, or have heard the lamentations of their kinfolk, mark XP.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2859,7 +3325,9 @@ List getMoveList() => [ "You've traveled the wide world over. When you arrive someplace ask the GM about any important traditions, rituals, and so on, they'll tell you what you need to know.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2871,7 +3339,9 @@ List getMoveList() => [ "When you prove yourself superior to a person in power, take +1 forward with their followers, underlings, and hangers on.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2883,7 +3353,9 @@ List getMoveList() => [ "Your hirelings always accept the gratuitous fulfillment of one of your appetites as payment.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2895,7 +3367,9 @@ List getMoveList() => [ "You may take a debility to immediately break free of any physical or mental restraint.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2907,7 +3381,9 @@ List getMoveList() => [ "When you hack and slash, on a 12+ deal your damage and choose something physical your target has (a weapon, their position, a limb): they lose it.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2919,7 +3395,9 @@ List getMoveList() => [ "When you take damage you can choose to take 1 ongoing until you sate one of your appetites instead of taking the damage. If you already have this penalty you cannot choose this option.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2931,7 +3409,9 @@ List getMoveList() => [ "When you discern realities add \"What here is weak or vulnerable?\" to the list of questions you can ask.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2943,7 +3423,9 @@ List getMoveList() => [ "When you defy a danger caused by movement (maybe falling off a narrow bridge or rushing past an armed guard) take +1.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced1" }), @@ -2955,7 +3437,9 @@ List getMoveList() => [ "As long as you have less than your Con in current HP (or 1, whichever is higher) take +1 ongoing.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2967,7 +3451,9 @@ List getMoveList() => [ "**Requires:** Appetite for Destruction\n\nTake another move from the fighter, bard or thief class list. You may not take multiclass moves from those classes.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2979,7 +3465,9 @@ List getMoveList() => [ "When you enter battle with a show of force (a shout, a rallying cry, a battle dance) roll+Cha.\n\n* On a 10+ both,\n* On a 7-9 one or the other.\n\t* Your allies are rallied and take +1 forward\n\t* Your enemies feel fear and act accordingly (avoiding you, hiding, attacking with fear driven abandon)", "explanation": "", "dice": ["2d6+CHA"], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -2991,7 +3479,9 @@ List getMoveList() => [ "When you take this move and spend some uninterrupted time reflecting on your past glories you may mark yourself with a symbol of your power (a long braid tied with bells, ritual scars or tattoos, etc.) Any intelligent mortal creature who sees this symbol knows instinctively that you are a force to be reckoned with and treats you appropriately.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -3003,7 +3493,9 @@ List getMoveList() => [ "When you satisfy an appetite to the extreme (destroying something unique and significant, gaining enormous fame, riches, power, etc.) you may choose to resolve it. Cross it off the list and mark XP. While you may pursue that appetite again, you no longer feel the burning desire you once did. In its place, choose a new appetite from the list or write your own.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -3015,7 +3507,9 @@ List getMoveList() => [ "When you defy danger, on a 12+ you turn the danger back on itself, the GM will describe how.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -3027,7 +3521,9 @@ List getMoveList() => [ "Whenever the unclean magic wielded by mortal men causes you to defy danger, treat any result of 6 as a 7-9.", "explanation": "", "dice": [], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }), @@ -3039,7 +3535,9 @@ List getMoveList() => [ "You are initiated in the old ways, the ways of sacrifice. Choose something your gods (or the ancestor spirits, or your totem, etc) value-gold, blood, bones or the like. When you sacrifice those things as per your rites and rituals, roll+Wis.\n\n* On a 10+ the GM will grant you insight into your current trouble or a boon to help you.\n* On a 7-9 the sacrifice is not enough and your gods take of your flesh as well, but still grant you some insight or boon.\n* On a miss, you earn the ire of the fickle spirits.", "explanation": "", "dice": ["2d6+WIS"], - "classKeys": ["barbarian"], + "classKeys": [ + {"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"} + ], "tags": [], "category": "advanced2" }) diff --git a/lib/data/races.dart b/lib/data/races.dart index c66febc..9161b47 100644 --- a/lib/data/races.dart +++ b/lib/data/races.dart @@ -3,210 +3,267 @@ import 'package:dungeon_world_data/race.dart'; List getRaceList() => [ Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "elf", + "key": "c0193cdc-e318-44e5-8229-fbbaf3a98936", "name": "Elf", "description": "When you enter an important location (your call) you can ask the GM for one fact from the history of that location.", "explanation": "", - "classKeys": ["bard"], - "tags": [] + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "human", + "key": "6ff63a18-529e-47d8-902e-8093808a9afa", "name": "Human", "description": "When you first enter a civilized settlement someone who respects the custom of hospitality to minstrels will take you in as their guest.", "explanation": "", - "classKeys": ["bard"], - "tags": [] + "classKeys": [ + {"key": "bard", "name": "Bard", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "dwarf", + "key": "a300fc64-19b4-4615-98f1-87dea6048cf2", "name": "Dwarf", "description": "You are one with stone. When you Commune you are also granted a special version of Words of the Unspeaking as a rote which only works on stone.", "explanation": "", - "classKeys": ["cleric"], - "tags": [] + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "human", + "key": "35a7f478-a172-48d4-904c-24235fac4425", "name": "Human", "description": "Your faith is diverse. Choose one wizard spell. You can cast and be granted that spell as if it was a cleric spell.", "explanation": "", - "classKeys": ["cleric"], - "tags": [] + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "elf", + "key": "4988b58e-8b1e-4204-a94c-e4416bfd0f7a", "name": "Elf", "description": "The sap of the elder trees flows within you. In addition to any other attunements, the Great Forest is always considered your land.", "explanation": "", - "classKeys": ["druid"], - "tags": [] + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "human", + "key": "85bbb517-d3a3-4918-832c-bf2a428ab588", "name": "Human", "description": "As your people learned to bind animals to field and farm, so too are you bound to them. You may always take the shape of any domesticated animal, in addition to your normal options.", "explanation": "", - "classKeys": ["druid"], - "tags": [] + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "halfling", + "key": "b3758f36-1b0e-4ddb-bdd8-ef00cf9b8295", "name": "Halfling", "description": "You sing the healing songs of spring and brook. When you Make Camp, you and your allies heal +1d6.", "explanation": "", - "classKeys": ["druid"], - "tags": [] + "classKeys": [ + {"key": "druid", "name": "Druid", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "dwarf", + "key": "a545c44b-7a25-4224-82d0-1b33173e901b", "name": "Dwarf", "description": "When you share a drink with someone, you may Parley with them using CON instead of CHA.", "explanation": "", - "classKeys": ["fighter"], - "tags": [] + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "elf", + "key": "57600856-b738-426e-bedd-a3175f824c00", "name": "Elf", "description": "Choose one weapon-you can always treat weapons of that type as if they had the precise tag.", "explanation": "", - "classKeys": ["fighter"], - "tags": [] + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "halfling", + "key": "ceeca68d-0e0e-480c-9a8e-a3b50bb4111a", "name": "Halfling", - "description": - "When you Defy Danger and use your small size to your advantage, take +1.", + "description": "When you Defy Danger and use your small size to your advantage, take +1.", "explanation": "", - "classKeys": ["fighter"], - "tags": [] + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "human", + "key": "2177dfa4-4b69-45b2-b495-041664015808", "name": "Human", "description": "Once per battle you may reroll a single damage roll (yours or someone else's).", "explanation": "", - "classKeys": ["fighter"], - "tags": [] + "classKeys": [ + {"key": "fighter", "name": "Fighter", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "human", + "key": "faf9eb5f-3f91-4eb4-ba25-cc81e1c4379a", "name": "Human", "description": "When you pray for guidance, even for a moment, and ask, \"What here is evil?\" the GM will tell you, honestly.", "explanation": "", - "classKeys": ["paladin"], - "tags": [] + "classKeys": [ + {"key": "paladin", "name": "Paladin", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "elf", + "key": "c5f7bf31-ea00-4ec7-aa27-5e45e4898539", "name": "Elf", "description": "When you Undertake a Perilous Journey through wilderness whatever job you take you succeed as if you rolled a 10+.", "explanation": "", - "classKeys": ["ranger"], - "tags": [] + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "human", + "key": "83f43be2-e604-4930-9e28-12c62294bb32", "name": "Human", "description": "When you Make Camp in a dungeon or city, you don't need to consume a ration.", "explanation": "", - "classKeys": ["ranger"], - "tags": [] + "classKeys": [ + {"key": "ranger", "name": "Ranger", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "halfling", + "key": "3fe3c5de-4f0a-44af-9c79-23955b1b33f4", "name": "Halfling", "description": "When you attack with a ranged weapon, deal +2 damage.", "explanation": "", - "classKeys": ["thief"], - "tags": [] + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "human", + "key": "a4eb5d9c-6f54-4418-bb0b-2368bb826c36", "name": "Human", "description": "You are a professional. When you Spout Lore or Discern Realities about criminal activities, take +1.", "explanation": "", - "classKeys": ["thief"], - "tags": [] + "classKeys": [ + {"key": "thief", "name": "Thief", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "elf", + "key": "24d11979-8018-4a69-95a0-346f4bbcad5c", "name": "Elf", - "description": - "Magic is as natural as breath to you. Detect Magic is a cantrip for you.", + "description": "Magic is as natural as breath to you. Detect Magic is a cantrip for you.", "explanation": "", - "classKeys": ["wizard"], - "tags": [] + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "human", + "key": "0b0d4852-8757-410e-90ab-e1f29319bc2e", "name": "Human", - "description": - "Choose one Cleric spell. You can cast it as if it was a Wizard spell.", + "description": "Choose one Cleric spell. You can cast it as if it was a Wizard spell.", "explanation": "", - "classKeys": ["wizard"], - "tags": [] + "classKeys": [ + {"key": "wizard", "name": "Wizard", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "salamander", + "key": "b303254e-631d-4b91-aa9b-caa9b7e1e406", "name": "Salamander", "description": "Non-magical heat and fire cannot harm you.", "explanation": "", - "classKeys": ["immolator"], - "tags": [] + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "human", + "key": "8ac5f523-1005-4b14-a0e0-9436effdb2fc", "name": "Human", - "description": - "When you Make Camp next to a large, open flame, regain all of your HP.", + "description": "When you Make Camp next to a large, open flame, regain all of your HP.", "explanation": "", - "classKeys": ["immolator"], - "tags": [] + "classKeys": [ + {"key": "immolator", "name": "Immolator", "type": "CharacterClass"} + ], + "tags": [], + "dice": [] }), Race.fromJson({ "_meta": {"language": "EN", "createdBy": "__repo__"}, - "key": "outsider", + "key": "1a9183de-262a-4d17-8c15-c8b95f30834b", "name": "Outsider", "description": "You may be elf, dwarf, halfling, or human, but you and your people are not from around here. At the beginning of each session, the GM will ask you something about your homeland, why you left, or what you left behind. If you answer them, mark XP.", "explanation": "", - "classKeys": ["barbarian"], - "tags": [] + "classKeys": [{"key": "barbarian", "name": "Barbarian", "type": "CharacterClass"}], + "tags": [], + "dice": [] }) ]; diff --git a/lib/data/spells.dart b/lib/data/spells.dart index 20a61c2..4ab14ba 100644 --- a/lib/data/spells.dart +++ b/lib/data/spells.dart @@ -9,7 +9,10 @@ List getSpellList() => [ "An item you touch glows with arcane light, about as bright as a torch. It gives off no heat or sound and requires no fuel, but it is otherwise like a mundane torch. You have complete control of the color of the flame. The spell lasts as long as it is in your presence.", "explanation": "", "level": "cantrip", - "classKeys": ["cleric", "wizard"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"}, + {"key": + "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [], "dice": [] }), @@ -21,7 +24,9 @@ List getSpellList() => [ "Food or water you hold in your hands while you cast this spell is consecrated by your deity. In addition to now being holy or unholy, the affected substance is purified of any mundane spoilage.", "explanation": "", "level": "rote", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -33,7 +38,9 @@ List getSpellList() => [ "The symbol of your deity appears before you and gestures towards the direction or course of action your deity would have you take then disappears. The message is through gesture only; your communication through this spell is severely limited.", "explanation": "", "level": "rote", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -45,7 +52,9 @@ List getSpellList() => [ "Your deity smiles upon a combatant of your choice. They take +1 ongoing so long as battle continues and they stand and fight. While this spell is ongoing you take -1 to cast a spell.", "explanation": "", "level": "1", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [ {"name": "Ongoing", "value": null, "description": ""} ], @@ -59,7 +68,9 @@ List getSpellList() => [ "At your touch wounds scab and bones cease to ache. Heal an ally you touch of 1d8 damage.", "explanation": "", "level": "1", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": ["1d8"] }), @@ -71,7 +82,9 @@ List getSpellList() => [ "When you cast this spell choose an alignment: Good, Evil, Lawful, or Chaotic. One of your senses is briefly able to detect that alignment. The GM will tell you what here is of that alignment.", "explanation": "", "level": "1", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -83,7 +96,9 @@ List getSpellList() => [ "Choose a target you can see and a nearby object. The target is afraid of the object so long as you maintain the spell. Their reaction is up to them: flee, panic, beg, fight. While this spell is ongoing you take -1 to cast a spell. You cannot target entities with less than animal intelligence (magical constructs, undead, automatons, and the like).", "explanation": "", "level": "1", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [ {"name": "Ongoing", "value": null, "description": ""} ], @@ -97,7 +112,9 @@ List getSpellList() => [ "The weapon you hold while casting does +1d4 damage until you dismiss this spell. While this spell is ongoing you take -1 to cast a spell.", "explanation": "", "level": "1", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [ {"name": "Ongoing", "value": null, "description": ""} ], @@ -111,7 +128,9 @@ List getSpellList() => [ "As you cast this spell, you walk the perimeter of an area, consecrating it to your deity. As long as you stay within that area you are alerted whenever someone acts with malice within the sanctuary (including entering with harmful intent). Anyone who receives healing within a sanctuary heals +1d4 HP.", "explanation": "", "level": "1", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": ["1d4"] }), @@ -123,7 +142,9 @@ List getSpellList() => [ "A corpse converses with you briefly. It will answer any three questions you pose to it to the best of the knowledge it had in life and the knowledge it gained in death.", "explanation": "", "level": "1", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -135,7 +156,9 @@ List getSpellList() => [ "You invoke a hungry spirit to possess a recently-dead body and serve you. This creates a zombie that follows your orders to the best of its limited abilities. Treat the zombie as a character, but with access to only the basic moves. It has a +1 modifier for all stats and 1 HP. The zombie also gets your choice of 1d4 of these traits:\n\n* It's talented. Give one stat a +2 modifier.\n* It's durable. It has +2 HP for each level you have.\n* It has a functioning brain and can complete complex tasks.\n* It does not appear obviously dead, at least for a day or two.\nThe zombie lasts until it is destroyed by taking damage in excess of its HP, or until you end the spell. While this spell is ongoing you take -1 to cast a spell.", "explanation": "", "level": "3", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [ {"name": "Ongoing", "value": null, "description": ""} ], @@ -149,7 +172,9 @@ List getSpellList() => [ "You staunch bleeding and set bones through magic. Heal an ally you touch of 2d8 damage.", "explanation": "", "level": "3", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": ["2d8"] }), @@ -161,7 +186,9 @@ List getSpellList() => [ "Choose an area you can see: it's filled with supernatural darkness and shadow. While this spell is ongoing you take -1 to cast a spell.", "explanation": "", "level": "3", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [ {"name": "Ongoing", "value": null, "description": ""} ], @@ -175,7 +202,9 @@ List getSpellList() => [ "Tell the GM you would like to resurrect a corpse whose soul has not yet fully departed this world. Resurrection is always possible, but the GM will give you one or more (possibly all) of these conditions to fulfill:\n\n* It's going to take days/weeks/months\n* You must get help from ____\n* It will require a lot of money\n* You must sacrifice ____ to do it\nThe GM may, depending on the circumstances, allow you to resurrect the corpse now, with the understanding that the conditions must be met before it's permanent, or require you to meet the conditions before the corpse is resurrected.", "explanation": "", "level": "3", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -187,7 +216,9 @@ List getSpellList() => [ "Choose a person you can see. Until you cast a spell or leave their presence they cannot act except to speak. This effect ends immediately if the target takes damage from any source.", "explanation": "", "level": "3", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -199,7 +230,9 @@ List getSpellList() => [ "Your deity answers your prayers with a moment of perfect understanding. The GM will shed light on the current situation. When acting on the information, you take +1 forward.", "explanation": "", "level": "5", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -210,7 +243,9 @@ List getSpellList() => [ "description": "Heal an ally you touch of 3d8 damage.", "explanation": "", "level": "5", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": ["3d8"] }), @@ -222,7 +257,9 @@ List getSpellList() => [ "Name a person, place, or thing you want to learn about. Your deity grants you visions of the target, as clear as if you were there.", "explanation": "", "level": "5", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -234,7 +271,9 @@ List getSpellList() => [ "Choose a creature you can see. Until you end this spell, the target suffers from a disease of your choice. While this spell is ongoing you take -1 to cast a spell.", "explanation": "", "level": "5", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [ {"name": "Ongoing", "value": null, "description": ""} ], @@ -248,7 +287,9 @@ List getSpellList() => [ "With a touch you speak to the spirits within things. The non-living object you touch answers three questions you pose, as best it can.", "explanation": "", "level": "5", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -260,7 +301,10 @@ List getSpellList() => [ "You see all things as they truly are. This effect persists until you tell a lie or dismiss the spell. While this spell is ongoing you take -1 to cast a spell.", "explanation": "", "level": "7", - "classKeys": ["cleric", "wizard"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"}, + {"key": + "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Divination", "value": null, "description": ""}, {"name": "Ongoing", "value": null, "description": ""} @@ -275,7 +319,9 @@ List getSpellList() => [ "You trap the soul of a dying creature within a gem. The trapped creature is aware of its imprisonment but can still be manipulated through spells, parley, and other effects. All moves against the trapped creature are at +1. You can free the soul at any time but it can never be recaptured once freed.", "explanation": "", "level": "5", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -287,7 +333,9 @@ List getSpellList() => [ "Choose a word. The first time after casting this spell that you speak the chosen word, you and any allies touching you when you cast the spell are immediately returned to the exact spot where you cast the spell. You can only maintain a single location; casting Word of Recall again before speaking the word replaces the earlier spell.", "explanation": "", "level": "7", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -299,7 +347,9 @@ List getSpellList() => [ "Touch an ally and you may heal their damage a number of points up to your maximum HP.", "explanation": "", "level": "7", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -311,7 +361,9 @@ List getSpellList() => [ "Touch an enemy and strike them with divine wrath-deal 2d8 damage to them and 1d6 damage to yourself. This damage ignores armor.", "explanation": "", "level": "7", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": ["2d8", "1d6"] }), @@ -323,7 +375,9 @@ List getSpellList() => [ "Choose an appendage on the target such as an arm, tentacle, or wing. The appendage is magically severed from their body, causing no damage but considerable pain. Missing an appendage may, for example, keep a winged creature from flying, or a bull from goring you on its horns. While this spell is ongoing you take -1 to cast a spell.", "explanation": "", "level": "7", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [ {"name": "Ongoing", "value": null, "description": ""} ], @@ -337,7 +391,9 @@ List getSpellList() => [ "Choose a creature whose true name you know. This spell creates permanent runes on a target surface that will kill that creature, should they read them.", "explanation": "", "level": "7", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -349,7 +405,9 @@ List getSpellList() => [ "Pray for rain-or sun, wind, or snow. Within a day or so, your god will answer. The weather will change according to your will and last a handful of days.", "explanation": "", "level": "7", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -361,7 +419,9 @@ List getSpellList() => [ "Your deity brings the unnatural weather of your choice to pass. Rain of blood or acid, clouds of souls, wind that can carry away buildings, or any other weather you can imagine: ask and it shall come.", "explanation": "", "level": "9", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -373,7 +433,9 @@ List getSpellList() => [ "Choose one event in the target's past. All effects of that event, including damage, poison, disease, and magical effects, are ended and repaired. HP and diseases are healed, poisons are neutralized, magical effects are ended.", "explanation": "", "level": "9", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -385,7 +447,9 @@ List getSpellList() => [ "Every creature must ask your leave to enter your presence, and you must give permission aloud for them to enter. Any creature without your leave takes an extra 1d10 damage whenever they take damage in your presence. While this spell is ongoing you take -1 to cast a spell.", "explanation": "", "level": "9", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [ {"name": "Ongoing", "value": null, "description": ""} ], @@ -399,7 +463,9 @@ List getSpellList() => [ "The mindless undead creature you touch is destroyed and you steal its death energy to heal yourself or the next ally you touch. The amount of damage healed is equal to the HP that the creature had remaining before you destroyed it.", "explanation": "", "level": "9", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [], "dice": [] }), @@ -411,7 +477,9 @@ List getSpellList() => [ "Name a city, town, encampment, or other place where people live. As long as this spell is active that place is beset by a plague appropriate to your deity's domains (locusts, death of the first born, etc.) While this spell is ongoing you take -1 to cast a spell.", "explanation": "", "level": "9", - "classKeys": ["cleric"], + "classKeys": [ + {"key": "cleric", "name": "Cleric", "type": "CharacterClass"} + ], "tags": [ {"name": "Ongoing", "value": null, "description": ""} ], @@ -425,7 +493,7 @@ List getSpellList() => [ "You perform minor tricks of true magic. If you touch an item as part of the casting you can make cosmetic changes to it: clean it, soil it, cool it, warm it, flavor it, or change its color. If you cast the spell without touching an item you can instead create minor illusions no bigger than yourself. Prestidigitation illusions are crude and clearly illusions-they won't fool anyone, but they might entertain them.", "explanation": "", "level": "cantrip", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [], "dice": [] }), @@ -437,7 +505,7 @@ List getSpellList() => [ "You conjure a simple invisible construct that can do nothing but carry items. It has Load 3 and carries anything you hand to it. It cannot pick up items on its own and can only carry those you give to it. Items carried by an unseen servant appear to float in the air a few paces behind you. An unseen servant that takes damage or leaves your presence is immediately dispelled, dropping any items it carried. Otherwise the unseen servant serves you until you end the spell.", "explanation": "", "level": "cantrip", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Ongoing", "value": null, "description": ""} ], @@ -451,7 +519,7 @@ List getSpellList() => [ "Name the spirit you wish to contact (or leave it to the GM). You pull that creature through the planes, just close enough to speak to you. It is bound to answer any one question you ask to the best of its ability.", "explanation": "", "level": "1", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Summoning", "value": null, "description": ""} ], @@ -465,7 +533,7 @@ List getSpellList() => [ "One of your senses is briefly attuned to magic. The GM will tell you what here is magical.", "explanation": "", "level": "1", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Divination", "value": null, "description": ""} ], @@ -479,7 +547,7 @@ List getSpellList() => [ "You form a telepathic bond with a single person you touch, enabling you to converse with that person through your thoughts. You can only have one telepathic bond at a time.", "explanation": "", "level": "1", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Divination", "value": null, "description": ""}, {"name": "Ongoing", "value": null, "description": ""} @@ -494,7 +562,7 @@ List getSpellList() => [ "The person (not beast or monster) you touch while casting this spell counts you as a friend until they take damage or you prove otherwise.", "explanation": "", "level": "1", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Enchantment", "value": null, "description": ""}, {"name": "Ongoing", "value": null, "description": ""} @@ -509,7 +577,7 @@ List getSpellList() => [ "Touch an ally: nobody can see them. They're invisible! The spell persists until the target attacks or you dismiss the effect. While the spell is ongoing you can't cast a spell.", "explanation": "", "level": "1", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Illusion", "value": null, "description": ""}, {"name": "Ongoing", "value": null, "description": ""} @@ -524,7 +592,7 @@ List getSpellList() => [ "Projectiles of pure magic spring from your fingers. Deal 2d4 damage to one target.", "explanation": "", "level": "1", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Evocation", "value": null, "description": ""} ], @@ -538,7 +606,7 @@ List getSpellList() => [ "Walk a wide circle as you cast this spell. Until you prepare spells again your magic will alert you if a creature crosses that circle. Even if you are asleep, the spell will shake you from your slumber.", "explanation": "", "level": "1", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [], "dice": [] }), @@ -550,7 +618,7 @@ List getSpellList() => [ "Choose a spell or magic effect in your presence: this spell rips it apart. Lesser spells are ended, powerful magic is just reduced or dampened so long as you are nearby.", "explanation": "", "level": "3", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [], "dice": [] }), @@ -562,7 +630,7 @@ List getSpellList() => [ "Cast this spell and gaze into a reflective surface to see into the depths of time. The GM will reveal the details of a grim portent to you-a bleak event that will come to pass without your intervention. Theyll tell you something useful about how you can interfere with the grim portent's dark outcomes. Rare is the portent that claims \"You'll live happily ever after.\" Sorry.", "explanation": "", "level": "3", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Divination", "value": null, "description": ""} ], @@ -576,7 +644,7 @@ List getSpellList() => [ "You evoke a mighty ball of flame that envelops your target and everyone nearby, inflicting 2d6 damage which ignores armor.", "explanation": "", "level": "3", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Evocation", "value": null, "description": ""} ], @@ -590,7 +658,7 @@ List getSpellList() => [ "You take the form of someone you touch while casting this spell. Your physical characteristics match theirs exactly but your behavior may not. This change persists until you take damage or choose to return to your own form. While this spell is ongoing you lose access to all your wizard moves.", "explanation": "", "level": "3", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Ongoing", "value": null, "description": ""} ], @@ -604,7 +672,7 @@ List getSpellList() => [ "You create an illusory image of yourself. When you are attacked, roll a d6.\n* On a 4, 5, or 6 the attack hits the illusion instead, the image then dissipates and the spell ends.", "explanation": "", "level": "3", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Illusion", "value": null, "description": ""} ], @@ -618,7 +686,7 @@ List getSpellList() => [ "1d4 enemies you can see of the GM's choice fall asleep. Only creatures capable of sleeping are affected. They awake as normal: loud noises, jolts, pain.", "explanation": "", "level": "3", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Enchantment", "value": null, "description": ""} ], @@ -632,7 +700,7 @@ List getSpellList() => [ "The target is held in a cage of magical force. Nothing can get in or out of the cage. The cage remains until you cast another spell or dismiss it. While the spell is ongoing, the caged creature can hear your thoughts and you cannot leave sight of the cage.", "explanation": "", "level": "5", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Evocation", "value": null, "description": ""}, {"name": "Ongoing", "value": null, "description": ""} @@ -647,7 +715,7 @@ List getSpellList() => [ "You send a request to another plane. Specify who or what you'd like to contact by location, type of creature, name, or title. You open a two-way communication with that creature. Your communication can be cut off at any time by you or the creature you contacted.", "explanation": "", "level": "5", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Divination", "value": null, "description": ""} ], @@ -661,7 +729,7 @@ List getSpellList() => [ "Your touch reshapes a creature entirely, they stay in the form you craft until you cast a spell. Describe the new shape you craft, including any stat changes, significant adaptations, or major weaknesses. The GM will then tell you one or more of these:\n* The form will be unstable and temporary\n* The creature's mind will be altered as well\n* The form has an unintended benefit or weakness", "explanation": "", "level": "5", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Enchantment", "value": null, "description": ""} ], @@ -675,7 +743,7 @@ List getSpellList() => [ "A monster appears and aids you as best it can. Treat it as your character, but with access to only the basic moves. It has +1 modifier for all stats, 1 HP, and uses your damage dice. The monster also gets your choice of 1d6 of these traits:\n* It has +2 instead of +1 to one stat\n* It's not reckless\n* It does 1d8 damage\n* Its bond to your plane is strong: +2 HP for each level you have\n* It has some useful adaptation\nThe GM will tell you the type of monster you get based on the traits you select. The creature remains on this plane until it dies or you dismiss it. While the spell is ongoing you take -1 to cast a spell.", "explanation": "", "level": "5", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Summoning", "value": null, "description": ""}, {"name": "Ongoing", "value": null, "description": ""} @@ -690,7 +758,7 @@ List getSpellList() => [ "Your touch pushes your mind into someone else's. You gain 1d4 hold. Spend one hold to make the target take one of these actions:\n* Speak a few words of your choice\n* Give you something they hold\n* Make a concerted attack on a target of your choice\n* Truthfully answer one question\n\nIf you run out of hold the spell ends. If the target takes damage you lose 1 hold. While the spell is ongoing you cannot cast a spell.", "explanation": "", "level": "7", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Enchantment", "value": null, "description": ""}, {"name": "Ongoing", "value": null, "description": ""} @@ -705,7 +773,7 @@ List getSpellList() => [ "The shadows you target with this spell become a portal for you and your allies. Name a location, describing it with a number of words up to your level. Stepping through the portal deposits you and any allies present when you cast the spell at the location you described. The portal may only be used once by each ally.", "explanation": "", "level": "7", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Illusion", "value": null, "description": ""} ], @@ -719,7 +787,7 @@ List getSpellList() => [ "Choose a 5th level or lower spell you know. Describe a trigger condition using a number of words equal to your level. The chosen spell is held until you choose to unleash it or the trigger condition is met, whichever happens first. You don't have to roll for the held spell, it just takes effect. You may only have a single contingent spell held at a time; if you cast Contingency while you have a held spell, the new held spell replaces the old one.", "explanation": "", "level": "7", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Evocation", "value": null, "description": ""} ], @@ -733,7 +801,7 @@ List getSpellList() => [ "A cloud of fog drifts into this realm from beyond the Black Gates of Death, filling the immediate area. Whenever a creature in the area takes damage it takes an additional, separate 1d6 damage which ignores armor. This spell persists so long as you can see the affected area, or until you dismiss it.", "explanation": "", "level": "7", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Summoning", "value": null, "description": ""}, {"name": "Ongoing", "value": null, "description": ""} @@ -748,7 +816,7 @@ List getSpellList() => [ "Choose a target and describe a type of creature or an alignment. Creatures of the specified type or alignment cannot come within sight of the target. If a creature of the specified type does find itself within sight of the target, it immediately flees. This effect continues until you leave the target's presence or you dismiss the spell. While the spell is ongoing you take -1 to cast a spell.", "explanation": "", "level": "9", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Enchantment", "value": null, "description": ""}, {"name": "Ongoing", "value": null, "description": ""} @@ -763,7 +831,7 @@ List getSpellList() => [ "Describe an event. The GM will tell you when that event occurs, no matter where you are or how far away the event is. If you choose, you can view the location of the event as though you were there in person. You can only have one Alert active at a time.", "explanation": "", "level": "9", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Divination", "value": null, "description": ""} ], @@ -777,7 +845,7 @@ List getSpellList() => [ "You trap the soul of a dying creature within a gem. The trapped creature is aware of its imprisonment but can still be manipulated through spells, parley, and other effects. All moves against the trapped creature are at +1. You can free the soul at any time but it can never be recaptured once freed.", "explanation": "", "level": "9", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [], "dice": [] }), @@ -789,7 +857,7 @@ List getSpellList() => [ "You create a structure out of pure magical power. It can be as large as a castle or as small as a hut, but is impervious to all non-magical damage. The structure endures until you leave it or you end the spell.", "explanation": "", "level": "9", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Evocation", "value": null, "description": ""}, {"name": "Ongoing", "value": null, "description": ""} @@ -804,7 +872,7 @@ List getSpellList() => [ "You teleport a creature to your presence. Name a creature or give a short description of a type of creature. If you named a creature, that creature appears before you. If you described a type of creature, a creature of that type appears before you.", "explanation": "", "level": "9", - "classKeys": ["wizard"], + "classKeys": [{"key": "wizard", "name": "Wizard", "type": "CharacterClass"}], "tags": [ {"name": "Summoning", "value": null, "description": ""} ], diff --git a/lib/dungeon_world_data.dart b/lib/dungeon_world_data.dart index 5ccf750..b1faf27 100644 --- a/lib/dungeon_world_data.dart +++ b/lib/dungeon_world_data.dart @@ -1,13 +1,14 @@ export 'alignment.dart'; -export 'session_mark.dart'; export 'character_class.dart'; export 'dice.dart'; +export 'entity_reference.dart'; export 'gear_choice.dart'; export 'gear_selection.dart'; export 'item.dart'; export 'monster.dart'; export 'move.dart'; export 'race.dart'; +export 'session_mark.dart'; export 'spell.dart'; export 'tag.dart'; diff --git a/lib/entity_reference.dart b/lib/entity_reference.dart new file mode 100644 index 0000000..238e6bb --- /dev/null +++ b/lib/entity_reference.dart @@ -0,0 +1,40 @@ +import 'dart:convert'; + +class EntityReference { + final String key; + final String name; + final String type; + + EntityReference({ + required this.key, + required this.name, + required this.type, + }); + + factory EntityReference.fromRawJson(String str) => EntityReference.fromJson(json.decode(str)); + + factory EntityReference.fromJson(Map json) => EntityReference( + key: json['key'], + name: json['name'], + type: json['type'], + ); + + Map toJson() => { + 'key': key, + 'name': name, + 'type': type, + }; + + String toRawJson() => json.encode(toJson()); + + EntityReference copyWith({ + String? key, + String? name, + String? type, + }) => + EntityReference( + key: key ?? this.key, + name: name ?? this.name, + type: type ?? this.type, + ); +} diff --git a/lib/gear_choice.dart b/lib/gear_choice.dart index fc87ea8..69f56b6 100644 --- a/lib/gear_choice.dart +++ b/lib/gear_choice.dart @@ -64,4 +64,7 @@ class GearChoice with KeyMixin { : preselect.first == -1 ? selections : selections.sublist(preselect.first, preselect.last); + + @override + String get displayName => description; } diff --git a/lib/gear_option.dart b/lib/gear_option.dart index 9ab763b..6c068b0 100644 --- a/lib/gear_option.dart +++ b/lib/gear_option.dart @@ -42,4 +42,7 @@ class GearOption with KeyMixin { "item": item.toJson(), "amount": amount, }; + + @override + String get displayName => '${item.name} x$amount'; } diff --git a/lib/gear_selection.dart b/lib/gear_selection.dart index efb9480..27aa5a8 100644 --- a/lib/gear_selection.dart +++ b/lib/gear_selection.dart @@ -52,4 +52,7 @@ class GearSelection with KeyMixin { "options": List.from(options.map((x) => x.toJson())), "coins": coins, }; + + @override + String get displayName => description; } diff --git a/lib/item.dart b/lib/item.dart index 243c66c..acafb1e 100644 --- a/lib/item.dart +++ b/lib/item.dart @@ -54,4 +54,7 @@ class Item with KeyMixin { "description": description, "tags": List.from(tags.map((x) => x.toJson())), }; + + @override + String get displayName => name; } diff --git a/lib/monster.dart b/lib/monster.dart index 263bc1f..510530f 100644 --- a/lib/monster.dart +++ b/lib/monster.dart @@ -66,4 +66,7 @@ class Monster with KeyMixin { "tags": List.from(tags.map((x) => x.toJson())), "moves": moves, }; + + @override + String get displayName => name; } diff --git a/lib/move.dart b/lib/move.dart index 8865cba..d0d8faa 100644 --- a/lib/move.dart +++ b/lib/move.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'base.dart'; import 'dice.dart'; +import 'entity_reference.dart'; import 'tag.dart'; enum MoveCategory { @@ -34,7 +35,7 @@ class Move with KeyMixin { final String description; final String explanation; final List dice; - final List classKeys; + final List classKeys; final List tags; final MoveCategory category; @@ -45,7 +46,7 @@ class Move with KeyMixin { String? description, String? explanation, List? dice, - List? classKeys, + List? classKeys, List? tags, MoveCategory? category, }) => @@ -72,7 +73,8 @@ class Move with KeyMixin { description: json["description"], explanation: json["explanation"], dice: List.from(json["dice"].map((x) => Dice.fromJson(x))), - classKeys: List.from(json["classKeys"].map((x) => x)), + classKeys: + List.from(json["classKeys"].map((x) => EntityReference.fromJson(x))), tags: List.from(json["tags"].map((x) => Tag.fromJson(x))), category: MoveCategory.values.firstWhere((element) => element.name == json["category"]), ); @@ -84,8 +86,11 @@ class Move with KeyMixin { "description": description, "explanation": explanation, "dice": List.from(dice.map((x) => x.toJson())), - "classKeys": List.from(classKeys.map((x) => x)), + "classKeys": List.from(classKeys.map((x) => x.toJson())), "tags": List.from(tags.map((x) => x.toJson())), "category": category.name, }; + + @override + String get displayName => name; } diff --git a/lib/race.dart b/lib/race.dart index 6468752..04c8d2f 100644 --- a/lib/race.dart +++ b/lib/race.dart @@ -1,6 +1,8 @@ import 'dart:convert'; import 'base.dart'; +import 'dice.dart'; +import 'entity_reference.dart'; import 'tag.dart'; class Race with KeyMixin { @@ -10,6 +12,7 @@ class Race with KeyMixin { required this.name, required this.description, required this.explanation, + required this.dice, required this.classKeys, required this.tags, }); @@ -21,8 +24,9 @@ class Race with KeyMixin { final String name; final String description; final String explanation; - final List classKeys; + final List classKeys; final List tags; + final List dice; Race copyWith({ dynamic meta, @@ -30,8 +34,9 @@ class Race with KeyMixin { String? name, String? description, String? explanation, - List? classKeys, + List? classKeys, List? tags, + List? dice, }) => Race( meta: meta ?? this.meta, @@ -41,6 +46,7 @@ class Race with KeyMixin { explanation: explanation ?? this.explanation, classKeys: classKeys ?? this.classKeys, tags: tags ?? this.tags, + dice: dice ?? this.dice, ); factory Race.fromRawJson(String str) => Race.fromJson(json.decode(str)); @@ -53,8 +59,10 @@ class Race with KeyMixin { name: json["name"], description: json["description"], explanation: json["explanation"], - classKeys: List.from(json["classKeys"].map((x) => x)), + classKeys: + List.from(json["classKeys"].map((x) => EntityReference.fromJson(x))), tags: List.from(json["tags"].map((x) => Tag.fromJson(x))), + dice: List.from(json["dice"].map((x) => Dice.fromJson(x))), ); Map toJson() => { @@ -63,7 +71,11 @@ class Race with KeyMixin { "name": name, "description": description, "explanation": explanation, - "classKeys": List.from(classKeys.map((x) => x)), + "classKeys": List.from(classKeys.map((x) => x.toJson())), "tags": List.from(tags.map((x) => x.toJson())), + "dice": List.from(dice.map((x) => x.toJson())) }; + + @override + String get displayName => name; } diff --git a/lib/session_mark.dart b/lib/session_mark.dart index ae5fa00..e99d39d 100644 --- a/lib/session_mark.dart +++ b/lib/session_mark.dart @@ -48,4 +48,7 @@ class SessionMark with KeyMixin { "completed": completed, "type": type.name, }; + + @override + String get displayName => description; } diff --git a/lib/spell.dart b/lib/spell.dart index 319f564..03f9ac8 100644 --- a/lib/spell.dart +++ b/lib/spell.dart @@ -2,6 +2,7 @@ import 'dart:convert'; import 'base.dart'; import 'dice.dart'; +import 'entity_reference.dart'; import 'tag.dart'; class Spell with KeyMixin { @@ -25,7 +26,7 @@ class Spell with KeyMixin { final String description; final String explanation; final String level; - final List classKeys; + final List classKeys; final List dice; final List tags; @@ -36,7 +37,7 @@ class Spell with KeyMixin { String? description, String? explanation, String? level, - List? classKeys, + List? classKeys, List? dice, List? tags, }) => @@ -63,7 +64,8 @@ class Spell with KeyMixin { description: json["description"] ?? '', explanation: json["explanation"] ?? '', level: json["level"] ?? '', - classKeys: List.from(json["classKeys"].map((x) => x)), + classKeys: + List.from(json["classKeys"].map((x) => EntityReference.fromJson(x))), tags: List.from(json["tags"].map((x) => Tag.fromJson(x))), dice: List.from(json["dice"].map((x) => Dice.fromJson(x))), ); @@ -75,8 +77,11 @@ class Spell with KeyMixin { "description": description, "explanation": explanation, "level": level, - "classKeys": List.from(classKeys.map((x) => x)), + "classKeys": List.from(classKeys.map((x) => x.toJson())), "tags": List.from(tags.map((x) => x.toJson())), "dice": List.from(dice.map((x) => x.toJson())), }; + + @override + String get displayName => name; } diff --git a/lib/tag.dart b/lib/tag.dart index cf9a283..fd52d8f 100644 --- a/lib/tag.dart +++ b/lib/tag.dart @@ -42,4 +42,7 @@ class Tag with KeyMixin { "value": value, "description": description, }; + + @override + String get displayName => name; } diff --git a/web/index.d.ts b/web/index.d.ts index 60287d0..00c06d5 100644 --- a/web/index.d.ts +++ b/web/index.d.ts @@ -82,29 +82,35 @@ export interface Monster { moves: string[] } -export interface MoveLike { +export type MoveLike = { + [key in FaveKey]: boolean +} & { _meta: Meta key: string name: string description: string explanation: string - classKeys: string[] + classKeys: EntityReference[] tags: Tag[] + dice: string[] } -export interface Move extends MoveLike { - dice: string[] +export interface Move extends MoveLike<"favorite"> { category: MoveCategory - favorited: boolean } -export interface Spell extends MoveLike { +export interface Spell extends MoveLike<"prepared"> { level: string - dice: string[] - prepared: boolean } -export interface Race extends MoveLike { + +export interface Race extends MoveLike<"favorite"> { // } +export interface EntityReference { + key: string + name: string + type: string +} + export type MoveCategory = "basic" | "special" | "starting" | "advanced1" | "advanced2" diff --git a/web/package.json b/web/package.json index 93dbd81..4be3020 100755 --- a/web/package.json +++ b/web/package.json @@ -1,6 +1,6 @@ { "name": "dw-data", - "version": "3.0.0-pre.1", + "version": "3.0.0-pre.10", "main": "index.js", "repository": "https://github.com/chenasraf/dungeon_world_data", "author": "Chen Asraf ",