5etools-utils 0.8.37 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (187) hide show
  1. package/README.md +1 -0
  2. package/bin/test-json-ua.js +5 -0
  3. package/lib/BrewTester.js +3 -3
  4. package/lib/TestJson.js +22 -7
  5. package/package.json +2 -1
  6. package/schema/brew/backgrounds.json +13 -13
  7. package/schema/brew/class/class.json +1 -1
  8. package/schema/brew/items-shared.json +1 -1
  9. package/schema/brew/races.json +1 -1
  10. package/schema/brew/spells/spells.json +61 -61
  11. package/schema/brew/util.json +47 -1
  12. package/schema/brew-fast/backgrounds.json +13 -13
  13. package/schema/brew-fast/class/class.json +1 -1
  14. package/schema/brew-fast/items-shared.json +1 -1
  15. package/schema/brew-fast/races.json +1 -1
  16. package/schema/brew-fast/spells/spells.json +61 -61
  17. package/schema/brew-fast/util.json +47 -1
  18. package/schema/site/backgrounds.json +1 -1
  19. package/schema/site/class/class.json +1 -1
  20. package/schema/site/items-shared.json +1 -1
  21. package/schema/site/races.json +1 -1
  22. package/schema/site/spells/spells.json +1 -1
  23. package/schema/site/util.json +48 -2
  24. package/schema/site-fast/backgrounds.json +1 -1
  25. package/schema/site-fast/class/class.json +1 -1
  26. package/schema/site-fast/items-shared.json +1 -1
  27. package/schema/site-fast/races.json +1 -1
  28. package/schema/site-fast/spells/spells.json +1 -1
  29. package/schema/site-fast/util.json +48 -2
  30. package/schema/ua/actions.json +97 -0
  31. package/schema/ua/adventure/adventure.json +12 -0
  32. package/schema/ua/adventures.json +214 -0
  33. package/schema/ua/backgrounds.json +326 -0
  34. package/schema/ua/bestiary/bestiary.json +3735 -0
  35. package/schema/ua/bestiary/fluff-bestiary.json +15 -0
  36. package/schema/ua/bestiary/fluff-index.json +11 -0
  37. package/schema/ua/bestiary/foundry.json +15 -0
  38. package/schema/ua/bestiary/index.json +11 -0
  39. package/schema/ua/bestiary/legendarygroups.json +202 -0
  40. package/schema/ua/bestiary/template.json +275 -0
  41. package/schema/ua/book/book.json +12 -0
  42. package/schema/ua/books.json +141 -0
  43. package/schema/ua/changelog.json +35 -0
  44. package/schema/ua/charcreationoptions.json +80 -0
  45. package/schema/ua/class/class.json +1881 -0
  46. package/schema/ua/class/foundry.json +397 -0
  47. package/schema/ua/class/index.json +11 -0
  48. package/schema/ua/conditionsdiseases.json +82 -0
  49. package/schema/ua/cultsboons.json +175 -0
  50. package/schema/ua/decks.json +504 -0
  51. package/schema/ua/deities.json +473 -0
  52. package/schema/ua/encounters.json +105 -0
  53. package/schema/ua/entry.json +3748 -0
  54. package/schema/ua/feats.json +117 -0
  55. package/schema/ua/fluff-backgrounds.json +15 -0
  56. package/schema/ua/fluff-charcreationoptions.json +43 -0
  57. package/schema/ua/fluff-conditionsdiseases.json +43 -0
  58. package/schema/ua/fluff-feats.json +15 -0
  59. package/schema/ua/fluff-items.json +15 -0
  60. package/schema/ua/fluff-languages.json +42 -0
  61. package/schema/ua/fluff-objects.json +15 -0
  62. package/schema/ua/fluff-races.json +214 -0
  63. package/schema/ua/fluff-recipes.json +42 -0
  64. package/schema/ua/fluff-vehicles.json +63 -0
  65. package/schema/ua/foundry-actions.json +15 -0
  66. package/schema/ua/foundry-backgrounds.json +53 -0
  67. package/schema/ua/foundry-feats.json +15 -0
  68. package/schema/ua/foundry-items.json +63 -0
  69. package/schema/ua/foundry-optionalfeatures.json +15 -0
  70. package/schema/ua/foundry-psionics.json +56 -0
  71. package/schema/ua/foundry-races.json +58 -0
  72. package/schema/ua/foundry-rewards.json +15 -0
  73. package/schema/ua/foundry-vehicles.json +15 -0
  74. package/schema/ua/generated/bookref-quick.json +72 -0
  75. package/schema/ua/generated/gendata-spell-source-lookup.json +230 -0
  76. package/schema/ua/homebrew.json +633 -0
  77. package/schema/ua/items-base.json +959 -0
  78. package/schema/ua/items-shared.json +267 -0
  79. package/schema/ua/items.json +1770 -0
  80. package/schema/ua/languages.json +123 -0
  81. package/schema/ua/life.json +17 -0
  82. package/schema/ua/loot.json +510 -0
  83. package/schema/ua/magicvariants.json +361 -0
  84. package/schema/ua/makebrew-creature.json +66 -0
  85. package/schema/ua/makecards.json +43 -0
  86. package/schema/ua/monsterfeatures.json +53 -0
  87. package/schema/ua/msbcr.json +60 -0
  88. package/schema/ua/names.json +94 -0
  89. package/schema/ua/objects.json +165 -0
  90. package/schema/ua/optionalfeatures.json +130 -0
  91. package/schema/ua/psionics.json +173 -0
  92. package/schema/ua/races.json +1668 -0
  93. package/schema/ua/recipes.json +185 -0
  94. package/schema/ua/renderdemo.json +16 -0
  95. package/schema/ua/rewards.json +93 -0
  96. package/schema/ua/senses.json +54 -0
  97. package/schema/ua/skills.json +54 -0
  98. package/schema/ua/spells/fluff-index.json +11 -0
  99. package/schema/ua/spells/fluff-spells.json +15 -0
  100. package/schema/ua/spells/foundry.json +15 -0
  101. package/schema/ua/spells/index.json +11 -0
  102. package/schema/ua/spells/roll20.json +112 -0
  103. package/schema/ua/spells/spells.json +1250 -0
  104. package/schema/ua/tables.json +220 -0
  105. package/schema/ua/trapshazards.json +236 -0
  106. package/schema/ua/util.json +4466 -0
  107. package/schema/ua/variantrules.json +74 -0
  108. package/schema/ua/vehicles.json +820 -0
  109. package/schema/ua-fast/actions.json +97 -0
  110. package/schema/ua-fast/adventure/adventure.json +12 -0
  111. package/schema/ua-fast/adventures.json +214 -0
  112. package/schema/ua-fast/backgrounds.json +326 -0
  113. package/schema/ua-fast/bestiary/bestiary.json +3735 -0
  114. package/schema/ua-fast/bestiary/fluff-bestiary.json +15 -0
  115. package/schema/ua-fast/bestiary/fluff-index.json +11 -0
  116. package/schema/ua-fast/bestiary/foundry.json +15 -0
  117. package/schema/ua-fast/bestiary/index.json +11 -0
  118. package/schema/ua-fast/bestiary/legendarygroups.json +202 -0
  119. package/schema/ua-fast/bestiary/template.json +275 -0
  120. package/schema/ua-fast/book/book.json +12 -0
  121. package/schema/ua-fast/books.json +141 -0
  122. package/schema/ua-fast/changelog.json +35 -0
  123. package/schema/ua-fast/charcreationoptions.json +80 -0
  124. package/schema/ua-fast/class/class.json +1881 -0
  125. package/schema/ua-fast/class/foundry.json +397 -0
  126. package/schema/ua-fast/class/index.json +11 -0
  127. package/schema/ua-fast/conditionsdiseases.json +82 -0
  128. package/schema/ua-fast/cultsboons.json +175 -0
  129. package/schema/ua-fast/decks.json +504 -0
  130. package/schema/ua-fast/deities.json +473 -0
  131. package/schema/ua-fast/encounters.json +105 -0
  132. package/schema/ua-fast/entry.json +3748 -0
  133. package/schema/ua-fast/feats.json +117 -0
  134. package/schema/ua-fast/fluff-backgrounds.json +15 -0
  135. package/schema/ua-fast/fluff-charcreationoptions.json +43 -0
  136. package/schema/ua-fast/fluff-conditionsdiseases.json +43 -0
  137. package/schema/ua-fast/fluff-feats.json +15 -0
  138. package/schema/ua-fast/fluff-items.json +15 -0
  139. package/schema/ua-fast/fluff-languages.json +42 -0
  140. package/schema/ua-fast/fluff-objects.json +15 -0
  141. package/schema/ua-fast/fluff-races.json +214 -0
  142. package/schema/ua-fast/fluff-recipes.json +42 -0
  143. package/schema/ua-fast/fluff-vehicles.json +63 -0
  144. package/schema/ua-fast/foundry-actions.json +15 -0
  145. package/schema/ua-fast/foundry-backgrounds.json +53 -0
  146. package/schema/ua-fast/foundry-feats.json +15 -0
  147. package/schema/ua-fast/foundry-items.json +63 -0
  148. package/schema/ua-fast/foundry-optionalfeatures.json +15 -0
  149. package/schema/ua-fast/foundry-psionics.json +56 -0
  150. package/schema/ua-fast/foundry-races.json +58 -0
  151. package/schema/ua-fast/foundry-rewards.json +15 -0
  152. package/schema/ua-fast/foundry-vehicles.json +15 -0
  153. package/schema/ua-fast/generated/bookref-quick.json +72 -0
  154. package/schema/ua-fast/generated/gendata-spell-source-lookup.json +230 -0
  155. package/schema/ua-fast/homebrew.json +631 -0
  156. package/schema/ua-fast/items-base.json +959 -0
  157. package/schema/ua-fast/items-shared.json +267 -0
  158. package/schema/ua-fast/items.json +1770 -0
  159. package/schema/ua-fast/languages.json +123 -0
  160. package/schema/ua-fast/life.json +17 -0
  161. package/schema/ua-fast/loot.json +510 -0
  162. package/schema/ua-fast/magicvariants.json +361 -0
  163. package/schema/ua-fast/makebrew-creature.json +66 -0
  164. package/schema/ua-fast/makecards.json +43 -0
  165. package/schema/ua-fast/monsterfeatures.json +53 -0
  166. package/schema/ua-fast/msbcr.json +60 -0
  167. package/schema/ua-fast/names.json +94 -0
  168. package/schema/ua-fast/objects.json +165 -0
  169. package/schema/ua-fast/optionalfeatures.json +130 -0
  170. package/schema/ua-fast/psionics.json +173 -0
  171. package/schema/ua-fast/races.json +1668 -0
  172. package/schema/ua-fast/recipes.json +185 -0
  173. package/schema/ua-fast/renderdemo.json +16 -0
  174. package/schema/ua-fast/rewards.json +93 -0
  175. package/schema/ua-fast/senses.json +54 -0
  176. package/schema/ua-fast/skills.json +54 -0
  177. package/schema/ua-fast/spells/fluff-index.json +11 -0
  178. package/schema/ua-fast/spells/fluff-spells.json +15 -0
  179. package/schema/ua-fast/spells/foundry.json +15 -0
  180. package/schema/ua-fast/spells/index.json +11 -0
  181. package/schema/ua-fast/spells/roll20.json +112 -0
  182. package/schema/ua-fast/spells/spells.json +1250 -0
  183. package/schema/ua-fast/tables.json +220 -0
  184. package/schema/ua-fast/trapshazards.json +236 -0
  185. package/schema/ua-fast/util.json +4466 -0
  186. package/schema/ua-fast/variantrules.json +74 -0
  187. package/schema/ua-fast/vehicles.json +820 -0
@@ -0,0 +1,1881 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "version": "2.11.5",
4
+ "$id": "class.json",
5
+ "type": "object",
6
+ "$defs": {
7
+ "_classTableGroupSubclass": {
8
+ "type": "array",
9
+ "items": {
10
+ "type": "object",
11
+ "properties": {
12
+ "name": {
13
+ "type": "string"
14
+ },
15
+ "source": {
16
+ "$ref": "../util.json#/$defs/source"
17
+ }
18
+ },
19
+ "required": [
20
+ "name",
21
+ "source"
22
+ ],
23
+ "additionalProperties": false
24
+ }
25
+ },
26
+ "classTableGroup": {
27
+ "oneOf": [
28
+ {
29
+ "type": "object",
30
+ "properties": {
31
+ "title": {
32
+ "type": "string"
33
+ },
34
+ "subclasses": {
35
+ "$ref": "#/$defs/_classTableGroupSubclass"
36
+ },
37
+ "colLabels": {
38
+ "type": "array",
39
+ "items": {
40
+ "type": "string"
41
+ }
42
+ },
43
+ "rows": {
44
+ "type": "array",
45
+ "items": {
46
+ "type": "array",
47
+ "items": {
48
+ "$ref": "../entry.json"
49
+ }
50
+ }
51
+ }
52
+ },
53
+ "required": [
54
+ "colLabels",
55
+ "rows"
56
+ ],
57
+ "additionalProperties": false
58
+ },
59
+ {
60
+ "type": "object",
61
+ "properties": {
62
+ "title": {
63
+ "type": "string"
64
+ },
65
+ "subclasses": {
66
+ "$ref": "#/$defs/_classTableGroupSubclass"
67
+ },
68
+ "colLabels": {
69
+ "type": "array",
70
+ "items": {
71
+ "type": "string"
72
+ }
73
+ },
74
+ "rowsSpellProgression": {
75
+ "description": "A count of spell points, starting with 1st-level spells at array index 0, to (n+1)th-level spells at array index n",
76
+ "type": "array",
77
+ "items": {
78
+ "type": "array",
79
+ "items": {
80
+ "type": "integer"
81
+ },
82
+ "minItems": 1,
83
+ "maxItems": 9
84
+ }
85
+ }
86
+ },
87
+ "required": [
88
+ "colLabels",
89
+ "rowsSpellProgression"
90
+ ],
91
+ "additionalProperties": false
92
+ }
93
+ ]
94
+ },
95
+ "classFeature": {
96
+ "type": "object",
97
+ "properties": {
98
+ "name": {
99
+ "type": "string"
100
+ },
101
+ "source": {
102
+ "$ref": "../util.json#/$defs/source"
103
+ },
104
+ "srd": {
105
+ "$ref": "../util.json#/$defs/srd"
106
+ },
107
+ "basicRules": {
108
+ "$ref": "../util.json#/$defs/basicRules"
109
+ },
110
+ "className": {
111
+ "type": "string"
112
+ },
113
+ "classSource": {
114
+ "$ref": "../util.json#/$defs/source"
115
+ },
116
+ "level": {
117
+ "type": "integer"
118
+ },
119
+ "header": {
120
+ "type": "integer"
121
+ },
122
+ "page": {
123
+ "$ref": "../util.json#/$defs/page"
124
+ },
125
+ "type": {
126
+ "type": "string",
127
+ "enum": [
128
+ "inset",
129
+ "item"
130
+ ]
131
+ },
132
+ "entries": {
133
+ "type": "array",
134
+ "items": {
135
+ "$ref": "../entry.json"
136
+ }
137
+ },
138
+ "isClassFeatureVariant": {
139
+ "type": "boolean"
140
+ },
141
+ "otherSources": {
142
+ "$ref": "../util.json#/$defs/otherSources"
143
+ },
144
+ "consumes": {
145
+ "$ref": "../util.json#/$defs/consumesObject"
146
+ }
147
+ },
148
+ "required": [
149
+ "name",
150
+ "source",
151
+ "className",
152
+ "classSource",
153
+ "level",
154
+ "entries"
155
+ ],
156
+ "additionalProperties": false
157
+ },
158
+ "subclassFeature": {
159
+ "type": "object",
160
+ "properties": {
161
+ "name": {
162
+ "type": "string"
163
+ },
164
+ "source": {
165
+ "$ref": "../util.json#/$defs/source"
166
+ },
167
+ "srd": {
168
+ "$ref": "../util.json#/$defs/srd"
169
+ },
170
+ "basicRules": {
171
+ "$ref": "../util.json#/$defs/basicRules"
172
+ },
173
+ "className": {
174
+ "type": "string"
175
+ },
176
+ "classSource": {
177
+ "$ref": "../util.json#/$defs/source"
178
+ },
179
+ "subclassShortName": {
180
+ "type": "string"
181
+ },
182
+ "subclassSource": {
183
+ "$ref": "../util.json#/$defs/source"
184
+ },
185
+ "level": {
186
+ "type": "integer"
187
+ },
188
+ "header": {
189
+ "type": "integer"
190
+ },
191
+ "page": {
192
+ "$ref": "../util.json#/$defs/page"
193
+ },
194
+ "type": {
195
+ "type": "string",
196
+ "enum": [
197
+ "inset",
198
+ "item"
199
+ ]
200
+ },
201
+ "entries": {
202
+ "type": "array",
203
+ "items": {
204
+ "$ref": "../entry.json"
205
+ }
206
+ },
207
+ "isClassFeatureVariant": {
208
+ "type": "boolean"
209
+ },
210
+ "isGainAtNextFeatureLevel": {
211
+ "description": "If this feature should only be (optionally) gained at the next \"gainSubclassFeature\" level, rather than at the level listed on the feature.",
212
+ "type": "boolean"
213
+ },
214
+ "otherSources": {
215
+ "$ref": "../util.json#/$defs/otherSources"
216
+ },
217
+ "consumes": {
218
+ "$ref": "../util.json#/$defs/consumesObject"
219
+ }
220
+ },
221
+ "required": [
222
+ "name",
223
+ "source",
224
+ "className",
225
+ "classSource",
226
+ "subclassShortName",
227
+ "subclassSource",
228
+ "level",
229
+ "entries"
230
+ ],
231
+ "additionalProperties": false
232
+ },
233
+ "proficiencies": {
234
+ "type": "object",
235
+ "properties": {
236
+ "armor": {
237
+ "type": "array",
238
+ "items": {
239
+ "oneOf": [
240
+ {
241
+ "type": "string",
242
+ "enum": [
243
+ "light",
244
+ "medium",
245
+ "heavy",
246
+ "{@item shield|phb|shields}"
247
+ ]
248
+ },
249
+ {
250
+ "type": "object",
251
+ "properties": {
252
+ "proficiency": {
253
+ "type": "string",
254
+ "enum": [
255
+ "light",
256
+ "medium",
257
+ "heavy",
258
+ "{@item shield|phb|shields}",
259
+ "special"
260
+ ]
261
+ },
262
+ "full": {
263
+ "description": "The complete text for this proficiency.",
264
+ "type": "string"
265
+ }
266
+ },
267
+ "required": [
268
+ "proficiency",
269
+ "full"
270
+ ]
271
+ }
272
+ ]
273
+ }
274
+ },
275
+ "weapons": {
276
+ "type": "array",
277
+ "items": {
278
+ "oneOf": [
279
+ {
280
+ "type": "string"
281
+ },
282
+ {
283
+ "type": "object",
284
+ "properties": {
285
+ "proficiency": {
286
+ "type": "string"
287
+ },
288
+ "optional": {
289
+ "type": "boolean"
290
+ }
291
+ },
292
+ "additionalProperties": false,
293
+ "required": [
294
+ "proficiency",
295
+ "optional"
296
+ ]
297
+ }
298
+ ]
299
+ }
300
+ },
301
+ "tools": {
302
+ "type": "array",
303
+ "items": {
304
+ "type": "string"
305
+ }
306
+ },
307
+ "toolProficiencies": {
308
+ "description": "Well-structured tool proficiency data, used by e.g. Plutonium.",
309
+ "$ref": "../util.json#/$defs/toolProficiencies"
310
+ },
311
+ "skills": {
312
+ "$ref": "../util.json#/$defs/skillProficiencies"
313
+ }
314
+ }
315
+ },
316
+ "subclass": {
317
+ "anyOf": [
318
+ {
319
+ "type": "object",
320
+ "properties": {
321
+ "name": {
322
+ "type": "string"
323
+ },
324
+ "shortName": {
325
+ "type": "string"
326
+ },
327
+ "source": {
328
+ "$ref": "../util.json#/$defs/source"
329
+ },
330
+ "className": {
331
+ "description": "The name of the class this subclass belongs to.",
332
+ "type": "string"
333
+ },
334
+ "classSource": {
335
+ "description": "The source of the class this subclass belongs to (defaults to PHB).",
336
+ "$ref": "../util.json#/$defs/source"
337
+ },
338
+ "isReprinted": {
339
+ "type": "boolean"
340
+ },
341
+ "srd": {
342
+ "$ref": "../util.json#/$defs/srd"
343
+ },
344
+ "basicRules": {
345
+ "$ref": "../util.json#/$defs/basicRules"
346
+ },
347
+ "page": {
348
+ "$ref": "../util.json#/$defs/page"
349
+ },
350
+ "casterProgression": {
351
+ "enum": [
352
+ "full",
353
+ "1/2",
354
+ "1/3",
355
+ "pact",
356
+ "artificer"
357
+ ]
358
+ },
359
+ "spellcastingAbility": {
360
+ "enum": [
361
+ "str",
362
+ "dex",
363
+ "con",
364
+ "int",
365
+ "wis",
366
+ "cha"
367
+ ]
368
+ },
369
+ "cantripProgression": {
370
+ "type": "array",
371
+ "items": {
372
+ "type": "integer"
373
+ },
374
+ "minItems": 20,
375
+ "maxItems": 20
376
+ },
377
+ "spellsKnownProgression": {
378
+ "type": "array",
379
+ "items": {
380
+ "type": "integer"
381
+ },
382
+ "minItems": 20,
383
+ "maxItems": 20
384
+ },
385
+ "subclassFeatures": {
386
+ "type": "array",
387
+ "description": "Format: \" name | className | classSource | subclassShortName | subclassSource | level | source\"\nPHB is assumed for sources.\nfeatureSource is assumed to be the same as subclassSource.",
388
+ "items": {
389
+ "oneOf": [
390
+ {
391
+ "type": "string"
392
+ },
393
+ {
394
+ "type": "object",
395
+ "properties": {
396
+ "subclassFeature": {
397
+ "type": "string"
398
+ },
399
+ "gainSubclassFeature": {
400
+ "type": "boolean"
401
+ },
402
+ "gainSubclassFeatureHasContent": {
403
+ "description": "Features with \"gainSubclassFeature\" are generally ignored by e.g. VTT integrations, as having no meaningful content to import to sheets. Setting this flag informs the integration that this feature should not be ignored.",
404
+ "type": "boolean"
405
+ },
406
+ "tableDisplayName": {
407
+ "type": "string"
408
+ }
409
+ },
410
+ "required": [
411
+ "subclassFeature"
412
+ ]
413
+ }
414
+ ]
415
+ }
416
+ },
417
+ "optionalfeatureProgression": {
418
+ "$ref": "../util.json#/$defs/optionalfeatureProgression"
419
+ },
420
+ "subclassTableGroups": {
421
+ "type": "array",
422
+ "items": {
423
+ "$ref": "#/$defs/classTableGroup"
424
+ }
425
+ },
426
+ "otherSources": {
427
+ "$ref": "../util.json#/$defs/otherSources"
428
+ },
429
+ "additionalSpells": {
430
+ "$ref": "../util.json#/$defs/additionalSpellsArray"
431
+ },
432
+ "subclassSpells": {
433
+ "description": "Homebrew use only; adds custom subclasses to lists in spells.\nDoes not enable VTT import - see \"additionalSpells\".",
434
+ "type": "array",
435
+ "minItems": 1,
436
+ "uniqueItems": true,
437
+ "items": {
438
+ "$ref": "../util.json#/$defs/spellListSpellRef"
439
+ }
440
+ },
441
+ "subSubclassSpells": {
442
+ "description": "Homebrew use only; adds custom sub-subclasses to lists in spells.\nPrimarily used by cleric orders and druid circles.\nDoes not enable VTT import - use \"additionalSpells\" as well.",
443
+ "type": "object",
444
+ "patternProperties": {
445
+ ".*": {
446
+ "type": "array",
447
+ "description": "For example, a druid circle, religious order, or other sub-subclass name",
448
+ "minItems": 1,
449
+ "uniqueItems": true,
450
+ "items": {
451
+ "$ref": "../util.json#/$defs/spellListSpellRef"
452
+ }
453
+ }
454
+ }
455
+ }
456
+ },
457
+ "additionalProperties": false,
458
+ "required": [
459
+ "name",
460
+ "shortName",
461
+ "source",
462
+ "className",
463
+ "classSource",
464
+ "subclassFeatures"
465
+ ]
466
+ },
467
+ {
468
+ "type": "object",
469
+ "properties": {
470
+ "name": {
471
+ "type": "string"
472
+ },
473
+ "shortName": {
474
+ "type": "string"
475
+ },
476
+ "source": {
477
+ "$ref": "../util.json#/$defs/source"
478
+ },
479
+ "className": {
480
+ "description": "The name of the class this subclass belongs to.",
481
+ "type": "string"
482
+ },
483
+ "classSource": {
484
+ "description": "The source of the class this subclass belongs to (defaults to PHB).",
485
+ "$ref": "../util.json#/$defs/source"
486
+ },
487
+ "isReprinted": {
488
+ "type": "boolean"
489
+ },
490
+ "srd": {
491
+ "$ref": "../util.json#/$defs/srd"
492
+ },
493
+ "basicRules": {
494
+ "$ref": "../util.json#/$defs/basicRules"
495
+ },
496
+ "page": {
497
+ "$ref": "../util.json#/$defs/page"
498
+ },
499
+ "casterProgression": {
500
+ "enum": [
501
+ "full",
502
+ "1/2",
503
+ "1/3",
504
+ "pact",
505
+ "artificer"
506
+ ]
507
+ },
508
+ "spellcastingAbility": {
509
+ "enum": [
510
+ "str",
511
+ "dex",
512
+ "con",
513
+ "int",
514
+ "wis",
515
+ "cha"
516
+ ]
517
+ },
518
+ "cantripProgression": {
519
+ "type": "array",
520
+ "items": {
521
+ "type": "integer"
522
+ },
523
+ "minItems": 20,
524
+ "maxItems": 20
525
+ },
526
+ "spellsKnownProgression": {
527
+ "type": "array",
528
+ "items": {
529
+ "type": "integer"
530
+ },
531
+ "minItems": 20,
532
+ "maxItems": 20
533
+ },
534
+ "subclassFeatures": {
535
+ "type": "array",
536
+ "description": "Format: \" name | className | classSource | subclassShortName | subclassSource | level | source\"\nPHB is assumed for sources.\nfeatureSource is assumed to be the same as subclassSource.",
537
+ "items": {
538
+ "oneOf": [
539
+ {
540
+ "type": "string"
541
+ },
542
+ {
543
+ "type": "object",
544
+ "properties": {
545
+ "subclassFeature": {
546
+ "type": "string"
547
+ },
548
+ "gainSubclassFeature": {
549
+ "type": "boolean"
550
+ },
551
+ "gainSubclassFeatureHasContent": {
552
+ "description": "Features with \"gainSubclassFeature\" are generally ignored by e.g. VTT integrations, as having no meaningful content to import to sheets. Setting this flag informs the integration that this feature should not be ignored.",
553
+ "type": "boolean"
554
+ },
555
+ "tableDisplayName": {
556
+ "type": "string"
557
+ }
558
+ },
559
+ "required": [
560
+ "subclassFeature"
561
+ ]
562
+ }
563
+ ]
564
+ }
565
+ },
566
+ "optionalfeatureProgression": {
567
+ "$ref": "../util.json#/$defs/optionalfeatureProgression"
568
+ },
569
+ "subclassTableGroups": {
570
+ "type": "array",
571
+ "items": {
572
+ "$ref": "#/$defs/classTableGroup"
573
+ }
574
+ },
575
+ "otherSources": {
576
+ "$ref": "../util.json#/$defs/otherSources"
577
+ },
578
+ "additionalSpells": {
579
+ "$ref": "../util.json#/$defs/additionalSpellsArray"
580
+ },
581
+ "subclassSpells": {
582
+ "description": "Homebrew use only; adds custom subclasses to lists in spells.\nDoes not enable VTT import - see \"additionalSpells\".",
583
+ "type": "array",
584
+ "minItems": 1,
585
+ "uniqueItems": true,
586
+ "items": {
587
+ "$ref": "../util.json#/$defs/spellListSpellRef"
588
+ }
589
+ },
590
+ "subSubclassSpells": {
591
+ "description": "Homebrew use only; adds custom sub-subclasses to lists in spells.\nPrimarily used by cleric orders and druid circles.\nDoes not enable VTT import - use \"additionalSpells\" as well.",
592
+ "type": "object",
593
+ "patternProperties": {
594
+ ".*": {
595
+ "type": "array",
596
+ "description": "For example, a druid circle, religious order, or other sub-subclass name",
597
+ "minItems": 1,
598
+ "uniqueItems": true,
599
+ "items": {
600
+ "$ref": "../util.json#/$defs/spellListSpellRef"
601
+ }
602
+ }
603
+ }
604
+ },
605
+ "_copy": {
606
+ "type": "object",
607
+ "properties": {
608
+ "name": {
609
+ "type": "string"
610
+ },
611
+ "source": {
612
+ "$ref": "../util.json#/$defs/source"
613
+ },
614
+ "pantheon": {
615
+ "description": "Used in deity data",
616
+ "type": "string"
617
+ },
618
+ "shortName": {
619
+ "description": "Used in subclass data",
620
+ "type": "string"
621
+ },
622
+ "className": {
623
+ "description": "Used in subclass data",
624
+ "type": "string"
625
+ },
626
+ "classSource": {
627
+ "description": "Used in subclass data",
628
+ "$ref": "../util.json#/$defs/source"
629
+ },
630
+ "_mod": {
631
+ "$ref": "../util.json#/$defs/_modObject"
632
+ },
633
+ "_trait": {
634
+ "type": "object",
635
+ "properties": {
636
+ "name": {
637
+ "type": "string"
638
+ },
639
+ "source": {
640
+ "$ref": "../util.json#/$defs/source"
641
+ }
642
+ },
643
+ "required": [
644
+ "name",
645
+ "source"
646
+ ]
647
+ },
648
+ "_preserve": {
649
+ "type": "object",
650
+ "patternProperties": {
651
+ ".*": {
652
+ "const": true
653
+ }
654
+ }
655
+ }
656
+ },
657
+ "required": [
658
+ "name",
659
+ "source"
660
+ ],
661
+ "additionalProperties": false
662
+ }
663
+ },
664
+ "additionalProperties": false,
665
+ "required": [
666
+ "_copy"
667
+ ]
668
+ }
669
+ ]
670
+ },
671
+ "subclassData": {
672
+ "type": "object",
673
+ "properties": {
674
+ "name": {
675
+ "type": "string"
676
+ },
677
+ "shortName": {
678
+ "type": "string"
679
+ },
680
+ "source": {
681
+ "$ref": "../util.json#/$defs/source"
682
+ },
683
+ "className": {
684
+ "description": "The name of the class this subclass belongs to.",
685
+ "type": "string"
686
+ },
687
+ "classSource": {
688
+ "description": "The source of the class this subclass belongs to (defaults to PHB).",
689
+ "$ref": "../util.json#/$defs/source"
690
+ },
691
+ "isReprinted": {
692
+ "type": "boolean"
693
+ },
694
+ "srd": {
695
+ "$ref": "../util.json#/$defs/srd"
696
+ },
697
+ "basicRules": {
698
+ "$ref": "../util.json#/$defs/basicRules"
699
+ },
700
+ "page": {
701
+ "$ref": "../util.json#/$defs/page"
702
+ },
703
+ "casterProgression": {
704
+ "enum": [
705
+ "full",
706
+ "1/2",
707
+ "1/3",
708
+ "pact",
709
+ "artificer"
710
+ ]
711
+ },
712
+ "spellcastingAbility": {
713
+ "enum": [
714
+ "str",
715
+ "dex",
716
+ "con",
717
+ "int",
718
+ "wis",
719
+ "cha"
720
+ ]
721
+ },
722
+ "cantripProgression": {
723
+ "type": "array",
724
+ "items": {
725
+ "type": "integer"
726
+ },
727
+ "minItems": 20,
728
+ "maxItems": 20
729
+ },
730
+ "spellsKnownProgression": {
731
+ "type": "array",
732
+ "items": {
733
+ "type": "integer"
734
+ },
735
+ "minItems": 20,
736
+ "maxItems": 20
737
+ },
738
+ "subclassFeatures": {
739
+ "type": "array",
740
+ "description": "Format: \" name | className | classSource | subclassShortName | subclassSource | level | source\"\nPHB is assumed for sources.\nfeatureSource is assumed to be the same as subclassSource.",
741
+ "items": {
742
+ "oneOf": [
743
+ {
744
+ "type": "string"
745
+ },
746
+ {
747
+ "type": "object",
748
+ "properties": {
749
+ "subclassFeature": {
750
+ "type": "string"
751
+ },
752
+ "gainSubclassFeature": {
753
+ "type": "boolean"
754
+ },
755
+ "gainSubclassFeatureHasContent": {
756
+ "description": "Features with \"gainSubclassFeature\" are generally ignored by e.g. VTT integrations, as having no meaningful content to import to sheets. Setting this flag informs the integration that this feature should not be ignored.",
757
+ "type": "boolean"
758
+ },
759
+ "tableDisplayName": {
760
+ "type": "string"
761
+ }
762
+ },
763
+ "required": [
764
+ "subclassFeature"
765
+ ]
766
+ }
767
+ ]
768
+ }
769
+ },
770
+ "optionalfeatureProgression": {
771
+ "$ref": "../util.json#/$defs/optionalfeatureProgression"
772
+ },
773
+ "subclassTableGroups": {
774
+ "type": "array",
775
+ "items": {
776
+ "$ref": "#/$defs/classTableGroup"
777
+ }
778
+ },
779
+ "otherSources": {
780
+ "$ref": "../util.json#/$defs/otherSources"
781
+ },
782
+ "additionalSpells": {
783
+ "$ref": "../util.json#/$defs/additionalSpellsArray"
784
+ },
785
+ "subclassSpells": {
786
+ "description": "Homebrew use only; adds custom subclasses to lists in spells.\nDoes not enable VTT import - see \"additionalSpells\".",
787
+ "type": "array",
788
+ "minItems": 1,
789
+ "uniqueItems": true,
790
+ "items": {
791
+ "$ref": "../util.json#/$defs/spellListSpellRef"
792
+ }
793
+ },
794
+ "subSubclassSpells": {
795
+ "description": "Homebrew use only; adds custom sub-subclasses to lists in spells.\nPrimarily used by cleric orders and druid circles.\nDoes not enable VTT import - use \"additionalSpells\" as well.",
796
+ "type": "object",
797
+ "patternProperties": {
798
+ ".*": {
799
+ "type": "array",
800
+ "description": "For example, a druid circle, religious order, or other sub-subclass name",
801
+ "minItems": 1,
802
+ "uniqueItems": true,
803
+ "items": {
804
+ "$ref": "../util.json#/$defs/spellListSpellRef"
805
+ }
806
+ }
807
+ }
808
+ }
809
+ },
810
+ "additionalProperties": false
811
+ },
812
+ "requirements": {
813
+ "type": "object",
814
+ "properties": {
815
+ "str": {
816
+ "type": "integer"
817
+ },
818
+ "dex": {
819
+ "type": "integer"
820
+ },
821
+ "con": {
822
+ "type": "integer"
823
+ },
824
+ "int": {
825
+ "type": "integer"
826
+ },
827
+ "wis": {
828
+ "type": "integer"
829
+ },
830
+ "cha": {
831
+ "type": "integer"
832
+ },
833
+ "or": {
834
+ "type": "array",
835
+ "items": {
836
+ "type": "object",
837
+ "properties": {
838
+ "str": {
839
+ "type": "integer"
840
+ },
841
+ "dex": {
842
+ "type": "integer"
843
+ },
844
+ "con": {
845
+ "type": "integer"
846
+ },
847
+ "int": {
848
+ "type": "integer"
849
+ },
850
+ "wis": {
851
+ "type": "integer"
852
+ },
853
+ "cha": {
854
+ "type": "integer"
855
+ }
856
+ },
857
+ "additionalProperties": false
858
+ }
859
+ },
860
+ "entries": {
861
+ "type": "array",
862
+ "items": {
863
+ "$ref": "../entry.json"
864
+ }
865
+ }
866
+ },
867
+ "additionalProperties": false
868
+ },
869
+ "class": {
870
+ "anyOf": [
871
+ {
872
+ "type": "object",
873
+ "description": "A character class",
874
+ "properties": {
875
+ "name": {
876
+ "type": "string"
877
+ },
878
+ "source": {
879
+ "$ref": "../util.json#/$defs/source"
880
+ },
881
+ "otherSources": {
882
+ "$ref": "../util.json#/$defs/otherSources"
883
+ },
884
+ "srd": {
885
+ "$ref": "../util.json#/$defs/srd"
886
+ },
887
+ "basicRules": {
888
+ "$ref": "../util.json#/$defs/basicRules"
889
+ },
890
+ "isReprinted": {
891
+ "type": "boolean"
892
+ },
893
+ "classGroup": {
894
+ "type": "array",
895
+ "items": {
896
+ "type": "string",
897
+ "enum": [
898
+ "expert",
899
+ "mage",
900
+ "priest",
901
+ "warrior"
902
+ ]
903
+ }
904
+ },
905
+ "isSidekick": {
906
+ "type": "boolean"
907
+ },
908
+ "hd": {
909
+ "type": "object",
910
+ "properties": {
911
+ "number": {
912
+ "type": "integer"
913
+ },
914
+ "faces": {
915
+ "type": "integer"
916
+ }
917
+ },
918
+ "required": [
919
+ "number",
920
+ "faces"
921
+ ],
922
+ "additionalProperties": false
923
+ },
924
+ "proficiency": {
925
+ "type": "array",
926
+ "items": {
927
+ "type": "string",
928
+ "enum": [
929
+ "str",
930
+ "dex",
931
+ "con",
932
+ "int",
933
+ "wis",
934
+ "cha"
935
+ ]
936
+ }
937
+ },
938
+ "classTableGroups": {
939
+ "type": "array",
940
+ "items": {
941
+ "$ref": "#/$defs/classTableGroup"
942
+ }
943
+ },
944
+ "startingProficiencies": {
945
+ "$ref": "#/$defs/proficiencies"
946
+ },
947
+ "startingEquipment": {
948
+ "type": "object",
949
+ "properties": {
950
+ "additionalFromBackground": {
951
+ "type": "boolean"
952
+ },
953
+ "default": {
954
+ "type": "array",
955
+ "items": {
956
+ "type": "string"
957
+ }
958
+ },
959
+ "defaultData": {
960
+ "$ref": "../util.json#/$defs/startingEquipment"
961
+ },
962
+ "goldAlternative": {
963
+ "type": "string"
964
+ }
965
+ },
966
+ "required": [
967
+ "additionalFromBackground",
968
+ "default"
969
+ ],
970
+ "additionalProperties": false
971
+ },
972
+ "requirements": {
973
+ "$ref": "#/$defs/requirements"
974
+ },
975
+ "multiclassing": {
976
+ "type": "object",
977
+ "properties": {
978
+ "requirements": {
979
+ "$ref": "#/$defs/requirements"
980
+ },
981
+ "proficienciesGained": {
982
+ "$ref": "#/$defs/proficiencies"
983
+ },
984
+ "entries": {
985
+ "type": "array",
986
+ "items": {
987
+ "$ref": "../entry.json"
988
+ }
989
+ }
990
+ },
991
+ "additionalProperties": false
992
+ },
993
+ "casterProgression": {
994
+ "enum": [
995
+ "full",
996
+ "1/2",
997
+ "1/3",
998
+ "pact",
999
+ "artificer"
1000
+ ]
1001
+ },
1002
+ "preparedSpells": {
1003
+ "type": "string",
1004
+ "description": "Formula for the number of spells the class can prepare, for example:\n\"<$level$> / 2 + <$int_mod$>\""
1005
+ },
1006
+ "preparedSpellsProgression": {
1007
+ "type": "array",
1008
+ "items": {
1009
+ "type": "integer"
1010
+ },
1011
+ "minItems": 20,
1012
+ "maxItems": 20
1013
+ },
1014
+ "spellcastingAbility": {
1015
+ "enum": [
1016
+ "str",
1017
+ "dex",
1018
+ "con",
1019
+ "int",
1020
+ "wis",
1021
+ "cha"
1022
+ ]
1023
+ },
1024
+ "cantripProgression": {
1025
+ "type": "array",
1026
+ "items": {
1027
+ "type": "integer"
1028
+ },
1029
+ "minItems": 20,
1030
+ "maxItems": 20
1031
+ },
1032
+ "spellsKnownProgression": {
1033
+ "type": "array",
1034
+ "items": {
1035
+ "type": "integer"
1036
+ },
1037
+ "minItems": 20,
1038
+ "maxItems": 20
1039
+ },
1040
+ "spellsKnownProgressionFixed": {
1041
+ "description": "For e.g. Wizard, where the spells taken at each level must be <= the max spellcasting level, and cannot be swapped out afterward.",
1042
+ "type": "array",
1043
+ "items": {
1044
+ "type": "integer"
1045
+ },
1046
+ "minItems": 20,
1047
+ "maxItems": 20
1048
+ },
1049
+ "spellsKnownProgressionFixedAllowLowerLevel": {
1050
+ "type": "boolean"
1051
+ },
1052
+ "spellsKnownProgressionFixedByLevel": {
1053
+ "description": "For e.g. Warlock Mystic Arcanum. A map of <class level> -> <spell level> -> <number of spells known>",
1054
+ "type": "object",
1055
+ "patternProperties": {
1056
+ "^\\d+$": {
1057
+ "type": "object",
1058
+ "properties": {
1059
+ "1": {
1060
+ "type": "integer"
1061
+ },
1062
+ "2": {
1063
+ "type": "integer"
1064
+ },
1065
+ "3": {
1066
+ "type": "integer"
1067
+ },
1068
+ "4": {
1069
+ "type": "integer"
1070
+ },
1071
+ "5": {
1072
+ "type": "integer"
1073
+ },
1074
+ "6": {
1075
+ "type": "integer"
1076
+ },
1077
+ "7": {
1078
+ "type": "integer"
1079
+ },
1080
+ "8": {
1081
+ "type": "integer"
1082
+ },
1083
+ "9": {
1084
+ "type": "integer"
1085
+ }
1086
+ },
1087
+ "additionalProperties": false
1088
+ }
1089
+ },
1090
+ "additionalProperties": false
1091
+ },
1092
+ "optionalfeatureProgression": {
1093
+ "$ref": "../util.json#/$defs/optionalfeatureProgression"
1094
+ },
1095
+ "classFeatures": {
1096
+ "type": "array",
1097
+ "description": "Format: \" name | className | classSource | level | source \" , PHB is assumed as classSource and featureSource is assumed to be the same as classSource.",
1098
+ "items": {
1099
+ "oneOf": [
1100
+ {
1101
+ "type": "string"
1102
+ },
1103
+ {
1104
+ "type": "object",
1105
+ "properties": {
1106
+ "classFeature": {
1107
+ "type": "string"
1108
+ },
1109
+ "gainSubclassFeature": {
1110
+ "type": "boolean"
1111
+ }
1112
+ },
1113
+ "required": [
1114
+ "classFeature"
1115
+ ]
1116
+ }
1117
+ ]
1118
+ }
1119
+ },
1120
+ "subclassTitle": {
1121
+ "type": "string"
1122
+ },
1123
+ "page": {
1124
+ "$ref": "../util.json#/$defs/page"
1125
+ },
1126
+ "fluff": {
1127
+ "type": "array",
1128
+ "items": {
1129
+ "type": "object",
1130
+ "properties": {
1131
+ "name": {
1132
+ "type": "string"
1133
+ },
1134
+ "entries": {
1135
+ "type": "array",
1136
+ "items": {
1137
+ "$ref": "../entry.json"
1138
+ }
1139
+ },
1140
+ "page": {
1141
+ "$ref": "../util.json#/$defs/page"
1142
+ },
1143
+ "source": {
1144
+ "$ref": "../util.json#/$defs/source"
1145
+ },
1146
+ "type": {
1147
+ "type": "string"
1148
+ }
1149
+ },
1150
+ "required": [
1151
+ "entries",
1152
+ "source"
1153
+ ],
1154
+ "additionalProperties": false
1155
+ }
1156
+ },
1157
+ "additionalSpells": {
1158
+ "$ref": "../util.json#/$defs/additionalSpellsArray"
1159
+ },
1160
+ "classSpells": {
1161
+ "description": "Homebrew use only",
1162
+ "type": "array",
1163
+ "minItems": 1,
1164
+ "uniqueItems": true,
1165
+ "items": {
1166
+ "$ref": "../util.json#/$defs/spellListSpellRef"
1167
+ }
1168
+ }
1169
+ },
1170
+ "additionalProperties": false,
1171
+ "required": [
1172
+ "name",
1173
+ "source",
1174
+ "classFeatures"
1175
+ ]
1176
+ },
1177
+ {
1178
+ "type": "object",
1179
+ "description": "A character class",
1180
+ "properties": {
1181
+ "name": {
1182
+ "type": "string"
1183
+ },
1184
+ "source": {
1185
+ "$ref": "../util.json#/$defs/source"
1186
+ },
1187
+ "otherSources": {
1188
+ "$ref": "../util.json#/$defs/otherSources"
1189
+ },
1190
+ "srd": {
1191
+ "$ref": "../util.json#/$defs/srd"
1192
+ },
1193
+ "basicRules": {
1194
+ "$ref": "../util.json#/$defs/basicRules"
1195
+ },
1196
+ "isReprinted": {
1197
+ "type": "boolean"
1198
+ },
1199
+ "classGroup": {
1200
+ "type": "array",
1201
+ "items": {
1202
+ "type": "string",
1203
+ "enum": [
1204
+ "expert",
1205
+ "mage",
1206
+ "priest",
1207
+ "warrior"
1208
+ ]
1209
+ }
1210
+ },
1211
+ "isSidekick": {
1212
+ "type": "boolean"
1213
+ },
1214
+ "hd": {
1215
+ "type": "object",
1216
+ "properties": {
1217
+ "number": {
1218
+ "type": "integer"
1219
+ },
1220
+ "faces": {
1221
+ "type": "integer"
1222
+ }
1223
+ },
1224
+ "required": [
1225
+ "number",
1226
+ "faces"
1227
+ ],
1228
+ "additionalProperties": false
1229
+ },
1230
+ "proficiency": {
1231
+ "type": "array",
1232
+ "items": {
1233
+ "type": "string",
1234
+ "enum": [
1235
+ "str",
1236
+ "dex",
1237
+ "con",
1238
+ "int",
1239
+ "wis",
1240
+ "cha"
1241
+ ]
1242
+ }
1243
+ },
1244
+ "classTableGroups": {
1245
+ "type": "array",
1246
+ "items": {
1247
+ "$ref": "#/$defs/classTableGroup"
1248
+ }
1249
+ },
1250
+ "startingProficiencies": {
1251
+ "$ref": "#/$defs/proficiencies"
1252
+ },
1253
+ "startingEquipment": {
1254
+ "type": "object",
1255
+ "properties": {
1256
+ "additionalFromBackground": {
1257
+ "type": "boolean"
1258
+ },
1259
+ "default": {
1260
+ "type": "array",
1261
+ "items": {
1262
+ "type": "string"
1263
+ }
1264
+ },
1265
+ "defaultData": {
1266
+ "$ref": "../util.json#/$defs/startingEquipment"
1267
+ },
1268
+ "goldAlternative": {
1269
+ "type": "string"
1270
+ }
1271
+ },
1272
+ "required": [
1273
+ "additionalFromBackground",
1274
+ "default"
1275
+ ],
1276
+ "additionalProperties": false
1277
+ },
1278
+ "requirements": {
1279
+ "$ref": "#/$defs/requirements"
1280
+ },
1281
+ "multiclassing": {
1282
+ "type": "object",
1283
+ "properties": {
1284
+ "requirements": {
1285
+ "$ref": "#/$defs/requirements"
1286
+ },
1287
+ "proficienciesGained": {
1288
+ "$ref": "#/$defs/proficiencies"
1289
+ },
1290
+ "entries": {
1291
+ "type": "array",
1292
+ "items": {
1293
+ "$ref": "../entry.json"
1294
+ }
1295
+ }
1296
+ },
1297
+ "additionalProperties": false
1298
+ },
1299
+ "casterProgression": {
1300
+ "enum": [
1301
+ "full",
1302
+ "1/2",
1303
+ "1/3",
1304
+ "pact",
1305
+ "artificer"
1306
+ ]
1307
+ },
1308
+ "preparedSpells": {
1309
+ "type": "string",
1310
+ "description": "Formula for the number of spells the class can prepare, for example:\n\"<$level$> / 2 + <$int_mod$>\""
1311
+ },
1312
+ "preparedSpellsProgression": {
1313
+ "type": "array",
1314
+ "items": {
1315
+ "type": "integer"
1316
+ },
1317
+ "minItems": 20,
1318
+ "maxItems": 20
1319
+ },
1320
+ "spellcastingAbility": {
1321
+ "enum": [
1322
+ "str",
1323
+ "dex",
1324
+ "con",
1325
+ "int",
1326
+ "wis",
1327
+ "cha"
1328
+ ]
1329
+ },
1330
+ "cantripProgression": {
1331
+ "type": "array",
1332
+ "items": {
1333
+ "type": "integer"
1334
+ },
1335
+ "minItems": 20,
1336
+ "maxItems": 20
1337
+ },
1338
+ "spellsKnownProgression": {
1339
+ "type": "array",
1340
+ "items": {
1341
+ "type": "integer"
1342
+ },
1343
+ "minItems": 20,
1344
+ "maxItems": 20
1345
+ },
1346
+ "spellsKnownProgressionFixed": {
1347
+ "description": "For e.g. Wizard, where the spells taken at each level must be <= the max spellcasting level, and cannot be swapped out afterward.",
1348
+ "type": "array",
1349
+ "items": {
1350
+ "type": "integer"
1351
+ },
1352
+ "minItems": 20,
1353
+ "maxItems": 20
1354
+ },
1355
+ "spellsKnownProgressionFixedAllowLowerLevel": {
1356
+ "type": "boolean"
1357
+ },
1358
+ "spellsKnownProgressionFixedByLevel": {
1359
+ "description": "For e.g. Warlock Mystic Arcanum. A map of <class level> -> <spell level> -> <number of spells known>",
1360
+ "type": "object",
1361
+ "patternProperties": {
1362
+ "^\\d+$": {
1363
+ "type": "object",
1364
+ "properties": {
1365
+ "1": {
1366
+ "type": "integer"
1367
+ },
1368
+ "2": {
1369
+ "type": "integer"
1370
+ },
1371
+ "3": {
1372
+ "type": "integer"
1373
+ },
1374
+ "4": {
1375
+ "type": "integer"
1376
+ },
1377
+ "5": {
1378
+ "type": "integer"
1379
+ },
1380
+ "6": {
1381
+ "type": "integer"
1382
+ },
1383
+ "7": {
1384
+ "type": "integer"
1385
+ },
1386
+ "8": {
1387
+ "type": "integer"
1388
+ },
1389
+ "9": {
1390
+ "type": "integer"
1391
+ }
1392
+ },
1393
+ "additionalProperties": false
1394
+ }
1395
+ },
1396
+ "additionalProperties": false
1397
+ },
1398
+ "optionalfeatureProgression": {
1399
+ "$ref": "../util.json#/$defs/optionalfeatureProgression"
1400
+ },
1401
+ "classFeatures": {
1402
+ "type": "array",
1403
+ "description": "Format: \" name | className | classSource | level | source \" , PHB is assumed as classSource and featureSource is assumed to be the same as classSource.",
1404
+ "items": {
1405
+ "oneOf": [
1406
+ {
1407
+ "type": "string"
1408
+ },
1409
+ {
1410
+ "type": "object",
1411
+ "properties": {
1412
+ "classFeature": {
1413
+ "type": "string"
1414
+ },
1415
+ "gainSubclassFeature": {
1416
+ "type": "boolean"
1417
+ }
1418
+ },
1419
+ "required": [
1420
+ "classFeature"
1421
+ ]
1422
+ }
1423
+ ]
1424
+ }
1425
+ },
1426
+ "subclassTitle": {
1427
+ "type": "string"
1428
+ },
1429
+ "page": {
1430
+ "$ref": "../util.json#/$defs/page"
1431
+ },
1432
+ "fluff": {
1433
+ "type": "array",
1434
+ "items": {
1435
+ "type": "object",
1436
+ "properties": {
1437
+ "name": {
1438
+ "type": "string"
1439
+ },
1440
+ "entries": {
1441
+ "type": "array",
1442
+ "items": {
1443
+ "$ref": "../entry.json"
1444
+ }
1445
+ },
1446
+ "page": {
1447
+ "$ref": "../util.json#/$defs/page"
1448
+ },
1449
+ "source": {
1450
+ "$ref": "../util.json#/$defs/source"
1451
+ },
1452
+ "type": {
1453
+ "type": "string"
1454
+ }
1455
+ },
1456
+ "required": [
1457
+ "entries",
1458
+ "source"
1459
+ ],
1460
+ "additionalProperties": false
1461
+ }
1462
+ },
1463
+ "additionalSpells": {
1464
+ "$ref": "../util.json#/$defs/additionalSpellsArray"
1465
+ },
1466
+ "classSpells": {
1467
+ "description": "Homebrew use only",
1468
+ "type": "array",
1469
+ "minItems": 1,
1470
+ "uniqueItems": true,
1471
+ "items": {
1472
+ "$ref": "../util.json#/$defs/spellListSpellRef"
1473
+ }
1474
+ },
1475
+ "_copy": {
1476
+ "type": "object",
1477
+ "properties": {
1478
+ "name": {
1479
+ "type": "string"
1480
+ },
1481
+ "source": {
1482
+ "$ref": "../util.json#/$defs/source"
1483
+ },
1484
+ "pantheon": {
1485
+ "description": "Used in deity data",
1486
+ "type": "string"
1487
+ },
1488
+ "shortName": {
1489
+ "description": "Used in subclass data",
1490
+ "type": "string"
1491
+ },
1492
+ "className": {
1493
+ "description": "Used in subclass data",
1494
+ "type": "string"
1495
+ },
1496
+ "classSource": {
1497
+ "description": "Used in subclass data",
1498
+ "$ref": "../util.json#/$defs/source"
1499
+ },
1500
+ "_mod": {
1501
+ "$ref": "../util.json#/$defs/_modObject"
1502
+ },
1503
+ "_trait": {
1504
+ "type": "object",
1505
+ "properties": {
1506
+ "name": {
1507
+ "type": "string"
1508
+ },
1509
+ "source": {
1510
+ "$ref": "../util.json#/$defs/source"
1511
+ }
1512
+ },
1513
+ "required": [
1514
+ "name",
1515
+ "source"
1516
+ ]
1517
+ },
1518
+ "_preserve": {
1519
+ "type": "object",
1520
+ "patternProperties": {
1521
+ ".*": {
1522
+ "const": true
1523
+ }
1524
+ }
1525
+ }
1526
+ },
1527
+ "required": [
1528
+ "name",
1529
+ "source"
1530
+ ],
1531
+ "additionalProperties": false
1532
+ }
1533
+ },
1534
+ "additionalProperties": false,
1535
+ "required": [
1536
+ "_copy"
1537
+ ]
1538
+ }
1539
+ ]
1540
+ },
1541
+ "classData": {
1542
+ "description": "A character class",
1543
+ "type": "object",
1544
+ "properties": {
1545
+ "name": {
1546
+ "type": "string"
1547
+ },
1548
+ "source": {
1549
+ "$ref": "../util.json#/$defs/source"
1550
+ },
1551
+ "otherSources": {
1552
+ "$ref": "../util.json#/$defs/otherSources"
1553
+ },
1554
+ "srd": {
1555
+ "$ref": "../util.json#/$defs/srd"
1556
+ },
1557
+ "basicRules": {
1558
+ "$ref": "../util.json#/$defs/basicRules"
1559
+ },
1560
+ "isReprinted": {
1561
+ "type": "boolean"
1562
+ },
1563
+ "classGroup": {
1564
+ "type": "array",
1565
+ "items": {
1566
+ "type": "string",
1567
+ "enum": [
1568
+ "expert",
1569
+ "mage",
1570
+ "priest",
1571
+ "warrior"
1572
+ ]
1573
+ }
1574
+ },
1575
+ "isSidekick": {
1576
+ "type": "boolean"
1577
+ },
1578
+ "hd": {
1579
+ "type": "object",
1580
+ "properties": {
1581
+ "number": {
1582
+ "type": "integer"
1583
+ },
1584
+ "faces": {
1585
+ "type": "integer"
1586
+ }
1587
+ },
1588
+ "required": [
1589
+ "number",
1590
+ "faces"
1591
+ ],
1592
+ "additionalProperties": false
1593
+ },
1594
+ "proficiency": {
1595
+ "type": "array",
1596
+ "items": {
1597
+ "type": "string",
1598
+ "enum": [
1599
+ "str",
1600
+ "dex",
1601
+ "con",
1602
+ "int",
1603
+ "wis",
1604
+ "cha"
1605
+ ]
1606
+ }
1607
+ },
1608
+ "classTableGroups": {
1609
+ "type": "array",
1610
+ "items": {
1611
+ "$ref": "#/$defs/classTableGroup"
1612
+ }
1613
+ },
1614
+ "startingProficiencies": {
1615
+ "$ref": "#/$defs/proficiencies"
1616
+ },
1617
+ "startingEquipment": {
1618
+ "type": "object",
1619
+ "properties": {
1620
+ "additionalFromBackground": {
1621
+ "type": "boolean"
1622
+ },
1623
+ "default": {
1624
+ "type": "array",
1625
+ "items": {
1626
+ "type": "string"
1627
+ }
1628
+ },
1629
+ "defaultData": {
1630
+ "$ref": "../util.json#/$defs/startingEquipment"
1631
+ },
1632
+ "goldAlternative": {
1633
+ "type": "string"
1634
+ }
1635
+ },
1636
+ "required": [
1637
+ "additionalFromBackground",
1638
+ "default"
1639
+ ],
1640
+ "additionalProperties": false
1641
+ },
1642
+ "requirements": {
1643
+ "$ref": "#/$defs/requirements"
1644
+ },
1645
+ "multiclassing": {
1646
+ "type": "object",
1647
+ "properties": {
1648
+ "requirements": {
1649
+ "$ref": "#/$defs/requirements"
1650
+ },
1651
+ "proficienciesGained": {
1652
+ "$ref": "#/$defs/proficiencies"
1653
+ },
1654
+ "entries": {
1655
+ "type": "array",
1656
+ "items": {
1657
+ "$ref": "../entry.json"
1658
+ }
1659
+ }
1660
+ },
1661
+ "additionalProperties": false
1662
+ },
1663
+ "casterProgression": {
1664
+ "enum": [
1665
+ "full",
1666
+ "1/2",
1667
+ "1/3",
1668
+ "pact",
1669
+ "artificer"
1670
+ ]
1671
+ },
1672
+ "preparedSpells": {
1673
+ "type": "string",
1674
+ "description": "Formula for the number of spells the class can prepare, for example:\n\"<$level$> / 2 + <$int_mod$>\""
1675
+ },
1676
+ "preparedSpellsProgression": {
1677
+ "type": "array",
1678
+ "items": {
1679
+ "type": "integer"
1680
+ },
1681
+ "minItems": 20,
1682
+ "maxItems": 20
1683
+ },
1684
+ "spellcastingAbility": {
1685
+ "enum": [
1686
+ "str",
1687
+ "dex",
1688
+ "con",
1689
+ "int",
1690
+ "wis",
1691
+ "cha"
1692
+ ]
1693
+ },
1694
+ "cantripProgression": {
1695
+ "type": "array",
1696
+ "items": {
1697
+ "type": "integer"
1698
+ },
1699
+ "minItems": 20,
1700
+ "maxItems": 20
1701
+ },
1702
+ "spellsKnownProgression": {
1703
+ "type": "array",
1704
+ "items": {
1705
+ "type": "integer"
1706
+ },
1707
+ "minItems": 20,
1708
+ "maxItems": 20
1709
+ },
1710
+ "spellsKnownProgressionFixed": {
1711
+ "description": "For e.g. Wizard, where the spells taken at each level must be <= the max spellcasting level, and cannot be swapped out afterward.",
1712
+ "type": "array",
1713
+ "items": {
1714
+ "type": "integer"
1715
+ },
1716
+ "minItems": 20,
1717
+ "maxItems": 20
1718
+ },
1719
+ "spellsKnownProgressionFixedAllowLowerLevel": {
1720
+ "type": "boolean"
1721
+ },
1722
+ "spellsKnownProgressionFixedByLevel": {
1723
+ "description": "For e.g. Warlock Mystic Arcanum. A map of <class level> -> <spell level> -> <number of spells known>",
1724
+ "type": "object",
1725
+ "patternProperties": {
1726
+ "^\\d+$": {
1727
+ "type": "object",
1728
+ "properties": {
1729
+ "1": {
1730
+ "type": "integer"
1731
+ },
1732
+ "2": {
1733
+ "type": "integer"
1734
+ },
1735
+ "3": {
1736
+ "type": "integer"
1737
+ },
1738
+ "4": {
1739
+ "type": "integer"
1740
+ },
1741
+ "5": {
1742
+ "type": "integer"
1743
+ },
1744
+ "6": {
1745
+ "type": "integer"
1746
+ },
1747
+ "7": {
1748
+ "type": "integer"
1749
+ },
1750
+ "8": {
1751
+ "type": "integer"
1752
+ },
1753
+ "9": {
1754
+ "type": "integer"
1755
+ }
1756
+ },
1757
+ "additionalProperties": false
1758
+ }
1759
+ },
1760
+ "additionalProperties": false
1761
+ },
1762
+ "optionalfeatureProgression": {
1763
+ "$ref": "../util.json#/$defs/optionalfeatureProgression"
1764
+ },
1765
+ "classFeatures": {
1766
+ "type": "array",
1767
+ "description": "Format: \" name | className | classSource | level | source \" , PHB is assumed as classSource and featureSource is assumed to be the same as classSource.",
1768
+ "items": {
1769
+ "oneOf": [
1770
+ {
1771
+ "type": "string"
1772
+ },
1773
+ {
1774
+ "type": "object",
1775
+ "properties": {
1776
+ "classFeature": {
1777
+ "type": "string"
1778
+ },
1779
+ "gainSubclassFeature": {
1780
+ "type": "boolean"
1781
+ }
1782
+ },
1783
+ "required": [
1784
+ "classFeature"
1785
+ ]
1786
+ }
1787
+ ]
1788
+ }
1789
+ },
1790
+ "subclassTitle": {
1791
+ "type": "string"
1792
+ },
1793
+ "page": {
1794
+ "$ref": "../util.json#/$defs/page"
1795
+ },
1796
+ "fluff": {
1797
+ "type": "array",
1798
+ "items": {
1799
+ "type": "object",
1800
+ "properties": {
1801
+ "name": {
1802
+ "type": "string"
1803
+ },
1804
+ "entries": {
1805
+ "type": "array",
1806
+ "items": {
1807
+ "$ref": "../entry.json"
1808
+ }
1809
+ },
1810
+ "page": {
1811
+ "$ref": "../util.json#/$defs/page"
1812
+ },
1813
+ "source": {
1814
+ "$ref": "../util.json#/$defs/source"
1815
+ },
1816
+ "type": {
1817
+ "type": "string"
1818
+ }
1819
+ },
1820
+ "required": [
1821
+ "entries",
1822
+ "source"
1823
+ ],
1824
+ "additionalProperties": false
1825
+ }
1826
+ },
1827
+ "additionalSpells": {
1828
+ "$ref": "../util.json#/$defs/additionalSpellsArray"
1829
+ },
1830
+ "classSpells": {
1831
+ "description": "Homebrew use only",
1832
+ "type": "array",
1833
+ "minItems": 1,
1834
+ "uniqueItems": true,
1835
+ "items": {
1836
+ "$ref": "../util.json#/$defs/spellListSpellRef"
1837
+ }
1838
+ }
1839
+ },
1840
+ "additionalProperties": false
1841
+ }
1842
+ },
1843
+ "properties": {
1844
+ "_meta": {
1845
+ "$ref": "../util.json#/$defs/metaBlock"
1846
+ },
1847
+ "class": {
1848
+ "type": "array",
1849
+ "items": {
1850
+ "$ref": "#/$defs/class"
1851
+ },
1852
+ "minItems": 1,
1853
+ "uniqueItems": true
1854
+ },
1855
+ "subclass": {
1856
+ "type": "array",
1857
+ "items": {
1858
+ "$ref": "#/$defs/subclass"
1859
+ },
1860
+ "minItems": 1,
1861
+ "uniqueItems": true
1862
+ },
1863
+ "classFeature": {
1864
+ "type": "array",
1865
+ "items": {
1866
+ "$ref": "#/$defs/classFeature"
1867
+ },
1868
+ "minItems": 1,
1869
+ "uniqueItems": true
1870
+ },
1871
+ "subclassFeature": {
1872
+ "type": "array",
1873
+ "items": {
1874
+ "$ref": "#/$defs/subclassFeature"
1875
+ },
1876
+ "minItems": 1,
1877
+ "uniqueItems": true
1878
+ }
1879
+ },
1880
+ "additionalProperties": false
1881
+ }