optolith-database-schema 0.1.28 → 0.2.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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,15 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
4
4
 
5
+ ## [0.2.0](https://github.com/elyukai/optolith-database-schema/compare/v0.1.28...v0.2.0) (2022-03-29)
6
+
7
+
8
+ ### ⚠ BREAKING CHANGES
9
+
10
+ * derived select options are not a list anymore
11
+
12
+ * derived select options are not a list anymore ([fa64a60](https://github.com/elyukai/optolith-database-schema/commit/fa64a60670f0cdf5567a168f3a4eccd7ea71d367))
13
+
5
14
  ### [0.1.28](https://github.com/elyukai/optolith-database-schema/compare/v0.1.27...v0.1.28) (2022-03-25)
6
15
 
7
16
 
@@ -6,7 +6,7 @@ import { DisplayOption } from "./prerequisites/DisplayOption.js";
6
6
  import { Errata } from "./source/_Erratum.js";
7
7
  import { PublicationRefs } from "./source/_PublicationRef.js";
8
8
  import { Duration } from "./_ActivatableSkill.js";
9
- import { ActivatableIdentifier, AdvancedSpecialAbilityRestrictedOptionIdentifier, CombatRelatedSpecialAbilityIdentifier, CombatTechniqueIdentifier, MagicalTraditionIdentifier, PatronIdentifier, VolumePointsOptionReferenceIdentifier } from "./_Identifier.js";
9
+ import { ActivatableIdentifier, AdvancedSpecialAbilityRestrictedOptionIdentifier, CombatRelatedSpecialAbilityIdentifier, CombatTechniqueIdentifier, CombatTechniqueTag, MagicalTraditionIdentifier, PatronIdentifier, SkillIdentifier, SkillWithEnhancementsTag, VolumePointsOptionReferenceIdentifier } from "./_Identifier.js";
10
10
  import { GeneralPrerequisites } from "./_Prerequisite.js";
11
11
  /**
12
12
  * The activatable entry's identifier. An unique, increasing integer.
@@ -62,13 +62,13 @@ export declare type Maximum = number;
62
62
  */
63
63
  export declare type SelectOptions = {
64
64
  /**
65
- * A list of categories with optional further configuration. All available
65
+ * An entry category with optional further configuration. All available
66
66
  * entries from the specified categories will be included as separate select
67
67
  * options. You can also specify a set of groups that should only be
68
68
  * included. Groups not mentioned will be excluded then.
69
69
  * @minItems 1
70
70
  */
71
- derived?: CategoryOption[];
71
+ derived?: CategoryOption;
72
72
  /**
73
73
  * A list of explicit select options. If the identifier has a specific type,
74
74
  * its entry is the base of this select option, where values defined here
@@ -204,107 +204,146 @@ declare type CategoryOption = {
204
204
  } | {
205
205
  tag: "Skills";
206
206
  /**
207
- * Only include entries of the specified groups.
207
+ * A list of skill categories.
208
208
  * @minItems 1
209
209
  */
210
- groups?: {
210
+ categories: ({
211
+ tag: "Skills";
211
212
  /**
212
- * The skill group's identifier.
213
- * @integer
214
- * @minimum 1
215
- * @maximum 5
216
- */
217
- id: number;
218
- }[];
219
- /**
220
- * Only include (`Intersection`) or exclude (`Difference`) specific skills.
221
- */
222
- specific?: {
223
- operation: {
224
- tag: "Intersection";
225
- } | {
226
- tag: "Difference";
227
- };
228
- /**
229
- * The list of specific skills.
213
+ * Only include entries of the specified groups.
230
214
  * @minItems 1
231
- * @uniqueItems
232
215
  */
233
- list: {
216
+ groups?: {
234
217
  /**
235
- * The skill's identifier.
218
+ * The skill group's identifier.
236
219
  * @integer
237
220
  * @minimum 1
238
- * @maximum 59
221
+ * @maximum 5
239
222
  */
240
223
  id: number;
241
224
  }[];
242
- };
243
- /**
244
- * Registers new applications, which get enabled once this entry is
245
- * activated with its respective select option. It specifies an entry-unique
246
- * identifier, the skill it belongs to is derived from the select option
247
- * automatically. A translation can be left out if its name equals the name
248
- * of the origin entry.
249
- * @minItems 1
250
- */
251
- skill_applications?: {
252
225
  /**
253
- * The application's identifier. An entry-unique, increasing integer.
254
- * @integer
255
- * @minimum 1
226
+ * Only include (`Intersection`) or exclude (`Difference`) specific
227
+ * skills.
256
228
  */
257
- id: number;
229
+ specific?: {
230
+ operation: {
231
+ tag: "Intersection";
232
+ } | {
233
+ tag: "Difference";
234
+ };
235
+ /**
236
+ * The list of specific skills.
237
+ * @minItems 1
238
+ * @uniqueItems
239
+ */
240
+ list: {
241
+ /**
242
+ * The skill's identifier.
243
+ * @integer
244
+ * @minimum 1
245
+ * @maximum 59
246
+ */
247
+ id: number;
248
+ }[];
249
+ };
258
250
  /**
259
- * All translations for the entry, identified by IETF language tag (BCP47).
260
- * @minProperties 1
251
+ * Registers new applications, which get enabled once this entry is
252
+ * activated with its respective select option. It specifies an
253
+ * entry-unique identifier, the skill it belongs to is derived from the
254
+ * select option automatically. A translation can be left out if its
255
+ * name equals the name of the origin entry.
256
+ * @minItems 1
261
257
  */
262
- translations?: {
258
+ skill_applications?: {
263
259
  /**
264
- * @patternProperties ^[a-z]{2}-[A-Z]{2}$
260
+ * The application's identifier. An entry-unique, increasing integer.
261
+ * @integer
262
+ * @minimum 1
265
263
  */
266
- [localeId: string]: {
264
+ id: number;
265
+ /**
266
+ * All translations for the entry, identified by IETF language tag
267
+ * (BCP47).
268
+ * @minProperties 1
269
+ */
270
+ translations?: {
267
271
  /**
268
- * The name of the application if different from the activatable entry's
269
- * name.
270
- * @minLength 1
272
+ * @patternProperties ^[a-z]{2}-[A-Z]{2}$
271
273
  */
272
- name: string;
274
+ [localeId: string]: {
275
+ /**
276
+ * The name of the application if different from the activatable
277
+ * entry's
278
+ * name.
279
+ * @minLength 1
280
+ */
281
+ name: string;
282
+ };
273
283
  };
274
- };
275
- }[];
276
- /**
277
- * Registers uses, which get enabled once this entry is activated with its
278
- * respective select option. It specifies an entry-unique identifier, the
279
- * skill it belongs to is derived from the select option automatically. A
280
- * translation can be left out if its name equals the name of the origin
281
- * entry.
282
- * @minItems 1
283
- */
284
- skill_uses?: {
284
+ }[];
285
285
  /**
286
- * The use's identifier. An entry-unique, increasing integer.
287
- * @integer
288
- * @minimum 1
286
+ * Registers uses, which get enabled once this entry is activated with
287
+ * its respective select option. It specifies an entry-unique
288
+ * identifier, the skill it belongs to is derived from the select option
289
+ * automatically. A translation can be left out if its name equals the
290
+ * name of the origin entry.
291
+ * @minItems 1
289
292
  */
290
- id: number;
293
+ skill_uses?: {
294
+ /**
295
+ * The use's identifier. An entry-unique, increasing integer.
296
+ * @integer
297
+ * @minimum 1
298
+ */
299
+ id: number;
300
+ /**
301
+ * All translations for the entry, identified by IETF language tag
302
+ * (BCP47).
303
+ * @minProperties 1
304
+ */
305
+ translations?: {
306
+ /**
307
+ * @patternProperties ^[a-z]{2}-[A-Z]{2}$
308
+ */
309
+ [localeId: string]: {
310
+ /**
311
+ * The name of the use if different from the activatable entry's
312
+ * name.
313
+ * @minLength 1
314
+ */
315
+ name: string;
316
+ };
317
+ };
318
+ }[];
319
+ } | {
320
+ tag: SkillWithEnhancementsTag;
291
321
  /**
292
- * All translations for the entry, identified by IETF language tag (BCP47).
293
- * @minProperties 1
322
+ * Only include (`Intersection`) or exclude (`Difference`) specific
323
+ * entries.
294
324
  */
295
- translations?: {
325
+ specific?: {
326
+ operation: {
327
+ tag: "Intersection";
328
+ } | {
329
+ tag: "Difference";
330
+ };
296
331
  /**
297
- * @patternProperties ^[a-z]{2}-[A-Z]{2}$
332
+ * The list of specific entries.
333
+ * @minItems 1
334
+ * @uniqueItems
298
335
  */
299
- [localeId: string]: {
336
+ list: {
300
337
  /**
301
- * The name of the use if different from the activatable entry's name.
302
- * @minLength 1
338
+ * The entry's identifier.
339
+ * @integer
340
+ * @minimum 1
341
+ * @maximum 59
303
342
  */
304
- name: string;
305
- };
343
+ id: number;
344
+ }[];
306
345
  };
307
- }[];
346
+ })[];
308
347
  /**
309
348
  * Generate prerequisites for each entry of the category.
310
349
  * @minItems 1
@@ -313,51 +352,51 @@ declare type CategoryOption = {
313
352
  /**
314
353
  * Generate AP values for each entry.
315
354
  */
316
- ap_value?: OptionSkillDeriveAdventurePointsValue;
317
- } | {
318
- tag: NonSkillSkillCategory;
319
- /**
320
- * Only include (`Intersection`) or exclude (`Difference`) specific entries.
321
- */
322
- specific?: {
323
- operation: {
324
- tag: "Intersection";
325
- } | {
326
- tag: "Difference";
327
- };
355
+ ap_value?: OptionSkillDeriveAdventurePointsValue<SkillIdentifier> | {
356
+ tag: "CombatTechniques";
328
357
  /**
329
- * The list of specific entries.
358
+ * A list of combat technique categories.
330
359
  * @minItems 1
331
- * @uniqueItems
332
360
  */
333
- list: {
361
+ categories: {
362
+ tag: CombatTechniqueTag;
334
363
  /**
335
- * The entry's identifier.
336
- * @integer
337
- * @minimum 1
338
- * @maximum 59
364
+ * Only include (`Intersection`) or exclude (`Difference`) specific
365
+ * entries.
339
366
  */
340
- id: number;
367
+ specific?: {
368
+ operation: {
369
+ tag: "Intersection";
370
+ } | {
371
+ tag: "Difference";
372
+ };
373
+ /**
374
+ * The list of specific entries.
375
+ * @minItems 1
376
+ * @uniqueItems
377
+ */
378
+ list: {
379
+ /**
380
+ * The entry's identifier.
381
+ * @integer
382
+ * @minimum 1
383
+ * @maximum 59
384
+ */
385
+ id: number;
386
+ }[];
387
+ };
341
388
  }[];
389
+ /**
390
+ * Generate prerequisites for each entry of the category.
391
+ * @minItems 1
392
+ */
393
+ prerequisites?: (OptionSkillSelfPrerequisite | OptionOptionPrerequisite)[];
394
+ /**
395
+ * Generate AP values for each entry.
396
+ */
397
+ ap_value?: OptionSkillDeriveAdventurePointsValue<CombatTechniqueIdentifier>;
342
398
  };
343
- /**
344
- * Generate prerequisites for each entry of the category.
345
- * @minItems 1
346
- */
347
- prerequisites?: (OptionSkillSelfPrerequisite | OptionOptionPrerequisite)[];
348
- /**
349
- * Generate AP values for each entry.
350
- */
351
- ap_value?: OptionSkillDeriveAdventurePointsValue;
352
399
  };
353
- declare enum NonSkillSkillCategory {
354
- CloseCombatTechniques = "CloseCombatTechniques",
355
- RangedCombatTechniques = "RangedCombatTechniques",
356
- LiturgicalChants = "LiturgicalChants",
357
- Ceremonies = "Ceremonies",
358
- Spells = "Spells",
359
- Rituals = "Rituals"
360
- }
361
400
  declare type OptionSkillSelfPrerequisite = {
362
401
  tag: "Self";
363
402
  /**
@@ -390,7 +429,7 @@ declare type OptionOptionPrerequisite = {
390
429
  /**
391
430
  * Generate AP values for each entry.
392
431
  */
393
- declare type OptionSkillDeriveAdventurePointsValue = {
432
+ declare type OptionSkillDeriveAdventurePointsValue<Identifier> = {
394
433
  tag: "DerivedFromImprovementCost";
395
434
  /**
396
435
  * This number is multiplied with the improvement cost of the entry
@@ -410,7 +449,7 @@ declare type OptionSkillDeriveAdventurePointsValue = {
410
449
  * @integer
411
450
  * @minimum 1
412
451
  */
413
- id: number;
452
+ id: Identifier;
414
453
  /**
415
454
  * The AP value for the specified entry.
416
455
  * @integer
@@ -2,15 +2,6 @@
2
2
  * General type specifications used by multiple activatable entries.
3
3
  * @title Activatable
4
4
  */
5
- var NonSkillSkillCategory;
6
- (function (NonSkillSkillCategory) {
7
- NonSkillSkillCategory["CloseCombatTechniques"] = "CloseCombatTechniques";
8
- NonSkillSkillCategory["RangedCombatTechniques"] = "RangedCombatTechniques";
9
- NonSkillSkillCategory["LiturgicalChants"] = "LiturgicalChants";
10
- NonSkillSkillCategory["Ceremonies"] = "Ceremonies";
11
- NonSkillSkillCategory["Spells"] = "Spells";
12
- NonSkillSkillCategory["Rituals"] = "Rituals";
13
- })(NonSkillSkillCategory || (NonSkillSkillCategory = {}));
14
5
  export {};
15
6
  // "Input": {
16
7
  // "description": "A string that is used as a placeholder text for an input field.",
@@ -108,6 +108,13 @@ declare enum RatedTag {
108
108
  LiturgicalChant = "LiturgicalChant",
109
109
  Ceremony = "Ceremony"
110
110
  }
111
+ declare enum SkillTag {
112
+ Skill = "Skill",
113
+ Spell = "Spell",
114
+ Ritual = "Ritual",
115
+ LiturgicalChant = "LiturgicalChant",
116
+ Ceremony = "Ceremony"
117
+ }
111
118
  declare enum AdvancedSpecialAbilityRestrictedOptionTag {
112
119
  General = "General",
113
120
  Skill = "Skill",
@@ -117,7 +124,7 @@ declare enum VolumePointsOptionReferenceTag {
117
124
  General = "General",
118
125
  AnimalShapeSize = "AnimalShapeSize"
119
126
  }
120
- declare enum CombatTechniqueTag {
127
+ export declare enum CombatTechniqueTag {
121
128
  CloseCombatTechnique = "CloseCombatTechnique",
122
129
  RangedCombatTechnique = "RangedCombatTechnique"
123
130
  }
@@ -131,7 +138,7 @@ declare enum ExtensionRuleTag {
131
138
  FocusRule = "FocusRule",
132
139
  OptionalRule = "OptionalRule"
133
140
  }
134
- declare enum SkillWithEnhancementsTag {
141
+ export declare enum SkillWithEnhancementsTag {
135
142
  Spell = "Spell",
136
143
  Ritual = "Ritual",
137
144
  LiturgicalChant = "LiturgicalChant",
@@ -183,6 +190,7 @@ export declare type ActivatableIdentifier = TaggedIdentifier<ActivatableTag>;
183
190
  export declare type SpecialAbilityIdentifier = TaggedIdentifier<SpecialAbilityTag>;
184
191
  export declare type CombatRelatedSpecialAbilityIdentifier = TaggedIdentifier<CombatRelatedSpecialAbilityTag>;
185
192
  export declare type RatedIdentifier = TaggedIdentifier<RatedTag>;
193
+ export declare type SkillIdentifier = TaggedIdentifier<SkillTag>;
186
194
  export declare type AdvancedSpecialAbilityRestrictedOptionIdentifier = TaggedIdentifier<AdvancedSpecialAbilityRestrictedOptionTag>;
187
195
  export declare type VolumePointsOptionReferenceIdentifier = TaggedIdentifier<VolumePointsOptionReferenceTag>;
188
196
  export declare type CombatTechniqueIdentifier = TaggedIdentifier<CombatTechniqueTag>;
@@ -112,6 +112,14 @@ var RatedTag;
112
112
  RatedTag["LiturgicalChant"] = "LiturgicalChant";
113
113
  RatedTag["Ceremony"] = "Ceremony";
114
114
  })(RatedTag || (RatedTag = {}));
115
+ var SkillTag;
116
+ (function (SkillTag) {
117
+ SkillTag["Skill"] = "Skill";
118
+ SkillTag["Spell"] = "Spell";
119
+ SkillTag["Ritual"] = "Ritual";
120
+ SkillTag["LiturgicalChant"] = "LiturgicalChant";
121
+ SkillTag["Ceremony"] = "Ceremony";
122
+ })(SkillTag || (SkillTag = {}));
115
123
  var AdvancedSpecialAbilityRestrictedOptionTag;
116
124
  (function (AdvancedSpecialAbilityRestrictedOptionTag) {
117
125
  AdvancedSpecialAbilityRestrictedOptionTag["General"] = "General";
@@ -123,7 +131,7 @@ var VolumePointsOptionReferenceTag;
123
131
  VolumePointsOptionReferenceTag["General"] = "General";
124
132
  VolumePointsOptionReferenceTag["AnimalShapeSize"] = "AnimalShapeSize";
125
133
  })(VolumePointsOptionReferenceTag || (VolumePointsOptionReferenceTag = {}));
126
- var CombatTechniqueTag;
134
+ export var CombatTechniqueTag;
127
135
  (function (CombatTechniqueTag) {
128
136
  CombatTechniqueTag["CloseCombatTechnique"] = "CloseCombatTechnique";
129
137
  CombatTechniqueTag["RangedCombatTechnique"] = "RangedCombatTechnique";
@@ -141,7 +149,7 @@ var ExtensionRuleTag;
141
149
  ExtensionRuleTag["FocusRule"] = "FocusRule";
142
150
  ExtensionRuleTag["OptionalRule"] = "OptionalRule";
143
151
  })(ExtensionRuleTag || (ExtensionRuleTag = {}));
144
- var SkillWithEnhancementsTag;
152
+ export var SkillWithEnhancementsTag;
145
153
  (function (SkillWithEnhancementsTag) {
146
154
  SkillWithEnhancementsTag["Spell"] = "Spell";
147
155
  SkillWithEnhancementsTag["Ritual"] = "Ritual";
@@ -186,4 +194,3 @@ var CoreRuleDerivableContentTag;
186
194
  CoreRuleDerivableContentTag["MagicalSpecialAbility"] = "MagicalSpecialAbility";
187
195
  CoreRuleDerivableContentTag["BlessedTradition"] = "BlessedTradition";
188
196
  })(CoreRuleDerivableContentTag || (CoreRuleDerivableContentTag = {}));
189
- export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "optolith-database-schema",
3
- "version": "0.1.28",
3
+ "version": "0.2.0",
4
4
  "description": "Definitions and utilities for the flat-file database of Optolith, a character creation tool for the Pen and Paper RPG “The Dark Eye 5”, and its external integrations into other software.",
5
5
  "keywords": [
6
6
  "tde",
@@ -32,12 +32,8 @@
32
32
  "type": "object",
33
33
  "properties": {
34
34
  "derived": {
35
- "description": "A list of categories with optional further configuration. All available\nentries from the specified categories will be included as separate select\noptions. You can also specify a set of groups that should only be\nincluded. Groups not mentioned will be excluded then.",
36
- "type": "array",
37
- "items": {
38
- "$ref": "#/definitions/CategoryOption"
39
- },
40
- "minItems": 1
35
+ "description": "An entry category with optional further configuration. All available\nentries from the specified categories will be included as separate select\noptions. You can also specify a set of groups that should only be\nincluded. Groups not mentioned will be excluded then.",
36
+ "$ref": "#/definitions/CategoryOption"
41
37
  },
42
38
  "explicit": {
43
39
  "description": "A list of explicit select options. If the identifier has a specific type,\nits entry is the base of this select option, where values defined here\noverride values from the base. Define the `src` property if the options\nare not derived from the rules text of the advantage/disadvantage/special\nability but instead are listed in a separate block and/or on a separate\npage.",
@@ -359,165 +355,258 @@
359
355
  "tag": {
360
356
  "const": "Skills"
361
357
  },
362
- "groups": {
363
- "description": "Only include entries of the specified groups.",
358
+ "categories": {
359
+ "description": "A list of skill categories.",
364
360
  "type": "array",
365
361
  "items": {
366
- "type": "object",
367
- "properties": {
368
- "id": {
369
- "description": "The skill group's identifier.",
370
- "type": "integer",
371
- "maximum": 5,
372
- "minimum": 1
373
- }
374
- },
375
- "required": [
376
- "id"
377
- ],
378
- "additionalProperties": false
379
- },
380
- "minItems": 1
381
- },
382
- "specific": {
383
- "description": "Only include (`Intersection`) or exclude (`Difference`) specific skills.",
384
- "type": "object",
385
- "properties": {
386
- "operation": {
387
- "oneOf": [
388
- {
389
- "type": "object",
390
- "properties": {
391
- "tag": {
392
- "const": "Intersection"
393
- }
394
- },
395
- "required": [
396
- "tag"
397
- ],
398
- "additionalProperties": false
399
- },
400
- {
401
- "type": "object",
402
- "properties": {
403
- "tag": {
404
- "const": "Difference"
405
- }
406
- },
407
- "required": [
408
- "tag"
409
- ],
410
- "additionalProperties": false
411
- }
412
- ]
413
- },
414
- "list": {
415
- "description": "The list of specific skills.",
416
- "type": "array",
417
- "items": {
362
+ "oneOf": [
363
+ {
418
364
  "type": "object",
419
365
  "properties": {
420
- "id": {
421
- "description": "The skill's identifier.",
422
- "type": "integer",
423
- "maximum": 59,
424
- "minimum": 1
425
- }
426
- },
427
- "required": [
428
- "id"
429
- ],
430
- "additionalProperties": false
431
- },
432
- "minItems": 1,
433
- "uniqueItems": true
434
- }
435
- },
436
- "required": [
437
- "operation",
438
- "list"
439
- ],
440
- "additionalProperties": false
441
- },
442
- "skill_applications": {
443
- "description": "Registers new applications, which get enabled once this entry is\nactivated with its respective select option. It specifies an entry-unique\nidentifier, the skill it belongs to is derived from the select option\nautomatically. A translation can be left out if its name equals the name\nof the origin entry.",
444
- "type": "array",
445
- "items": {
446
- "type": "object",
447
- "properties": {
448
- "id": {
449
- "description": "The application's identifier. An entry-unique, increasing integer.",
450
- "type": "integer",
451
- "minimum": 1
452
- },
453
- "translations": {
454
- "description": "All translations for the entry, identified by IETF language tag (BCP47).",
455
- "type": "object",
456
- "patternProperties": {
457
- "^[a-z]{2}-[A-Z]{2}$": {
366
+ "tag": {
367
+ "const": "Skills"
368
+ },
369
+ "groups": {
370
+ "description": "Only include entries of the specified groups.",
371
+ "type": "array",
372
+ "items": {
373
+ "type": "object",
374
+ "properties": {
375
+ "id": {
376
+ "description": "The skill group's identifier.",
377
+ "type": "integer",
378
+ "maximum": 5,
379
+ "minimum": 1
380
+ }
381
+ },
382
+ "required": [
383
+ "id"
384
+ ],
385
+ "additionalProperties": false
386
+ },
387
+ "minItems": 1
388
+ },
389
+ "specific": {
390
+ "description": "Only include (`Intersection`) or exclude (`Difference`) specific\nskills.",
458
391
  "type": "object",
459
392
  "properties": {
460
- "name": {
461
- "description": "The name of the application if different from the activatable entry's\nname.",
462
- "type": "string",
463
- "minLength": 1
393
+ "operation": {
394
+ "oneOf": [
395
+ {
396
+ "type": "object",
397
+ "properties": {
398
+ "tag": {
399
+ "const": "Intersection"
400
+ }
401
+ },
402
+ "required": [
403
+ "tag"
404
+ ],
405
+ "additionalProperties": false
406
+ },
407
+ {
408
+ "type": "object",
409
+ "properties": {
410
+ "tag": {
411
+ "const": "Difference"
412
+ }
413
+ },
414
+ "required": [
415
+ "tag"
416
+ ],
417
+ "additionalProperties": false
418
+ }
419
+ ]
420
+ },
421
+ "list": {
422
+ "description": "The list of specific skills.",
423
+ "type": "array",
424
+ "items": {
425
+ "type": "object",
426
+ "properties": {
427
+ "id": {
428
+ "description": "The skill's identifier.",
429
+ "type": "integer",
430
+ "maximum": 59,
431
+ "minimum": 1
432
+ }
433
+ },
434
+ "required": [
435
+ "id"
436
+ ],
437
+ "additionalProperties": false
438
+ },
439
+ "minItems": 1,
440
+ "uniqueItems": true
464
441
  }
465
442
  },
466
443
  "required": [
467
- "name"
444
+ "operation",
445
+ "list"
468
446
  ],
469
447
  "additionalProperties": false
448
+ },
449
+ "skill_applications": {
450
+ "description": "Registers new applications, which get enabled once this entry is\nactivated with its respective select option. It specifies an\nentry-unique identifier, the skill it belongs to is derived from the\nselect option automatically. A translation can be left out if its\nname equals the name of the origin entry.",
451
+ "type": "array",
452
+ "items": {
453
+ "type": "object",
454
+ "properties": {
455
+ "id": {
456
+ "description": "The application's identifier. An entry-unique, increasing integer.",
457
+ "type": "integer",
458
+ "minimum": 1
459
+ },
460
+ "translations": {
461
+ "description": "All translations for the entry, identified by IETF language tag\n(BCP47).",
462
+ "type": "object",
463
+ "patternProperties": {
464
+ "^[a-z]{2}-[A-Z]{2}$": {
465
+ "type": "object",
466
+ "properties": {
467
+ "name": {
468
+ "description": "The name of the application if different from the activatable\nentry's\nname.",
469
+ "type": "string",
470
+ "minLength": 1
471
+ }
472
+ },
473
+ "required": [
474
+ "name"
475
+ ],
476
+ "additionalProperties": false
477
+ }
478
+ },
479
+ "minProperties": 1,
480
+ "additionalProperties": false
481
+ }
482
+ },
483
+ "required": [
484
+ "id"
485
+ ],
486
+ "additionalProperties": false
487
+ },
488
+ "minItems": 1
489
+ },
490
+ "skill_uses": {
491
+ "description": "Registers uses, which get enabled once this entry is activated with\nits respective select option. It specifies an entry-unique\nidentifier, the skill it belongs to is derived from the select option\nautomatically. A translation can be left out if its name equals the\nname of the origin entry.",
492
+ "type": "array",
493
+ "items": {
494
+ "type": "object",
495
+ "properties": {
496
+ "id": {
497
+ "description": "The use's identifier. An entry-unique, increasing integer.",
498
+ "type": "integer",
499
+ "minimum": 1
500
+ },
501
+ "translations": {
502
+ "description": "All translations for the entry, identified by IETF language tag\n(BCP47).",
503
+ "type": "object",
504
+ "patternProperties": {
505
+ "^[a-z]{2}-[A-Z]{2}$": {
506
+ "type": "object",
507
+ "properties": {
508
+ "name": {
509
+ "description": "The name of the use if different from the activatable entry's\nname.",
510
+ "type": "string",
511
+ "minLength": 1
512
+ }
513
+ },
514
+ "required": [
515
+ "name"
516
+ ],
517
+ "additionalProperties": false
518
+ }
519
+ },
520
+ "minProperties": 1,
521
+ "additionalProperties": false
522
+ }
523
+ },
524
+ "required": [
525
+ "id"
526
+ ],
527
+ "additionalProperties": false
528
+ },
529
+ "minItems": 1
470
530
  }
471
531
  },
472
- "minProperties": 1,
532
+ "required": [
533
+ "tag"
534
+ ],
473
535
  "additionalProperties": false
474
- }
475
- },
476
- "required": [
477
- "id"
478
- ],
479
- "additionalProperties": false
480
- },
481
- "minItems": 1
482
- },
483
- "skill_uses": {
484
- "description": "Registers uses, which get enabled once this entry is activated with its\nrespective select option. It specifies an entry-unique identifier, the\nskill it belongs to is derived from the select option automatically. A\ntranslation can be left out if its name equals the name of the origin\nentry.",
485
- "type": "array",
486
- "items": {
487
- "type": "object",
488
- "properties": {
489
- "id": {
490
- "description": "The use's identifier. An entry-unique, increasing integer.",
491
- "type": "integer",
492
- "minimum": 1
493
536
  },
494
- "translations": {
495
- "description": "All translations for the entry, identified by IETF language tag (BCP47).",
537
+ {
496
538
  "type": "object",
497
- "patternProperties": {
498
- "^[a-z]{2}-[A-Z]{2}$": {
539
+ "properties": {
540
+ "tag": {
541
+ "$ref": "./_Identifier.schema.json#/definitions/SkillWithEnhancementsTag"
542
+ },
543
+ "specific": {
544
+ "description": "Only include (`Intersection`) or exclude (`Difference`) specific\nentries.",
499
545
  "type": "object",
500
546
  "properties": {
501
- "name": {
502
- "description": "The name of the use if different from the activatable entry's name.",
503
- "type": "string",
504
- "minLength": 1
547
+ "operation": {
548
+ "oneOf": [
549
+ {
550
+ "type": "object",
551
+ "properties": {
552
+ "tag": {
553
+ "const": "Intersection"
554
+ }
555
+ },
556
+ "required": [
557
+ "tag"
558
+ ],
559
+ "additionalProperties": false
560
+ },
561
+ {
562
+ "type": "object",
563
+ "properties": {
564
+ "tag": {
565
+ "const": "Difference"
566
+ }
567
+ },
568
+ "required": [
569
+ "tag"
570
+ ],
571
+ "additionalProperties": false
572
+ }
573
+ ]
574
+ },
575
+ "list": {
576
+ "description": "The list of specific entries.",
577
+ "type": "array",
578
+ "items": {
579
+ "type": "object",
580
+ "properties": {
581
+ "id": {
582
+ "description": "The entry's identifier.",
583
+ "type": "integer",
584
+ "maximum": 59,
585
+ "minimum": 1
586
+ }
587
+ },
588
+ "required": [
589
+ "id"
590
+ ],
591
+ "additionalProperties": false
592
+ },
593
+ "minItems": 1,
594
+ "uniqueItems": true
505
595
  }
506
596
  },
507
597
  "required": [
508
- "name"
598
+ "operation",
599
+ "list"
509
600
  ],
510
601
  "additionalProperties": false
511
602
  }
512
603
  },
513
- "minProperties": 1,
604
+ "required": [
605
+ "tag"
606
+ ],
514
607
  "additionalProperties": false
515
608
  }
516
- },
517
- "required": [
518
- "id"
519
- ],
520
- "additionalProperties": false
609
+ ]
521
610
  },
522
611
  "minItems": 1
523
612
  },
@@ -538,31 +627,20 @@
538
627
  },
539
628
  "ap_value": {
540
629
  "description": "Generate AP values for each entry.",
541
- "$ref": "#/definitions/OptionSkillDeriveAdventurePointsValue"
542
- }
543
- },
544
- "required": [
545
- "tag"
546
- ],
547
- "additionalProperties": false
548
- },
549
- {
550
- "type": "object",
551
- "properties": {
552
- "tag": {
553
- "$ref": "#/definitions/NonSkillSkillCategory"
554
- },
555
- "specific": {
556
- "description": "Only include (`Intersection`) or exclude (`Difference`) specific entries.",
557
- "type": "object",
558
- "properties": {
559
- "operation": {
630
+ "oneOf": [
631
+ {
632
+ "description": "Generate AP values for each entry.",
560
633
  "oneOf": [
561
634
  {
562
635
  "type": "object",
563
636
  "properties": {
564
637
  "tag": {
565
- "const": "Intersection"
638
+ "const": "DerivedFromImprovementCost"
639
+ },
640
+ "multiplier": {
641
+ "description": "This number is multiplied with the improvement cost of the entry\n(A = 1 to D = 4).",
642
+ "type": "integer",
643
+ "minimum": 2
566
644
  }
567
645
  },
568
646
  "required": [
@@ -574,81 +652,224 @@
574
652
  "type": "object",
575
653
  "properties": {
576
654
  "tag": {
577
- "const": "Difference"
655
+ "const": "Fixed"
656
+ },
657
+ "map": {
658
+ "description": "A mapping of skill identifiers to their specific AP values.",
659
+ "type": "array",
660
+ "items": {
661
+ "type": "object",
662
+ "properties": {
663
+ "id": {
664
+ "$ref": "./_Identifier.schema.json#/definitions/SkillIdentifier"
665
+ },
666
+ "ap_value": {
667
+ "description": "The AP value for the specified entry.",
668
+ "type": "integer",
669
+ "minimum": 1
670
+ }
671
+ },
672
+ "required": [
673
+ "id",
674
+ "ap_value"
675
+ ],
676
+ "additionalProperties": false
677
+ }
678
+ },
679
+ "default": {
680
+ "description": "The default value of an entry. Used as a fallback if no value is\nfound in `list`.",
681
+ "type": "integer",
682
+ "minimum": 1
578
683
  }
579
684
  },
580
685
  "required": [
581
- "tag"
686
+ "tag",
687
+ "map",
688
+ "default"
582
689
  ],
583
690
  "additionalProperties": false
584
691
  }
585
692
  ]
586
693
  },
587
- "list": {
588
- "description": "The list of specific entries.",
589
- "type": "array",
590
- "items": {
591
- "type": "object",
592
- "properties": {
593
- "id": {
594
- "description": "The entry's identifier.",
595
- "type": "integer",
596
- "maximum": 59,
597
- "minimum": 1
598
- }
694
+ {
695
+ "type": "object",
696
+ "properties": {
697
+ "tag": {
698
+ "const": "CombatTechniques"
599
699
  },
600
- "required": [
601
- "id"
602
- ],
603
- "additionalProperties": false
700
+ "categories": {
701
+ "description": "A list of combat technique categories.",
702
+ "type": "array",
703
+ "items": {
704
+ "type": "object",
705
+ "properties": {
706
+ "tag": {
707
+ "$ref": "./_Identifier.schema.json#/definitions/CombatTechniqueTag"
708
+ },
709
+ "specific": {
710
+ "description": "Only include (`Intersection`) or exclude (`Difference`) specific\nentries.",
711
+ "type": "object",
712
+ "properties": {
713
+ "operation": {
714
+ "oneOf": [
715
+ {
716
+ "type": "object",
717
+ "properties": {
718
+ "tag": {
719
+ "const": "Intersection"
720
+ }
721
+ },
722
+ "required": [
723
+ "tag"
724
+ ],
725
+ "additionalProperties": false
726
+ },
727
+ {
728
+ "type": "object",
729
+ "properties": {
730
+ "tag": {
731
+ "const": "Difference"
732
+ }
733
+ },
734
+ "required": [
735
+ "tag"
736
+ ],
737
+ "additionalProperties": false
738
+ }
739
+ ]
740
+ },
741
+ "list": {
742
+ "description": "The list of specific entries.",
743
+ "type": "array",
744
+ "items": {
745
+ "type": "object",
746
+ "properties": {
747
+ "id": {
748
+ "description": "The entry's identifier.",
749
+ "type": "integer",
750
+ "maximum": 59,
751
+ "minimum": 1
752
+ }
753
+ },
754
+ "required": [
755
+ "id"
756
+ ],
757
+ "additionalProperties": false
758
+ },
759
+ "minItems": 1,
760
+ "uniqueItems": true
761
+ }
762
+ },
763
+ "required": [
764
+ "operation",
765
+ "list"
766
+ ],
767
+ "additionalProperties": false
768
+ }
769
+ },
770
+ "required": [
771
+ "tag"
772
+ ],
773
+ "additionalProperties": false
774
+ },
775
+ "minItems": 1
776
+ },
777
+ "prerequisites": {
778
+ "description": "Generate prerequisites for each entry of the category.",
779
+ "type": "array",
780
+ "items": {
781
+ "oneOf": [
782
+ {
783
+ "$ref": "#/definitions/OptionSkillSelfPrerequisite"
784
+ },
785
+ {
786
+ "$ref": "#/definitions/OptionOptionPrerequisite"
787
+ }
788
+ ]
789
+ },
790
+ "minItems": 1
791
+ },
792
+ "ap_value": {
793
+ "description": "Generate AP values for each entry.",
794
+ "oneOf": [
795
+ {
796
+ "type": "object",
797
+ "properties": {
798
+ "tag": {
799
+ "const": "DerivedFromImprovementCost"
800
+ },
801
+ "multiplier": {
802
+ "description": "This number is multiplied with the improvement cost of the entry\n(A = 1 to D = 4).",
803
+ "type": "integer",
804
+ "minimum": 2
805
+ }
806
+ },
807
+ "required": [
808
+ "tag"
809
+ ],
810
+ "additionalProperties": false
811
+ },
812
+ {
813
+ "type": "object",
814
+ "properties": {
815
+ "tag": {
816
+ "const": "Fixed"
817
+ },
818
+ "map": {
819
+ "description": "A mapping of skill identifiers to their specific AP values.",
820
+ "type": "array",
821
+ "items": {
822
+ "type": "object",
823
+ "properties": {
824
+ "id": {
825
+ "$ref": "./_Identifier.schema.json#/definitions/CombatTechniqueIdentifier"
826
+ },
827
+ "ap_value": {
828
+ "description": "The AP value for the specified entry.",
829
+ "type": "integer",
830
+ "minimum": 1
831
+ }
832
+ },
833
+ "required": [
834
+ "id",
835
+ "ap_value"
836
+ ],
837
+ "additionalProperties": false
838
+ }
839
+ },
840
+ "default": {
841
+ "description": "The default value of an entry. Used as a fallback if no value is\nfound in `list`.",
842
+ "type": "integer",
843
+ "minimum": 1
844
+ }
845
+ },
846
+ "required": [
847
+ "tag",
848
+ "map",
849
+ "default"
850
+ ],
851
+ "additionalProperties": false
852
+ }
853
+ ]
854
+ }
604
855
  },
605
- "minItems": 1,
606
- "uniqueItems": true
856
+ "required": [
857
+ "tag",
858
+ "categories"
859
+ ],
860
+ "additionalProperties": false
607
861
  }
608
- },
609
- "required": [
610
- "operation",
611
- "list"
612
- ],
613
- "additionalProperties": false
614
- },
615
- "prerequisites": {
616
- "description": "Generate prerequisites for each entry of the category.",
617
- "type": "array",
618
- "items": {
619
- "oneOf": [
620
- {
621
- "$ref": "#/definitions/OptionSkillSelfPrerequisite"
622
- },
623
- {
624
- "$ref": "#/definitions/OptionOptionPrerequisite"
625
- }
626
- ]
627
- },
628
- "minItems": 1
629
- },
630
- "ap_value": {
631
- "description": "Generate AP values for each entry.",
632
- "$ref": "#/definitions/OptionSkillDeriveAdventurePointsValue"
862
+ ]
633
863
  }
634
864
  },
635
865
  "required": [
636
- "tag"
866
+ "tag",
867
+ "categories"
637
868
  ],
638
869
  "additionalProperties": false
639
870
  }
640
871
  ]
641
872
  },
642
- "NonSkillSkillCategory": {
643
- "enum": [
644
- "CloseCombatTechniques",
645
- "RangedCombatTechniques",
646
- "LiturgicalChants",
647
- "Ceremonies",
648
- "Spells",
649
- "Rituals"
650
- ]
651
- },
652
873
  "OptionSkillSelfPrerequisite": {
653
874
  "type": "object",
654
875
  "properties": {
@@ -695,71 +916,6 @@
695
916
  ],
696
917
  "additionalProperties": false
697
918
  },
698
- "OptionSkillDeriveAdventurePointsValue": {
699
- "description": "Generate AP values for each entry.",
700
- "oneOf": [
701
- {
702
- "type": "object",
703
- "properties": {
704
- "tag": {
705
- "const": "DerivedFromImprovementCost"
706
- },
707
- "multiplier": {
708
- "description": "This number is multiplied with the improvement cost of the entry\n(A = 1 to D = 4).",
709
- "type": "integer",
710
- "minimum": 2
711
- }
712
- },
713
- "required": [
714
- "tag"
715
- ],
716
- "additionalProperties": false
717
- },
718
- {
719
- "type": "object",
720
- "properties": {
721
- "tag": {
722
- "const": "Fixed"
723
- },
724
- "map": {
725
- "description": "A mapping of skill identifiers to their specific AP values.",
726
- "type": "array",
727
- "items": {
728
- "type": "object",
729
- "properties": {
730
- "id": {
731
- "description": "The skill's identifier.",
732
- "type": "integer",
733
- "minimum": 1
734
- },
735
- "ap_value": {
736
- "description": "The AP value for the specified entry.",
737
- "type": "integer",
738
- "minimum": 1
739
- }
740
- },
741
- "required": [
742
- "id",
743
- "ap_value"
744
- ],
745
- "additionalProperties": false
746
- }
747
- },
748
- "default": {
749
- "description": "The default value of an entry. Used as a fallback if no value is\nfound in `list`.",
750
- "type": "integer",
751
- "minimum": 1
752
- }
753
- },
754
- "required": [
755
- "tag",
756
- "map",
757
- "default"
758
- ],
759
- "additionalProperties": false
760
- }
761
- ]
762
- },
763
919
  "ExplicitOption": {
764
920
  "oneOf": [
765
921
  {
@@ -120,6 +120,15 @@
120
120
  "Ceremony"
121
121
  ]
122
122
  },
123
+ "SkillTag": {
124
+ "enum": [
125
+ "Skill",
126
+ "Spell",
127
+ "Ritual",
128
+ "LiturgicalChant",
129
+ "Ceremony"
130
+ ]
131
+ },
123
132
  "AdvancedSpecialAbilityRestrictedOptionTag": {
124
133
  "enum": [
125
134
  "General",
@@ -278,6 +287,24 @@
278
287
  ],
279
288
  "additionalProperties": false
280
289
  },
290
+ "SkillIdentifier": {
291
+ "type": "object",
292
+ "properties": {
293
+ "tag": {
294
+ "$ref": "#/definitions/SkillTag"
295
+ },
296
+ "value": {
297
+ "description": "The referenced entry's numeric identifier.",
298
+ "type": "integer",
299
+ "minimum": 1
300
+ }
301
+ },
302
+ "required": [
303
+ "tag",
304
+ "value"
305
+ ],
306
+ "additionalProperties": false
307
+ },
281
308
  "AdvancedSpecialAbilityRestrictedOptionIdentifier": {
282
309
  "type": "object",
283
310
  "properties": {