5etools-utils 0.8.37 → 0.9.0

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 (165) hide show
  1. package/README.md +1 -0
  2. package/bin/test-json-ua.js +5 -0
  3. package/lib/BrewTester.js +2 -2
  4. package/lib/TestJson.js +19 -6
  5. package/package.json +2 -1
  6. package/schema/site/util.json +1 -1
  7. package/schema/site-fast/util.json +1 -1
  8. package/schema/ua/actions.json +97 -0
  9. package/schema/ua/adventure/adventure.json +12 -0
  10. package/schema/ua/adventures.json +214 -0
  11. package/schema/ua/backgrounds.json +314 -0
  12. package/schema/ua/bestiary/bestiary.json +3735 -0
  13. package/schema/ua/bestiary/fluff-bestiary.json +15 -0
  14. package/schema/ua/bestiary/fluff-index.json +11 -0
  15. package/schema/ua/bestiary/foundry.json +15 -0
  16. package/schema/ua/bestiary/index.json +11 -0
  17. package/schema/ua/bestiary/legendarygroups.json +202 -0
  18. package/schema/ua/bestiary/template.json +275 -0
  19. package/schema/ua/book/book.json +12 -0
  20. package/schema/ua/books.json +141 -0
  21. package/schema/ua/changelog.json +35 -0
  22. package/schema/ua/charcreationoptions.json +80 -0
  23. package/schema/ua/class/class.json +1782 -0
  24. package/schema/ua/class/foundry.json +397 -0
  25. package/schema/ua/class/index.json +11 -0
  26. package/schema/ua/conditionsdiseases.json +82 -0
  27. package/schema/ua/cultsboons.json +175 -0
  28. package/schema/ua/decks.json +504 -0
  29. package/schema/ua/deities.json +473 -0
  30. package/schema/ua/encounters.json +105 -0
  31. package/schema/ua/entry.json +3748 -0
  32. package/schema/ua/feats.json +117 -0
  33. package/schema/ua/fluff-backgrounds.json +15 -0
  34. package/schema/ua/fluff-charcreationoptions.json +43 -0
  35. package/schema/ua/fluff-conditionsdiseases.json +43 -0
  36. package/schema/ua/fluff-feats.json +15 -0
  37. package/schema/ua/fluff-items.json +15 -0
  38. package/schema/ua/fluff-languages.json +42 -0
  39. package/schema/ua/fluff-objects.json +15 -0
  40. package/schema/ua/fluff-races.json +214 -0
  41. package/schema/ua/fluff-recipes.json +42 -0
  42. package/schema/ua/fluff-vehicles.json +63 -0
  43. package/schema/ua/foundry-actions.json +15 -0
  44. package/schema/ua/foundry-backgrounds.json +53 -0
  45. package/schema/ua/foundry-feats.json +15 -0
  46. package/schema/ua/foundry-items.json +63 -0
  47. package/schema/ua/foundry-optionalfeatures.json +15 -0
  48. package/schema/ua/foundry-psionics.json +56 -0
  49. package/schema/ua/foundry-races.json +58 -0
  50. package/schema/ua/foundry-rewards.json +15 -0
  51. package/schema/ua/foundry-vehicles.json +15 -0
  52. package/schema/ua/generated/bookref-quick.json +72 -0
  53. package/schema/ua/generated/gendata-spell-source-lookup.json +230 -0
  54. package/schema/ua/homebrew.json +633 -0
  55. package/schema/ua/items-base.json +959 -0
  56. package/schema/ua/items-shared.json +267 -0
  57. package/schema/ua/items.json +1770 -0
  58. package/schema/ua/languages.json +123 -0
  59. package/schema/ua/life.json +17 -0
  60. package/schema/ua/loot.json +510 -0
  61. package/schema/ua/magicvariants.json +361 -0
  62. package/schema/ua/makebrew-creature.json +66 -0
  63. package/schema/ua/makecards.json +43 -0
  64. package/schema/ua/monsterfeatures.json +53 -0
  65. package/schema/ua/msbcr.json +60 -0
  66. package/schema/ua/names.json +94 -0
  67. package/schema/ua/objects.json +165 -0
  68. package/schema/ua/optionalfeatures.json +130 -0
  69. package/schema/ua/psionics.json +173 -0
  70. package/schema/ua/races.json +1650 -0
  71. package/schema/ua/recipes.json +185 -0
  72. package/schema/ua/renderdemo.json +16 -0
  73. package/schema/ua/rewards.json +93 -0
  74. package/schema/ua/senses.json +54 -0
  75. package/schema/ua/skills.json +54 -0
  76. package/schema/ua/spells/fluff-index.json +11 -0
  77. package/schema/ua/spells/fluff-spells.json +15 -0
  78. package/schema/ua/spells/foundry.json +15 -0
  79. package/schema/ua/spells/index.json +11 -0
  80. package/schema/ua/spells/roll20.json +112 -0
  81. package/schema/ua/spells/spells.json +1190 -0
  82. package/schema/ua/tables.json +220 -0
  83. package/schema/ua/trapshazards.json +236 -0
  84. package/schema/ua/util.json +4420 -0
  85. package/schema/ua/variantrules.json +74 -0
  86. package/schema/ua/vehicles.json +820 -0
  87. package/schema/ua-fast/actions.json +97 -0
  88. package/schema/ua-fast/adventure/adventure.json +12 -0
  89. package/schema/ua-fast/adventures.json +214 -0
  90. package/schema/ua-fast/backgrounds.json +314 -0
  91. package/schema/ua-fast/bestiary/bestiary.json +3735 -0
  92. package/schema/ua-fast/bestiary/fluff-bestiary.json +15 -0
  93. package/schema/ua-fast/bestiary/fluff-index.json +11 -0
  94. package/schema/ua-fast/bestiary/foundry.json +15 -0
  95. package/schema/ua-fast/bestiary/index.json +11 -0
  96. package/schema/ua-fast/bestiary/legendarygroups.json +202 -0
  97. package/schema/ua-fast/bestiary/template.json +275 -0
  98. package/schema/ua-fast/book/book.json +12 -0
  99. package/schema/ua-fast/books.json +141 -0
  100. package/schema/ua-fast/changelog.json +35 -0
  101. package/schema/ua-fast/charcreationoptions.json +80 -0
  102. package/schema/ua-fast/class/class.json +1782 -0
  103. package/schema/ua-fast/class/foundry.json +397 -0
  104. package/schema/ua-fast/class/index.json +11 -0
  105. package/schema/ua-fast/conditionsdiseases.json +82 -0
  106. package/schema/ua-fast/cultsboons.json +175 -0
  107. package/schema/ua-fast/decks.json +504 -0
  108. package/schema/ua-fast/deities.json +473 -0
  109. package/schema/ua-fast/encounters.json +105 -0
  110. package/schema/ua-fast/entry.json +3748 -0
  111. package/schema/ua-fast/feats.json +117 -0
  112. package/schema/ua-fast/fluff-backgrounds.json +15 -0
  113. package/schema/ua-fast/fluff-charcreationoptions.json +43 -0
  114. package/schema/ua-fast/fluff-conditionsdiseases.json +43 -0
  115. package/schema/ua-fast/fluff-feats.json +15 -0
  116. package/schema/ua-fast/fluff-items.json +15 -0
  117. package/schema/ua-fast/fluff-languages.json +42 -0
  118. package/schema/ua-fast/fluff-objects.json +15 -0
  119. package/schema/ua-fast/fluff-races.json +214 -0
  120. package/schema/ua-fast/fluff-recipes.json +42 -0
  121. package/schema/ua-fast/fluff-vehicles.json +63 -0
  122. package/schema/ua-fast/foundry-actions.json +15 -0
  123. package/schema/ua-fast/foundry-backgrounds.json +53 -0
  124. package/schema/ua-fast/foundry-feats.json +15 -0
  125. package/schema/ua-fast/foundry-items.json +63 -0
  126. package/schema/ua-fast/foundry-optionalfeatures.json +15 -0
  127. package/schema/ua-fast/foundry-psionics.json +56 -0
  128. package/schema/ua-fast/foundry-races.json +58 -0
  129. package/schema/ua-fast/foundry-rewards.json +15 -0
  130. package/schema/ua-fast/foundry-vehicles.json +15 -0
  131. package/schema/ua-fast/generated/bookref-quick.json +72 -0
  132. package/schema/ua-fast/generated/gendata-spell-source-lookup.json +230 -0
  133. package/schema/ua-fast/homebrew.json +631 -0
  134. package/schema/ua-fast/items-base.json +959 -0
  135. package/schema/ua-fast/items-shared.json +267 -0
  136. package/schema/ua-fast/items.json +1770 -0
  137. package/schema/ua-fast/languages.json +123 -0
  138. package/schema/ua-fast/life.json +17 -0
  139. package/schema/ua-fast/loot.json +510 -0
  140. package/schema/ua-fast/magicvariants.json +361 -0
  141. package/schema/ua-fast/makebrew-creature.json +66 -0
  142. package/schema/ua-fast/makecards.json +43 -0
  143. package/schema/ua-fast/monsterfeatures.json +53 -0
  144. package/schema/ua-fast/msbcr.json +60 -0
  145. package/schema/ua-fast/names.json +94 -0
  146. package/schema/ua-fast/objects.json +165 -0
  147. package/schema/ua-fast/optionalfeatures.json +130 -0
  148. package/schema/ua-fast/psionics.json +173 -0
  149. package/schema/ua-fast/races.json +1650 -0
  150. package/schema/ua-fast/recipes.json +185 -0
  151. package/schema/ua-fast/renderdemo.json +16 -0
  152. package/schema/ua-fast/rewards.json +93 -0
  153. package/schema/ua-fast/senses.json +54 -0
  154. package/schema/ua-fast/skills.json +54 -0
  155. package/schema/ua-fast/spells/fluff-index.json +11 -0
  156. package/schema/ua-fast/spells/fluff-spells.json +15 -0
  157. package/schema/ua-fast/spells/foundry.json +15 -0
  158. package/schema/ua-fast/spells/index.json +11 -0
  159. package/schema/ua-fast/spells/roll20.json +112 -0
  160. package/schema/ua-fast/spells/spells.json +1190 -0
  161. package/schema/ua-fast/tables.json +220 -0
  162. package/schema/ua-fast/trapshazards.json +236 -0
  163. package/schema/ua-fast/util.json +4420 -0
  164. package/schema/ua-fast/variantrules.json +74 -0
  165. package/schema/ua-fast/vehicles.json +820 -0
@@ -0,0 +1,1782 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "version": "2.11.4",
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
+ },
433
+ "additionalProperties": false,
434
+ "required": [
435
+ "name",
436
+ "shortName",
437
+ "source",
438
+ "className",
439
+ "classSource",
440
+ "subclassFeatures"
441
+ ]
442
+ },
443
+ {
444
+ "type": "object",
445
+ "properties": {
446
+ "name": {
447
+ "type": "string"
448
+ },
449
+ "shortName": {
450
+ "type": "string"
451
+ },
452
+ "source": {
453
+ "$ref": "../util.json#/$defs/source"
454
+ },
455
+ "className": {
456
+ "description": "The name of the class this subclass belongs to.",
457
+ "type": "string"
458
+ },
459
+ "classSource": {
460
+ "description": "The source of the class this subclass belongs to (defaults to PHB).",
461
+ "$ref": "../util.json#/$defs/source"
462
+ },
463
+ "isReprinted": {
464
+ "type": "boolean"
465
+ },
466
+ "srd": {
467
+ "$ref": "../util.json#/$defs/srd"
468
+ },
469
+ "basicRules": {
470
+ "$ref": "../util.json#/$defs/basicRules"
471
+ },
472
+ "page": {
473
+ "$ref": "../util.json#/$defs/page"
474
+ },
475
+ "casterProgression": {
476
+ "enum": [
477
+ "full",
478
+ "1/2",
479
+ "1/3",
480
+ "pact",
481
+ "artificer"
482
+ ]
483
+ },
484
+ "spellcastingAbility": {
485
+ "enum": [
486
+ "str",
487
+ "dex",
488
+ "con",
489
+ "int",
490
+ "wis",
491
+ "cha"
492
+ ]
493
+ },
494
+ "cantripProgression": {
495
+ "type": "array",
496
+ "items": {
497
+ "type": "integer"
498
+ },
499
+ "minItems": 20,
500
+ "maxItems": 20
501
+ },
502
+ "spellsKnownProgression": {
503
+ "type": "array",
504
+ "items": {
505
+ "type": "integer"
506
+ },
507
+ "minItems": 20,
508
+ "maxItems": 20
509
+ },
510
+ "subclassFeatures": {
511
+ "type": "array",
512
+ "description": "Format: \" name | className | classSource | subclassShortName | subclassSource | level | source\"\nPHB is assumed for sources.\nfeatureSource is assumed to be the same as subclassSource.",
513
+ "items": {
514
+ "oneOf": [
515
+ {
516
+ "type": "string"
517
+ },
518
+ {
519
+ "type": "object",
520
+ "properties": {
521
+ "subclassFeature": {
522
+ "type": "string"
523
+ },
524
+ "gainSubclassFeature": {
525
+ "type": "boolean"
526
+ },
527
+ "gainSubclassFeatureHasContent": {
528
+ "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.",
529
+ "type": "boolean"
530
+ },
531
+ "tableDisplayName": {
532
+ "type": "string"
533
+ }
534
+ },
535
+ "required": [
536
+ "subclassFeature"
537
+ ]
538
+ }
539
+ ]
540
+ }
541
+ },
542
+ "optionalfeatureProgression": {
543
+ "$ref": "../util.json#/$defs/optionalfeatureProgression"
544
+ },
545
+ "subclassTableGroups": {
546
+ "type": "array",
547
+ "items": {
548
+ "$ref": "#/$defs/classTableGroup"
549
+ }
550
+ },
551
+ "otherSources": {
552
+ "$ref": "../util.json#/$defs/otherSources"
553
+ },
554
+ "additionalSpells": {
555
+ "$ref": "../util.json#/$defs/additionalSpellsArray"
556
+ },
557
+ "_copy": {
558
+ "type": "object",
559
+ "properties": {
560
+ "name": {
561
+ "type": "string"
562
+ },
563
+ "source": {
564
+ "$ref": "../util.json#/$defs/source"
565
+ },
566
+ "pantheon": {
567
+ "description": "Used in deity data",
568
+ "type": "string"
569
+ },
570
+ "shortName": {
571
+ "description": "Used in subclass data",
572
+ "type": "string"
573
+ },
574
+ "className": {
575
+ "description": "Used in subclass data",
576
+ "type": "string"
577
+ },
578
+ "classSource": {
579
+ "description": "Used in subclass data",
580
+ "$ref": "../util.json#/$defs/source"
581
+ },
582
+ "_mod": {
583
+ "$ref": "../util.json#/$defs/_modObject"
584
+ },
585
+ "_trait": {
586
+ "type": "object",
587
+ "properties": {
588
+ "name": {
589
+ "type": "string"
590
+ },
591
+ "source": {
592
+ "$ref": "../util.json#/$defs/source"
593
+ }
594
+ },
595
+ "required": [
596
+ "name",
597
+ "source"
598
+ ]
599
+ },
600
+ "_preserve": {
601
+ "type": "object",
602
+ "patternProperties": {
603
+ ".*": {
604
+ "const": true
605
+ }
606
+ }
607
+ }
608
+ },
609
+ "required": [
610
+ "name",
611
+ "source"
612
+ ],
613
+ "additionalProperties": false
614
+ }
615
+ },
616
+ "additionalProperties": false,
617
+ "required": [
618
+ "_copy"
619
+ ]
620
+ }
621
+ ]
622
+ },
623
+ "subclassData": {
624
+ "type": "object",
625
+ "properties": {
626
+ "name": {
627
+ "type": "string"
628
+ },
629
+ "shortName": {
630
+ "type": "string"
631
+ },
632
+ "source": {
633
+ "$ref": "../util.json#/$defs/source"
634
+ },
635
+ "className": {
636
+ "description": "The name of the class this subclass belongs to.",
637
+ "type": "string"
638
+ },
639
+ "classSource": {
640
+ "description": "The source of the class this subclass belongs to (defaults to PHB).",
641
+ "$ref": "../util.json#/$defs/source"
642
+ },
643
+ "isReprinted": {
644
+ "type": "boolean"
645
+ },
646
+ "srd": {
647
+ "$ref": "../util.json#/$defs/srd"
648
+ },
649
+ "basicRules": {
650
+ "$ref": "../util.json#/$defs/basicRules"
651
+ },
652
+ "page": {
653
+ "$ref": "../util.json#/$defs/page"
654
+ },
655
+ "casterProgression": {
656
+ "enum": [
657
+ "full",
658
+ "1/2",
659
+ "1/3",
660
+ "pact",
661
+ "artificer"
662
+ ]
663
+ },
664
+ "spellcastingAbility": {
665
+ "enum": [
666
+ "str",
667
+ "dex",
668
+ "con",
669
+ "int",
670
+ "wis",
671
+ "cha"
672
+ ]
673
+ },
674
+ "cantripProgression": {
675
+ "type": "array",
676
+ "items": {
677
+ "type": "integer"
678
+ },
679
+ "minItems": 20,
680
+ "maxItems": 20
681
+ },
682
+ "spellsKnownProgression": {
683
+ "type": "array",
684
+ "items": {
685
+ "type": "integer"
686
+ },
687
+ "minItems": 20,
688
+ "maxItems": 20
689
+ },
690
+ "subclassFeatures": {
691
+ "type": "array",
692
+ "description": "Format: \" name | className | classSource | subclassShortName | subclassSource | level | source\"\nPHB is assumed for sources.\nfeatureSource is assumed to be the same as subclassSource.",
693
+ "items": {
694
+ "oneOf": [
695
+ {
696
+ "type": "string"
697
+ },
698
+ {
699
+ "type": "object",
700
+ "properties": {
701
+ "subclassFeature": {
702
+ "type": "string"
703
+ },
704
+ "gainSubclassFeature": {
705
+ "type": "boolean"
706
+ },
707
+ "gainSubclassFeatureHasContent": {
708
+ "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.",
709
+ "type": "boolean"
710
+ },
711
+ "tableDisplayName": {
712
+ "type": "string"
713
+ }
714
+ },
715
+ "required": [
716
+ "subclassFeature"
717
+ ]
718
+ }
719
+ ]
720
+ }
721
+ },
722
+ "optionalfeatureProgression": {
723
+ "$ref": "../util.json#/$defs/optionalfeatureProgression"
724
+ },
725
+ "subclassTableGroups": {
726
+ "type": "array",
727
+ "items": {
728
+ "$ref": "#/$defs/classTableGroup"
729
+ }
730
+ },
731
+ "otherSources": {
732
+ "$ref": "../util.json#/$defs/otherSources"
733
+ },
734
+ "additionalSpells": {
735
+ "$ref": "../util.json#/$defs/additionalSpellsArray"
736
+ }
737
+ },
738
+ "additionalProperties": false
739
+ },
740
+ "requirements": {
741
+ "type": "object",
742
+ "properties": {
743
+ "str": {
744
+ "type": "integer"
745
+ },
746
+ "dex": {
747
+ "type": "integer"
748
+ },
749
+ "con": {
750
+ "type": "integer"
751
+ },
752
+ "int": {
753
+ "type": "integer"
754
+ },
755
+ "wis": {
756
+ "type": "integer"
757
+ },
758
+ "cha": {
759
+ "type": "integer"
760
+ },
761
+ "or": {
762
+ "type": "array",
763
+ "items": {
764
+ "type": "object",
765
+ "properties": {
766
+ "str": {
767
+ "type": "integer"
768
+ },
769
+ "dex": {
770
+ "type": "integer"
771
+ },
772
+ "con": {
773
+ "type": "integer"
774
+ },
775
+ "int": {
776
+ "type": "integer"
777
+ },
778
+ "wis": {
779
+ "type": "integer"
780
+ },
781
+ "cha": {
782
+ "type": "integer"
783
+ }
784
+ },
785
+ "additionalProperties": false
786
+ }
787
+ },
788
+ "entries": {
789
+ "type": "array",
790
+ "items": {
791
+ "$ref": "../entry.json"
792
+ }
793
+ }
794
+ },
795
+ "additionalProperties": false
796
+ },
797
+ "class": {
798
+ "anyOf": [
799
+ {
800
+ "type": "object",
801
+ "description": "A character class",
802
+ "properties": {
803
+ "name": {
804
+ "type": "string"
805
+ },
806
+ "source": {
807
+ "$ref": "../util.json#/$defs/source"
808
+ },
809
+ "otherSources": {
810
+ "$ref": "../util.json#/$defs/otherSources"
811
+ },
812
+ "srd": {
813
+ "$ref": "../util.json#/$defs/srd"
814
+ },
815
+ "basicRules": {
816
+ "$ref": "../util.json#/$defs/basicRules"
817
+ },
818
+ "isReprinted": {
819
+ "type": "boolean"
820
+ },
821
+ "classGroup": {
822
+ "type": "array",
823
+ "items": {
824
+ "type": "string",
825
+ "enum": [
826
+ "expert",
827
+ "mage",
828
+ "priest",
829
+ "warrior"
830
+ ]
831
+ }
832
+ },
833
+ "isSidekick": {
834
+ "type": "boolean"
835
+ },
836
+ "hd": {
837
+ "type": "object",
838
+ "properties": {
839
+ "number": {
840
+ "type": "integer"
841
+ },
842
+ "faces": {
843
+ "type": "integer"
844
+ }
845
+ },
846
+ "required": [
847
+ "number",
848
+ "faces"
849
+ ],
850
+ "additionalProperties": false
851
+ },
852
+ "proficiency": {
853
+ "type": "array",
854
+ "items": {
855
+ "type": "string",
856
+ "enum": [
857
+ "str",
858
+ "dex",
859
+ "con",
860
+ "int",
861
+ "wis",
862
+ "cha"
863
+ ]
864
+ }
865
+ },
866
+ "classTableGroups": {
867
+ "type": "array",
868
+ "items": {
869
+ "$ref": "#/$defs/classTableGroup"
870
+ }
871
+ },
872
+ "startingProficiencies": {
873
+ "$ref": "#/$defs/proficiencies"
874
+ },
875
+ "startingEquipment": {
876
+ "type": "object",
877
+ "properties": {
878
+ "additionalFromBackground": {
879
+ "type": "boolean"
880
+ },
881
+ "default": {
882
+ "type": "array",
883
+ "items": {
884
+ "type": "string"
885
+ }
886
+ },
887
+ "defaultData": {
888
+ "$ref": "../util.json#/$defs/startingEquipment"
889
+ },
890
+ "goldAlternative": {
891
+ "type": "string"
892
+ }
893
+ },
894
+ "required": [
895
+ "additionalFromBackground",
896
+ "default"
897
+ ],
898
+ "additionalProperties": false
899
+ },
900
+ "requirements": {
901
+ "$ref": "#/$defs/requirements"
902
+ },
903
+ "multiclassing": {
904
+ "type": "object",
905
+ "properties": {
906
+ "requirements": {
907
+ "$ref": "#/$defs/requirements"
908
+ },
909
+ "proficienciesGained": {
910
+ "$ref": "#/$defs/proficiencies"
911
+ },
912
+ "entries": {
913
+ "type": "array",
914
+ "items": {
915
+ "$ref": "../entry.json"
916
+ }
917
+ }
918
+ },
919
+ "additionalProperties": false
920
+ },
921
+ "casterProgression": {
922
+ "enum": [
923
+ "full",
924
+ "1/2",
925
+ "1/3",
926
+ "pact",
927
+ "artificer"
928
+ ]
929
+ },
930
+ "preparedSpells": {
931
+ "type": "string",
932
+ "description": "Formula for the number of spells the class can prepare, for example:\n\"<$level$> / 2 + <$int_mod$>\""
933
+ },
934
+ "preparedSpellsProgression": {
935
+ "type": "array",
936
+ "items": {
937
+ "type": "integer"
938
+ },
939
+ "minItems": 20,
940
+ "maxItems": 20
941
+ },
942
+ "spellcastingAbility": {
943
+ "enum": [
944
+ "str",
945
+ "dex",
946
+ "con",
947
+ "int",
948
+ "wis",
949
+ "cha"
950
+ ]
951
+ },
952
+ "cantripProgression": {
953
+ "type": "array",
954
+ "items": {
955
+ "type": "integer"
956
+ },
957
+ "minItems": 20,
958
+ "maxItems": 20
959
+ },
960
+ "spellsKnownProgression": {
961
+ "type": "array",
962
+ "items": {
963
+ "type": "integer"
964
+ },
965
+ "minItems": 20,
966
+ "maxItems": 20
967
+ },
968
+ "spellsKnownProgressionFixed": {
969
+ "description": "For e.g. Wizard, where the spells taken at each level must be <= the max spellcasting level, and cannot be swapped out afterward.",
970
+ "type": "array",
971
+ "items": {
972
+ "type": "integer"
973
+ },
974
+ "minItems": 20,
975
+ "maxItems": 20
976
+ },
977
+ "spellsKnownProgressionFixedAllowLowerLevel": {
978
+ "type": "boolean"
979
+ },
980
+ "spellsKnownProgressionFixedByLevel": {
981
+ "description": "For e.g. Warlock Mystic Arcanum. A map of <class level> -> <spell level> -> <number of spells known>",
982
+ "type": "object",
983
+ "patternProperties": {
984
+ "^\\d+$": {
985
+ "type": "object",
986
+ "properties": {
987
+ "1": {
988
+ "type": "integer"
989
+ },
990
+ "2": {
991
+ "type": "integer"
992
+ },
993
+ "3": {
994
+ "type": "integer"
995
+ },
996
+ "4": {
997
+ "type": "integer"
998
+ },
999
+ "5": {
1000
+ "type": "integer"
1001
+ },
1002
+ "6": {
1003
+ "type": "integer"
1004
+ },
1005
+ "7": {
1006
+ "type": "integer"
1007
+ },
1008
+ "8": {
1009
+ "type": "integer"
1010
+ },
1011
+ "9": {
1012
+ "type": "integer"
1013
+ }
1014
+ },
1015
+ "additionalProperties": false
1016
+ }
1017
+ },
1018
+ "additionalProperties": false
1019
+ },
1020
+ "optionalfeatureProgression": {
1021
+ "$ref": "../util.json#/$defs/optionalfeatureProgression"
1022
+ },
1023
+ "classFeatures": {
1024
+ "type": "array",
1025
+ "description": "Format: \" name | className | classSource | level | source \" , PHB is assumed as classSource and featureSource is assumed to be the same as classSource.",
1026
+ "items": {
1027
+ "oneOf": [
1028
+ {
1029
+ "type": "string"
1030
+ },
1031
+ {
1032
+ "type": "object",
1033
+ "properties": {
1034
+ "classFeature": {
1035
+ "type": "string"
1036
+ },
1037
+ "gainSubclassFeature": {
1038
+ "type": "boolean"
1039
+ }
1040
+ },
1041
+ "required": [
1042
+ "classFeature"
1043
+ ]
1044
+ }
1045
+ ]
1046
+ }
1047
+ },
1048
+ "subclassTitle": {
1049
+ "type": "string"
1050
+ },
1051
+ "page": {
1052
+ "$ref": "../util.json#/$defs/page"
1053
+ },
1054
+ "fluff": {
1055
+ "type": "array",
1056
+ "items": {
1057
+ "type": "object",
1058
+ "properties": {
1059
+ "name": {
1060
+ "type": "string"
1061
+ },
1062
+ "entries": {
1063
+ "type": "array",
1064
+ "items": {
1065
+ "$ref": "../entry.json"
1066
+ }
1067
+ },
1068
+ "page": {
1069
+ "$ref": "../util.json#/$defs/page"
1070
+ },
1071
+ "source": {
1072
+ "$ref": "../util.json#/$defs/source"
1073
+ },
1074
+ "type": {
1075
+ "type": "string"
1076
+ }
1077
+ },
1078
+ "required": [
1079
+ "entries",
1080
+ "source"
1081
+ ],
1082
+ "additionalProperties": false
1083
+ }
1084
+ },
1085
+ "additionalSpells": {
1086
+ "$ref": "../util.json#/$defs/additionalSpellsArray"
1087
+ }
1088
+ },
1089
+ "additionalProperties": false,
1090
+ "required": [
1091
+ "name",
1092
+ "source",
1093
+ "classFeatures"
1094
+ ]
1095
+ },
1096
+ {
1097
+ "type": "object",
1098
+ "description": "A character class",
1099
+ "properties": {
1100
+ "name": {
1101
+ "type": "string"
1102
+ },
1103
+ "source": {
1104
+ "$ref": "../util.json#/$defs/source"
1105
+ },
1106
+ "otherSources": {
1107
+ "$ref": "../util.json#/$defs/otherSources"
1108
+ },
1109
+ "srd": {
1110
+ "$ref": "../util.json#/$defs/srd"
1111
+ },
1112
+ "basicRules": {
1113
+ "$ref": "../util.json#/$defs/basicRules"
1114
+ },
1115
+ "isReprinted": {
1116
+ "type": "boolean"
1117
+ },
1118
+ "classGroup": {
1119
+ "type": "array",
1120
+ "items": {
1121
+ "type": "string",
1122
+ "enum": [
1123
+ "expert",
1124
+ "mage",
1125
+ "priest",
1126
+ "warrior"
1127
+ ]
1128
+ }
1129
+ },
1130
+ "isSidekick": {
1131
+ "type": "boolean"
1132
+ },
1133
+ "hd": {
1134
+ "type": "object",
1135
+ "properties": {
1136
+ "number": {
1137
+ "type": "integer"
1138
+ },
1139
+ "faces": {
1140
+ "type": "integer"
1141
+ }
1142
+ },
1143
+ "required": [
1144
+ "number",
1145
+ "faces"
1146
+ ],
1147
+ "additionalProperties": false
1148
+ },
1149
+ "proficiency": {
1150
+ "type": "array",
1151
+ "items": {
1152
+ "type": "string",
1153
+ "enum": [
1154
+ "str",
1155
+ "dex",
1156
+ "con",
1157
+ "int",
1158
+ "wis",
1159
+ "cha"
1160
+ ]
1161
+ }
1162
+ },
1163
+ "classTableGroups": {
1164
+ "type": "array",
1165
+ "items": {
1166
+ "$ref": "#/$defs/classTableGroup"
1167
+ }
1168
+ },
1169
+ "startingProficiencies": {
1170
+ "$ref": "#/$defs/proficiencies"
1171
+ },
1172
+ "startingEquipment": {
1173
+ "type": "object",
1174
+ "properties": {
1175
+ "additionalFromBackground": {
1176
+ "type": "boolean"
1177
+ },
1178
+ "default": {
1179
+ "type": "array",
1180
+ "items": {
1181
+ "type": "string"
1182
+ }
1183
+ },
1184
+ "defaultData": {
1185
+ "$ref": "../util.json#/$defs/startingEquipment"
1186
+ },
1187
+ "goldAlternative": {
1188
+ "type": "string"
1189
+ }
1190
+ },
1191
+ "required": [
1192
+ "additionalFromBackground",
1193
+ "default"
1194
+ ],
1195
+ "additionalProperties": false
1196
+ },
1197
+ "requirements": {
1198
+ "$ref": "#/$defs/requirements"
1199
+ },
1200
+ "multiclassing": {
1201
+ "type": "object",
1202
+ "properties": {
1203
+ "requirements": {
1204
+ "$ref": "#/$defs/requirements"
1205
+ },
1206
+ "proficienciesGained": {
1207
+ "$ref": "#/$defs/proficiencies"
1208
+ },
1209
+ "entries": {
1210
+ "type": "array",
1211
+ "items": {
1212
+ "$ref": "../entry.json"
1213
+ }
1214
+ }
1215
+ },
1216
+ "additionalProperties": false
1217
+ },
1218
+ "casterProgression": {
1219
+ "enum": [
1220
+ "full",
1221
+ "1/2",
1222
+ "1/3",
1223
+ "pact",
1224
+ "artificer"
1225
+ ]
1226
+ },
1227
+ "preparedSpells": {
1228
+ "type": "string",
1229
+ "description": "Formula for the number of spells the class can prepare, for example:\n\"<$level$> / 2 + <$int_mod$>\""
1230
+ },
1231
+ "preparedSpellsProgression": {
1232
+ "type": "array",
1233
+ "items": {
1234
+ "type": "integer"
1235
+ },
1236
+ "minItems": 20,
1237
+ "maxItems": 20
1238
+ },
1239
+ "spellcastingAbility": {
1240
+ "enum": [
1241
+ "str",
1242
+ "dex",
1243
+ "con",
1244
+ "int",
1245
+ "wis",
1246
+ "cha"
1247
+ ]
1248
+ },
1249
+ "cantripProgression": {
1250
+ "type": "array",
1251
+ "items": {
1252
+ "type": "integer"
1253
+ },
1254
+ "minItems": 20,
1255
+ "maxItems": 20
1256
+ },
1257
+ "spellsKnownProgression": {
1258
+ "type": "array",
1259
+ "items": {
1260
+ "type": "integer"
1261
+ },
1262
+ "minItems": 20,
1263
+ "maxItems": 20
1264
+ },
1265
+ "spellsKnownProgressionFixed": {
1266
+ "description": "For e.g. Wizard, where the spells taken at each level must be <= the max spellcasting level, and cannot be swapped out afterward.",
1267
+ "type": "array",
1268
+ "items": {
1269
+ "type": "integer"
1270
+ },
1271
+ "minItems": 20,
1272
+ "maxItems": 20
1273
+ },
1274
+ "spellsKnownProgressionFixedAllowLowerLevel": {
1275
+ "type": "boolean"
1276
+ },
1277
+ "spellsKnownProgressionFixedByLevel": {
1278
+ "description": "For e.g. Warlock Mystic Arcanum. A map of <class level> -> <spell level> -> <number of spells known>",
1279
+ "type": "object",
1280
+ "patternProperties": {
1281
+ "^\\d+$": {
1282
+ "type": "object",
1283
+ "properties": {
1284
+ "1": {
1285
+ "type": "integer"
1286
+ },
1287
+ "2": {
1288
+ "type": "integer"
1289
+ },
1290
+ "3": {
1291
+ "type": "integer"
1292
+ },
1293
+ "4": {
1294
+ "type": "integer"
1295
+ },
1296
+ "5": {
1297
+ "type": "integer"
1298
+ },
1299
+ "6": {
1300
+ "type": "integer"
1301
+ },
1302
+ "7": {
1303
+ "type": "integer"
1304
+ },
1305
+ "8": {
1306
+ "type": "integer"
1307
+ },
1308
+ "9": {
1309
+ "type": "integer"
1310
+ }
1311
+ },
1312
+ "additionalProperties": false
1313
+ }
1314
+ },
1315
+ "additionalProperties": false
1316
+ },
1317
+ "optionalfeatureProgression": {
1318
+ "$ref": "../util.json#/$defs/optionalfeatureProgression"
1319
+ },
1320
+ "classFeatures": {
1321
+ "type": "array",
1322
+ "description": "Format: \" name | className | classSource | level | source \" , PHB is assumed as classSource and featureSource is assumed to be the same as classSource.",
1323
+ "items": {
1324
+ "oneOf": [
1325
+ {
1326
+ "type": "string"
1327
+ },
1328
+ {
1329
+ "type": "object",
1330
+ "properties": {
1331
+ "classFeature": {
1332
+ "type": "string"
1333
+ },
1334
+ "gainSubclassFeature": {
1335
+ "type": "boolean"
1336
+ }
1337
+ },
1338
+ "required": [
1339
+ "classFeature"
1340
+ ]
1341
+ }
1342
+ ]
1343
+ }
1344
+ },
1345
+ "subclassTitle": {
1346
+ "type": "string"
1347
+ },
1348
+ "page": {
1349
+ "$ref": "../util.json#/$defs/page"
1350
+ },
1351
+ "fluff": {
1352
+ "type": "array",
1353
+ "items": {
1354
+ "type": "object",
1355
+ "properties": {
1356
+ "name": {
1357
+ "type": "string"
1358
+ },
1359
+ "entries": {
1360
+ "type": "array",
1361
+ "items": {
1362
+ "$ref": "../entry.json"
1363
+ }
1364
+ },
1365
+ "page": {
1366
+ "$ref": "../util.json#/$defs/page"
1367
+ },
1368
+ "source": {
1369
+ "$ref": "../util.json#/$defs/source"
1370
+ },
1371
+ "type": {
1372
+ "type": "string"
1373
+ }
1374
+ },
1375
+ "required": [
1376
+ "entries",
1377
+ "source"
1378
+ ],
1379
+ "additionalProperties": false
1380
+ }
1381
+ },
1382
+ "additionalSpells": {
1383
+ "$ref": "../util.json#/$defs/additionalSpellsArray"
1384
+ },
1385
+ "_copy": {
1386
+ "type": "object",
1387
+ "properties": {
1388
+ "name": {
1389
+ "type": "string"
1390
+ },
1391
+ "source": {
1392
+ "$ref": "../util.json#/$defs/source"
1393
+ },
1394
+ "pantheon": {
1395
+ "description": "Used in deity data",
1396
+ "type": "string"
1397
+ },
1398
+ "shortName": {
1399
+ "description": "Used in subclass data",
1400
+ "type": "string"
1401
+ },
1402
+ "className": {
1403
+ "description": "Used in subclass data",
1404
+ "type": "string"
1405
+ },
1406
+ "classSource": {
1407
+ "description": "Used in subclass data",
1408
+ "$ref": "../util.json#/$defs/source"
1409
+ },
1410
+ "_mod": {
1411
+ "$ref": "../util.json#/$defs/_modObject"
1412
+ },
1413
+ "_trait": {
1414
+ "type": "object",
1415
+ "properties": {
1416
+ "name": {
1417
+ "type": "string"
1418
+ },
1419
+ "source": {
1420
+ "$ref": "../util.json#/$defs/source"
1421
+ }
1422
+ },
1423
+ "required": [
1424
+ "name",
1425
+ "source"
1426
+ ]
1427
+ },
1428
+ "_preserve": {
1429
+ "type": "object",
1430
+ "patternProperties": {
1431
+ ".*": {
1432
+ "const": true
1433
+ }
1434
+ }
1435
+ }
1436
+ },
1437
+ "required": [
1438
+ "name",
1439
+ "source"
1440
+ ],
1441
+ "additionalProperties": false
1442
+ }
1443
+ },
1444
+ "additionalProperties": false,
1445
+ "required": [
1446
+ "_copy"
1447
+ ]
1448
+ }
1449
+ ]
1450
+ },
1451
+ "classData": {
1452
+ "description": "A character class",
1453
+ "type": "object",
1454
+ "properties": {
1455
+ "name": {
1456
+ "type": "string"
1457
+ },
1458
+ "source": {
1459
+ "$ref": "../util.json#/$defs/source"
1460
+ },
1461
+ "otherSources": {
1462
+ "$ref": "../util.json#/$defs/otherSources"
1463
+ },
1464
+ "srd": {
1465
+ "$ref": "../util.json#/$defs/srd"
1466
+ },
1467
+ "basicRules": {
1468
+ "$ref": "../util.json#/$defs/basicRules"
1469
+ },
1470
+ "isReprinted": {
1471
+ "type": "boolean"
1472
+ },
1473
+ "classGroup": {
1474
+ "type": "array",
1475
+ "items": {
1476
+ "type": "string",
1477
+ "enum": [
1478
+ "expert",
1479
+ "mage",
1480
+ "priest",
1481
+ "warrior"
1482
+ ]
1483
+ }
1484
+ },
1485
+ "isSidekick": {
1486
+ "type": "boolean"
1487
+ },
1488
+ "hd": {
1489
+ "type": "object",
1490
+ "properties": {
1491
+ "number": {
1492
+ "type": "integer"
1493
+ },
1494
+ "faces": {
1495
+ "type": "integer"
1496
+ }
1497
+ },
1498
+ "required": [
1499
+ "number",
1500
+ "faces"
1501
+ ],
1502
+ "additionalProperties": false
1503
+ },
1504
+ "proficiency": {
1505
+ "type": "array",
1506
+ "items": {
1507
+ "type": "string",
1508
+ "enum": [
1509
+ "str",
1510
+ "dex",
1511
+ "con",
1512
+ "int",
1513
+ "wis",
1514
+ "cha"
1515
+ ]
1516
+ }
1517
+ },
1518
+ "classTableGroups": {
1519
+ "type": "array",
1520
+ "items": {
1521
+ "$ref": "#/$defs/classTableGroup"
1522
+ }
1523
+ },
1524
+ "startingProficiencies": {
1525
+ "$ref": "#/$defs/proficiencies"
1526
+ },
1527
+ "startingEquipment": {
1528
+ "type": "object",
1529
+ "properties": {
1530
+ "additionalFromBackground": {
1531
+ "type": "boolean"
1532
+ },
1533
+ "default": {
1534
+ "type": "array",
1535
+ "items": {
1536
+ "type": "string"
1537
+ }
1538
+ },
1539
+ "defaultData": {
1540
+ "$ref": "../util.json#/$defs/startingEquipment"
1541
+ },
1542
+ "goldAlternative": {
1543
+ "type": "string"
1544
+ }
1545
+ },
1546
+ "required": [
1547
+ "additionalFromBackground",
1548
+ "default"
1549
+ ],
1550
+ "additionalProperties": false
1551
+ },
1552
+ "requirements": {
1553
+ "$ref": "#/$defs/requirements"
1554
+ },
1555
+ "multiclassing": {
1556
+ "type": "object",
1557
+ "properties": {
1558
+ "requirements": {
1559
+ "$ref": "#/$defs/requirements"
1560
+ },
1561
+ "proficienciesGained": {
1562
+ "$ref": "#/$defs/proficiencies"
1563
+ },
1564
+ "entries": {
1565
+ "type": "array",
1566
+ "items": {
1567
+ "$ref": "../entry.json"
1568
+ }
1569
+ }
1570
+ },
1571
+ "additionalProperties": false
1572
+ },
1573
+ "casterProgression": {
1574
+ "enum": [
1575
+ "full",
1576
+ "1/2",
1577
+ "1/3",
1578
+ "pact",
1579
+ "artificer"
1580
+ ]
1581
+ },
1582
+ "preparedSpells": {
1583
+ "type": "string",
1584
+ "description": "Formula for the number of spells the class can prepare, for example:\n\"<$level$> / 2 + <$int_mod$>\""
1585
+ },
1586
+ "preparedSpellsProgression": {
1587
+ "type": "array",
1588
+ "items": {
1589
+ "type": "integer"
1590
+ },
1591
+ "minItems": 20,
1592
+ "maxItems": 20
1593
+ },
1594
+ "spellcastingAbility": {
1595
+ "enum": [
1596
+ "str",
1597
+ "dex",
1598
+ "con",
1599
+ "int",
1600
+ "wis",
1601
+ "cha"
1602
+ ]
1603
+ },
1604
+ "cantripProgression": {
1605
+ "type": "array",
1606
+ "items": {
1607
+ "type": "integer"
1608
+ },
1609
+ "minItems": 20,
1610
+ "maxItems": 20
1611
+ },
1612
+ "spellsKnownProgression": {
1613
+ "type": "array",
1614
+ "items": {
1615
+ "type": "integer"
1616
+ },
1617
+ "minItems": 20,
1618
+ "maxItems": 20
1619
+ },
1620
+ "spellsKnownProgressionFixed": {
1621
+ "description": "For e.g. Wizard, where the spells taken at each level must be <= the max spellcasting level, and cannot be swapped out afterward.",
1622
+ "type": "array",
1623
+ "items": {
1624
+ "type": "integer"
1625
+ },
1626
+ "minItems": 20,
1627
+ "maxItems": 20
1628
+ },
1629
+ "spellsKnownProgressionFixedAllowLowerLevel": {
1630
+ "type": "boolean"
1631
+ },
1632
+ "spellsKnownProgressionFixedByLevel": {
1633
+ "description": "For e.g. Warlock Mystic Arcanum. A map of <class level> -> <spell level> -> <number of spells known>",
1634
+ "type": "object",
1635
+ "patternProperties": {
1636
+ "^\\d+$": {
1637
+ "type": "object",
1638
+ "properties": {
1639
+ "1": {
1640
+ "type": "integer"
1641
+ },
1642
+ "2": {
1643
+ "type": "integer"
1644
+ },
1645
+ "3": {
1646
+ "type": "integer"
1647
+ },
1648
+ "4": {
1649
+ "type": "integer"
1650
+ },
1651
+ "5": {
1652
+ "type": "integer"
1653
+ },
1654
+ "6": {
1655
+ "type": "integer"
1656
+ },
1657
+ "7": {
1658
+ "type": "integer"
1659
+ },
1660
+ "8": {
1661
+ "type": "integer"
1662
+ },
1663
+ "9": {
1664
+ "type": "integer"
1665
+ }
1666
+ },
1667
+ "additionalProperties": false
1668
+ }
1669
+ },
1670
+ "additionalProperties": false
1671
+ },
1672
+ "optionalfeatureProgression": {
1673
+ "$ref": "../util.json#/$defs/optionalfeatureProgression"
1674
+ },
1675
+ "classFeatures": {
1676
+ "type": "array",
1677
+ "description": "Format: \" name | className | classSource | level | source \" , PHB is assumed as classSource and featureSource is assumed to be the same as classSource.",
1678
+ "items": {
1679
+ "oneOf": [
1680
+ {
1681
+ "type": "string"
1682
+ },
1683
+ {
1684
+ "type": "object",
1685
+ "properties": {
1686
+ "classFeature": {
1687
+ "type": "string"
1688
+ },
1689
+ "gainSubclassFeature": {
1690
+ "type": "boolean"
1691
+ }
1692
+ },
1693
+ "required": [
1694
+ "classFeature"
1695
+ ]
1696
+ }
1697
+ ]
1698
+ }
1699
+ },
1700
+ "subclassTitle": {
1701
+ "type": "string"
1702
+ },
1703
+ "page": {
1704
+ "$ref": "../util.json#/$defs/page"
1705
+ },
1706
+ "fluff": {
1707
+ "type": "array",
1708
+ "items": {
1709
+ "type": "object",
1710
+ "properties": {
1711
+ "name": {
1712
+ "type": "string"
1713
+ },
1714
+ "entries": {
1715
+ "type": "array",
1716
+ "items": {
1717
+ "$ref": "../entry.json"
1718
+ }
1719
+ },
1720
+ "page": {
1721
+ "$ref": "../util.json#/$defs/page"
1722
+ },
1723
+ "source": {
1724
+ "$ref": "../util.json#/$defs/source"
1725
+ },
1726
+ "type": {
1727
+ "type": "string"
1728
+ }
1729
+ },
1730
+ "required": [
1731
+ "entries",
1732
+ "source"
1733
+ ],
1734
+ "additionalProperties": false
1735
+ }
1736
+ },
1737
+ "additionalSpells": {
1738
+ "$ref": "../util.json#/$defs/additionalSpellsArray"
1739
+ }
1740
+ },
1741
+ "additionalProperties": false
1742
+ }
1743
+ },
1744
+ "properties": {
1745
+ "_meta": {
1746
+ "$ref": "../util.json#/$defs/metaBlock"
1747
+ },
1748
+ "class": {
1749
+ "type": "array",
1750
+ "items": {
1751
+ "$ref": "#/$defs/class"
1752
+ },
1753
+ "minItems": 1,
1754
+ "uniqueItems": true
1755
+ },
1756
+ "subclass": {
1757
+ "type": "array",
1758
+ "items": {
1759
+ "$ref": "#/$defs/subclass"
1760
+ },
1761
+ "minItems": 1,
1762
+ "uniqueItems": true
1763
+ },
1764
+ "classFeature": {
1765
+ "type": "array",
1766
+ "items": {
1767
+ "$ref": "#/$defs/classFeature"
1768
+ },
1769
+ "minItems": 1,
1770
+ "uniqueItems": true
1771
+ },
1772
+ "subclassFeature": {
1773
+ "type": "array",
1774
+ "items": {
1775
+ "$ref": "#/$defs/subclassFeature"
1776
+ },
1777
+ "minItems": 1,
1778
+ "uniqueItems": true
1779
+ }
1780
+ },
1781
+ "additionalProperties": false
1782
+ }