mirror of
https://github.com/DungeonPaper/dungeon_world_data.git
synced 2026-05-17 18:08:01 +00:00
refactor class keys
This commit is contained in:
28
.vscode/tasks.json
vendored
Normal file
28
.vscode/tasks.json
vendored
Normal file
@@ -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": []
|
||||
},
|
||||
]
|
||||
}
|
||||
@@ -50,6 +50,9 @@ class Alignment with KeyMixin {
|
||||
"key": key,
|
||||
"description": description,
|
||||
};
|
||||
|
||||
@override
|
||||
String get displayName => description;
|
||||
}
|
||||
|
||||
class AlignmentValues {
|
||||
|
||||
@@ -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(),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -106,4 +106,7 @@ class CharacterClass with KeyMixin {
|
||||
"bonds": List<dynamic>.from(bonds.map((x) => x)),
|
||||
"gearChoices": List<dynamic>.from(gearChoices.map((x) => x.toJson())),
|
||||
};
|
||||
|
||||
@override
|
||||
String get displayName => name;
|
||||
}
|
||||
|
||||
@@ -1668,7 +1668,12 @@ List<CharacterClass> 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<CharacterClass> getCharacterClassList() => [
|
||||
"description": "Choose one",
|
||||
"selections": [
|
||||
{
|
||||
"key": "adventuring_gear",
|
||||
"key": "adventuring_gear_and_dungeon_rations",
|
||||
"description": "Adventuring Gear",
|
||||
"options": [
|
||||
{
|
||||
@@ -1855,12 +1860,42 @@ List<CharacterClass> 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<CharacterClass> 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
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3,210 +3,267 @@ import 'package:dungeon_world_data/race.dart';
|
||||
List<Race> 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": []
|
||||
})
|
||||
];
|
||||
|
||||
@@ -9,7 +9,10 @@ List<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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<Spell> 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": ""}
|
||||
],
|
||||
|
||||
@@ -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';
|
||||
|
||||
|
||||
40
lib/entity_reference.dart
Normal file
40
lib/entity_reference.dart
Normal file
@@ -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<String, dynamic> json) => EntityReference(
|
||||
key: json['key'],
|
||||
name: json['name'],
|
||||
type: json['type'],
|
||||
);
|
||||
|
||||
Map<String, dynamic> 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,
|
||||
);
|
||||
}
|
||||
@@ -64,4 +64,7 @@ class GearChoice with KeyMixin {
|
||||
: preselect.first == -1
|
||||
? selections
|
||||
: selections.sublist(preselect.first, preselect.last);
|
||||
|
||||
@override
|
||||
String get displayName => description;
|
||||
}
|
||||
|
||||
@@ -42,4 +42,7 @@ class GearOption with KeyMixin {
|
||||
"item": item.toJson(),
|
||||
"amount": amount,
|
||||
};
|
||||
|
||||
@override
|
||||
String get displayName => '${item.name} x$amount';
|
||||
}
|
||||
|
||||
@@ -52,4 +52,7 @@ class GearSelection with KeyMixin {
|
||||
"options": List<dynamic>.from(options.map((x) => x.toJson())),
|
||||
"coins": coins,
|
||||
};
|
||||
|
||||
@override
|
||||
String get displayName => description;
|
||||
}
|
||||
|
||||
@@ -54,4 +54,7 @@ class Item with KeyMixin {
|
||||
"description": description,
|
||||
"tags": List<dynamic>.from(tags.map((x) => x.toJson())),
|
||||
};
|
||||
|
||||
@override
|
||||
String get displayName => name;
|
||||
}
|
||||
|
||||
@@ -66,4 +66,7 @@ class Monster with KeyMixin {
|
||||
"tags": List<dynamic>.from(tags.map((x) => x.toJson())),
|
||||
"moves": moves,
|
||||
};
|
||||
|
||||
@override
|
||||
String get displayName => name;
|
||||
}
|
||||
|
||||
@@ -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> dice;
|
||||
final List<String> classKeys;
|
||||
final List<EntityReference> classKeys;
|
||||
final List<Tag> tags;
|
||||
final MoveCategory category;
|
||||
|
||||
@@ -45,7 +46,7 @@ class Move with KeyMixin {
|
||||
String? description,
|
||||
String? explanation,
|
||||
List<Dice>? dice,
|
||||
List<String>? classKeys,
|
||||
List<EntityReference>? classKeys,
|
||||
List<Tag>? tags,
|
||||
MoveCategory? category,
|
||||
}) =>
|
||||
@@ -72,7 +73,8 @@ class Move with KeyMixin {
|
||||
description: json["description"],
|
||||
explanation: json["explanation"],
|
||||
dice: List<Dice>.from(json["dice"].map((x) => Dice.fromJson(x))),
|
||||
classKeys: List<String>.from(json["classKeys"].map((x) => x)),
|
||||
classKeys:
|
||||
List<EntityReference>.from(json["classKeys"].map((x) => EntityReference.fromJson(x))),
|
||||
tags: List<Tag>.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<String>.from(dice.map((x) => x.toJson())),
|
||||
"classKeys": List<dynamic>.from(classKeys.map((x) => x)),
|
||||
"classKeys": List<dynamic>.from(classKeys.map((x) => x.toJson())),
|
||||
"tags": List<dynamic>.from(tags.map((x) => x.toJson())),
|
||||
"category": category.name,
|
||||
};
|
||||
|
||||
@override
|
||||
String get displayName => name;
|
||||
}
|
||||
|
||||
@@ -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<String> classKeys;
|
||||
final List<EntityReference> classKeys;
|
||||
final List<Tag> tags;
|
||||
final List<Dice> dice;
|
||||
|
||||
Race copyWith({
|
||||
dynamic meta,
|
||||
@@ -30,8 +34,9 @@ class Race with KeyMixin {
|
||||
String? name,
|
||||
String? description,
|
||||
String? explanation,
|
||||
List<String>? classKeys,
|
||||
List<EntityReference>? classKeys,
|
||||
List<Tag>? tags,
|
||||
List<Dice>? 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<String>.from(json["classKeys"].map((x) => x)),
|
||||
classKeys:
|
||||
List<EntityReference>.from(json["classKeys"].map((x) => EntityReference.fromJson(x))),
|
||||
tags: List<Tag>.from(json["tags"].map((x) => Tag.fromJson(x))),
|
||||
dice: List<Dice>.from(json["dice"].map((x) => Dice.fromJson(x))),
|
||||
);
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
@@ -63,7 +71,11 @@ class Race with KeyMixin {
|
||||
"name": name,
|
||||
"description": description,
|
||||
"explanation": explanation,
|
||||
"classKeys": List<dynamic>.from(classKeys.map((x) => x)),
|
||||
"classKeys": List<dynamic>.from(classKeys.map((x) => x.toJson())),
|
||||
"tags": List<dynamic>.from(tags.map((x) => x.toJson())),
|
||||
"dice": List<dynamic>.from(dice.map((x) => x.toJson()))
|
||||
};
|
||||
|
||||
@override
|
||||
String get displayName => name;
|
||||
}
|
||||
|
||||
@@ -48,4 +48,7 @@ class SessionMark with KeyMixin {
|
||||
"completed": completed,
|
||||
"type": type.name,
|
||||
};
|
||||
|
||||
@override
|
||||
String get displayName => description;
|
||||
}
|
||||
|
||||
@@ -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<String> classKeys;
|
||||
final List<EntityReference> classKeys;
|
||||
final List<Dice> dice;
|
||||
final List<Tag> tags;
|
||||
|
||||
@@ -36,7 +37,7 @@ class Spell with KeyMixin {
|
||||
String? description,
|
||||
String? explanation,
|
||||
String? level,
|
||||
List<String>? classKeys,
|
||||
List<EntityReference>? classKeys,
|
||||
List<Dice>? dice,
|
||||
List<Tag>? tags,
|
||||
}) =>
|
||||
@@ -63,7 +64,8 @@ class Spell with KeyMixin {
|
||||
description: json["description"] ?? '',
|
||||
explanation: json["explanation"] ?? '',
|
||||
level: json["level"] ?? '',
|
||||
classKeys: List<String>.from(json["classKeys"].map((x) => x)),
|
||||
classKeys:
|
||||
List<EntityReference>.from(json["classKeys"].map((x) => EntityReference.fromJson(x))),
|
||||
tags: List<Tag>.from(json["tags"].map((x) => Tag.fromJson(x))),
|
||||
dice: List<Dice>.from(json["dice"].map((x) => Dice.fromJson(x))),
|
||||
);
|
||||
@@ -75,8 +77,11 @@ class Spell with KeyMixin {
|
||||
"description": description,
|
||||
"explanation": explanation,
|
||||
"level": level,
|
||||
"classKeys": List<dynamic>.from(classKeys.map((x) => x)),
|
||||
"classKeys": List<dynamic>.from(classKeys.map((x) => x.toJson())),
|
||||
"tags": List<dynamic>.from(tags.map((x) => x.toJson())),
|
||||
"dice": List<dynamic>.from(dice.map((x) => x.toJson())),
|
||||
};
|
||||
|
||||
@override
|
||||
String get displayName => name;
|
||||
}
|
||||
|
||||
@@ -42,4 +42,7 @@ class Tag with KeyMixin {
|
||||
"value": value,
|
||||
"description": description,
|
||||
};
|
||||
|
||||
@override
|
||||
String get displayName => name;
|
||||
}
|
||||
|
||||
24
web/index.d.ts
vendored
24
web/index.d.ts
vendored
@@ -82,29 +82,35 @@ export interface Monster {
|
||||
moves: string[]
|
||||
}
|
||||
|
||||
export interface MoveLike {
|
||||
export type MoveLike<FaveKey extends string> = {
|
||||
[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"
|
||||
|
||||
@@ -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 <contact@casraf.blog>",
|
||||
|
||||
Reference in New Issue
Block a user