@optolith/database-schema 0.77.1 → 0.78.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,29 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines.
4
4
 
5
+ ## [0.78.0](https://github.com/Optolith/database-schema/compare/v0.77.1...v0.78.0) (2026-10-05)
6
+
7
+ ### ⚠ BREAKING CHANGES
8
+
9
+ * generalize special ability option selection for professions
10
+ * languages option with optional scripts inclusion
11
+ * missing magical action category translations
12
+ * some plant translations
13
+ * translation for empty profession variants
14
+
15
+ ### Features
16
+
17
+ * generalize special ability option selection for professions ([ef7d2c9](https://github.com/Optolith/database-schema/commit/ef7d2c9903f987720f173815e5454fdfa06b3a84))
18
+ * languages option with optional scripts inclusion ([31862d3](https://github.com/Optolith/database-schema/commit/31862d38d0027dae845f8b69218395c4307bf59d))
19
+ * optional different race and culture names within prerequisites ([5025e80](https://github.com/Optolith/database-schema/commit/5025e80131e41ad68aca9e51881f5ee08c23dad1))
20
+ * prepare activatable options validation ([d0c7e87](https://github.com/Optolith/database-schema/commit/d0c7e87e3ae9aac67aa4259e63ce8c9c51e1fb3e))
21
+ * some plant translations ([8f3fa6b](https://github.com/Optolith/database-schema/commit/8f3fa6ba1b569b9bcd3b355d01fd86c9fe287478))
22
+
23
+ ### Bug Fixes
24
+
25
+ * missing magical action category translations ([510d11b](https://github.com/Optolith/database-schema/commit/510d11bd9e98d478ec3e4ab37627496b3c8deec9))
26
+ * translation for empty profession variants ([8f63b30](https://github.com/Optolith/database-schema/commit/8f63b30e14508ee0f900626bdefafed1b2657078))
27
+
5
28
  ## [0.77.1](https://github.com/Optolith/database-schema/compare/v0.77.0...v0.77.1) (2026-10-03)
6
29
 
7
30
  ### Features
package/gen/types.d.ts CHANGED
@@ -413,6 +413,7 @@ export type EnumMap = {
413
413
  ProfessionPrerequisiteGroup: ProfessionPrerequisiteGroup
414
414
  ProfessionSpecialAbility: ProfessionSpecialAbility
415
415
  ProfessionSpecialAbilityIdentifier: ProfessionSpecialAbilityIdentifier
416
+ ProfessionSpecialAbilityOption: ProfessionSpecialAbilityOption
416
417
  PropertyDeclaration: PropertyDeclaration
417
418
  PublicationCategory: PublicationCategory
418
419
  PublicationPrerequisiteGroup: PublicationPrerequisiteGroup
@@ -840,6 +841,7 @@ export type TypeAliasMap = {
840
841
  ProfessionPrerequisite: ProfessionPrerequisite
841
842
  ProfessionPrerequisites: ProfessionPrerequisites
842
843
  ProfessionSpecialAbilitySelection: ProfessionSpecialAbilitySelection
844
+ ProfessionSpecialAbilitySelectionItem: ProfessionSpecialAbilitySelectionItem
843
845
  ProfessionSpellworkIdentifier: ProfessionSpellworkIdentifier
844
846
  ProfessionVariantPackageOptions: ProfessionVariantPackageOptions
845
847
  ProfessionVariantPrerequisites: ProfessionVariantPrerequisites
@@ -2026,6 +2028,9 @@ export interface Locale {
2026
2028
  "Animist Powers": string
2027
2029
  "Geode Rituals": string
2028
2030
  "Zibilja Rituals": string
2031
+ "Bannzeichen": string
2032
+ "Goblin Rituals": string
2033
+ "Magical Runes": string
2029
2034
  "Mod": string
2030
2035
  "Check Modifier": string
2031
2036
  "spells.traditions.general": string
@@ -2697,6 +2702,10 @@ export interface Locale {
2697
2702
  ".input {$count :number} {{check required every {$count}. application in the same month}}": string & { __params: { "count": number } }
2698
2703
  "see {$link}": string & { __params: { "link": string } }
2699
2704
  "CoD": string
2705
+ "Search Difficulty": string
2706
+ "Identification Difficulty": string
2707
+ "Plant Applications": string
2708
+ "Remedies and Traditions": string
2700
2709
  "Romance Novel": string
2701
2710
  "Poetry": string
2702
2711
  "Political Pamphlet": string
@@ -2789,6 +2798,8 @@ export interface Locale {
2789
2798
  "Variants": string
2790
2799
  "Languages and Literacy totaling {$apValue} AP": string & { __params: { "apValue": string } }
2791
2800
  "no Languages and Literacy totaling {$apValue} AP": string & { __params: { "apValue": string } }
2801
+ "Languages totaling {$apValue} AP": string & { __params: { "apValue": string } }
2802
+ "no Languages totaling {$apValue} AP": string & { __params: { "apValue": string } }
2792
2803
  "Skill Specialization {$possibleSkills}": string & { __params: { "possibleSkills": string } }
2793
2804
  "no Skill Specialization {$possibleSkills}": string & { __params: { "possibleSkills": string } }
2794
2805
  "Skill Specialization for a {$skillOfGroup}": string & { __params: { "skillOfGroup": string } }
@@ -2815,6 +2826,7 @@ export interface Locale {
2815
2826
  "except for {$list :list type=conjunction}": string & { __params: { "list": string[] } }
2816
2827
  "depends on selected tradition": string
2817
2828
  "Additional Prerequisites": string
2829
+ "no changes": string
2818
2830
  "Enhancements": string
2819
2831
  "SR {$value}": string & { __params: { "value": string } }
2820
2832
  ".input {$hiddenCount :number} {{Prerequisites}}": string & { __params: { "hiddenCount": number } }
@@ -4679,6 +4691,11 @@ export interface RaceTranslation {
4679
4691
  */
4680
4692
  name: string
4681
4693
 
4694
+ /**
4695
+ * The race’s name in prerequisites, if different from the normal race’s name.
4696
+ */
4697
+ nameInPrerequisites?: string
4698
+
4682
4699
  /**
4683
4700
  * The label for hair colors if it is not a hair color in that sense: Some races may have different labels for hair color such as scale color.
4684
4701
  */
@@ -9761,10 +9778,15 @@ export type Culture_ID = string
9761
9778
 
9762
9779
  export interface CultureTranslation {
9763
9780
  /**
9764
- * The race’s name.
9781
+ * The culture’s name.
9765
9782
  */
9766
9783
  name: string
9767
9784
 
9785
+ /**
9786
+ * The culture’s name in prerequisites, if different from the normal culture’s name.
9787
+ */
9788
+ nameInPrerequisites?: string
9789
+
9768
9790
  /**
9769
9791
  * The description of the area knowledge.
9770
9792
  */
@@ -10161,6 +10183,11 @@ export interface SpecificSkillSpecializationOptions {
10161
10183
  * Buy languages and scripts for a specific amount of AP.
10162
10184
  */
10163
10185
  export interface LanguagesScriptsOptions {
10186
+ /**
10187
+ * If scripts are included in the selection.
10188
+ */
10189
+ includeScripts: boolean
10190
+
10164
10191
  /**
10165
10192
  * The AP value you can buy languages and scripts for.
10166
10193
  */
@@ -10517,7 +10544,7 @@ export interface ConstantProfessionSpecialAbility {
10517
10544
  /**
10518
10545
  * Received select options. Order is important. Typically, you only need the first array index, though.
10519
10546
  */
10520
- options?: RequirableSelectOptionIdentifier[]
10547
+ options?: ProfessionSpecialAbilityOption[]
10521
10548
  }
10522
10549
 
10523
10550
  export type ProfessionSpecialAbilityIdentifier =
@@ -18280,11 +18307,37 @@ export interface WeaponEnchantmentTranslation {
18280
18307
  errata?: Errata
18281
18308
  }
18282
18309
 
18310
+ export type ProfessionSpecialAbilityOption =
18311
+ | {
18312
+ kind: "Identifier"
18313
+ Identifier: RequirableSelectOptionIdentifier
18314
+ }
18315
+ | {
18316
+ kind: "Select"
18317
+ }
18318
+
18283
18319
  export interface ProfessionSpecialAbilitySelection {
18284
18320
  /**
18285
18321
  * The list of special abilities to choose from. Must contain at least two entries.
18286
18322
  */
18287
- options: ConstantProfessionSpecialAbility[]
18323
+ options: ProfessionSpecialAbilitySelectionItem[]
18324
+ }
18325
+
18326
+ export interface ProfessionSpecialAbilitySelectionItem {
18327
+ /**
18328
+ * The identifier of the special ability to grant.
18329
+ */
18330
+ id: ProfessionSpecialAbilityIdentifier
18331
+
18332
+ /**
18333
+ * The level of the received special ability. If not specified and the special ability has levels, level 1 is used automatically.
18334
+ */
18335
+ level?: number
18336
+
18337
+ /**
18338
+ * Received select options. Order is important. Typically, you only need the first array index, though.
18339
+ */
18340
+ options?: RequirableSelectOptionIdentifier[]
18288
18341
  }
18289
18342
 
18290
18343
  export interface CombatTechniqueRating {
@@ -1,5 +1,5 @@
1
1
  import { Case } from "tsondb/schema/gen";
2
- import type { ActivatableIdentifier, GeneralSelectOption, RequirableSelectOptionIdentifier, TradeSecretAdventurePointsValue } from "../../gen/types.js";
2
+ import type { ActivatableIdentifier as ActivatableIdentifierType, GeneralSelectOption, RequirableSelectOptionIdentifier, TradeSecretAdventurePointsValue } from "../../gen/types.js";
3
3
  import type { CacheBuilder } from "./internal.ts";
4
4
  import type { ResolvedNewSkillApplication, ResolvedSkillUse } from "./newApplicationsAndUses.ts";
5
5
  export type ResolvedSelectOptionIdentifier = RequirableSelectOptionIdentifier | Case<"Blessing" | "Cantrip" | "Script" | "Culture" | "SexPractice" | "HomunculusType" | "BlessedTradition" | "Disease" | "Poison" | "TargetCategory", string>;
@@ -12,7 +12,7 @@ export type ResolvedSelectOption = {
12
12
  newApplications: ResolvedNewSkillApplication[];
13
13
  uses: ResolvedSkillUse[];
14
14
  };
15
- export type ActivatableSelectOptionsCache = Record<ActivatableIdentifier["kind"], {
15
+ export type ActivatableSelectOptionsCache = Record<ActivatableIdentifierType["kind"], {
16
16
  [id: string]: ResolvedSelectOption[];
17
17
  }>;
18
18
  export declare const activatableSelectOptionsCacheBuilder: CacheBuilder<ActivatableSelectOptionsCache>;
@@ -4,6 +4,7 @@ import { mapObject } from "@elyukai/utils/object";
4
4
  import { compareNullish, compareNumber } from "@elyukai/utils/ordering";
5
5
  import { assertExhaustive } from "@elyukai/utils/typeSafety";
6
6
  import { Case, fromUniformCase } from "tsondb/schema/gen";
7
+ import { ActivatableIdentifier } from "../types/_IdentifierGroup.js";
7
8
  const wrapPlainApValue = (apValue) => apValue === undefined ? undefined : Case("Fixed", apValue);
8
9
  const matchesSpecificSkillishIdList = (config, matches) => {
9
10
  const isInList = config.list.some(matches);
@@ -758,64 +759,7 @@ const getSelectOptionsForResults = (database, entity, results) => results.reduce
758
759
  }
759
760
  return acc;
760
761
  }, {});
761
- const cacheKeyBase = {
762
- Advantage: null,
763
- Disadvantage: null,
764
- AdvancedCombatSpecialAbility: null,
765
- AdvancedKarmaSpecialAbility: null,
766
- AdvancedMagicalSpecialAbility: null,
767
- AdvancedSkillSpecialAbility: null,
768
- AncestorGlyph: null,
769
- ArcaneOrbEnchantment: null,
770
- AttireEnchantment: null,
771
- Beutelzauber: null,
772
- BlessedTradition: null,
773
- BowlEnchantment: null,
774
- BrawlingSpecialAbility: null,
775
- CauldronEnchantment: null,
776
- CeremonialItemSpecialAbility: null,
777
- ChronicleEnchantment: null,
778
- CombatSpecialAbility: null,
779
- CombatStyleSpecialAbility: null,
780
- CommandSpecialAbility: null,
781
- DaggerRitual: null,
782
- FamiliarSpecialAbility: null,
783
- FatePointSexSpecialAbility: null,
784
- FatePointSpecialAbility: null,
785
- FoolsHatEnchantment: null,
786
- GeneralSpecialAbility: null,
787
- Haubenzauber: null,
788
- Hauerkettenzauber: null,
789
- InstrumentEnchantment: null,
790
- KarmaSpecialAbility: null,
791
- Keulenzauber: null,
792
- Krallenkettenzauber: null,
793
- Kristallkugelzauber: null,
794
- LiturgicalStyleSpecialAbility: null,
795
- LycantropicGift: null,
796
- MagicalSign: null,
797
- MagicalSpecialAbility: null,
798
- MagicalTradition: null,
799
- MagicStyleSpecialAbility: null,
800
- OrbEnchantment: null,
801
- PactGift: null,
802
- ProtectiveWardingCircleSpecialAbility: null,
803
- RingEnchantment: null,
804
- Schweinetrommelzauber: null,
805
- Sermon: null,
806
- SexSpecialAbility: null,
807
- SickleRitual: null,
808
- SikaryanDrainSpecialAbility: null,
809
- SkillStyleSpecialAbility: null,
810
- SpellSwordEnchantment: null,
811
- StaffEnchantment: null,
812
- ToyEnchantment: null,
813
- Trinkhornzauber: null,
814
- VampiricGift: null,
815
- Vision: null,
816
- WandEnchantment: null,
817
- WeaponEnchantment: null,
818
- };
762
+ const cacheKeyBase = mapObject(ActivatableIdentifier.type.value.values, () => null);
819
763
  export const activatableSelectOptionsCacheBuilder = database => Object.fromEntries(Object.keys(cacheKeyBase).map((entity) => [
820
764
  entity,
821
765
  getSelectOptionsForResults(database, entity, database.getAllInstanceContainersOfEntity(entity)),
@@ -242,6 +242,7 @@ export declare const Culture: DB.Entity<"Culture", {
242
242
  }>, []>>>, []>>, true>;
243
243
  translations: DB.MemberDecl<DB.NestedEntityMap<"CultureTranslation", {
244
244
  name: DB.MemberDecl<DB.String, true>;
245
+ nameInPrerequisites: DB.MemberDecl<DB.String, false>;
245
246
  area_knowledge: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"AreaKnowledgeTranslation", DB.Object<{
246
247
  description: DB.MemberDecl<DB.String, true>;
247
248
  abbreviated: DB.MemberDecl<DB.String, true>;
@@ -60,7 +60,11 @@ export const Culture = DB.Entity(import.meta.url, {
60
60
  src,
61
61
  translations: NestedTranslationMap(DB.Required, "Culture", DB.Object({
62
62
  name: DB.Required({
63
- comment: "The race’s name.",
63
+ comment: "The culture’s name.",
64
+ type: DB.String({ minLength: 1 }),
65
+ }),
66
+ nameInPrerequisites: DB.Optional({
67
+ comment: "The culture’s name in prerequisites, if different from the normal culture’s name.",
64
68
  type: DB.String({ minLength: 1 }),
65
69
  }),
66
70
  area_knowledge: DB.Required({
@@ -889,6 +889,9 @@ export declare const Locale: DB.Entity<"Locale", {
889
889
  "Animist Powers": null;
890
890
  "Geode Rituals": null;
891
891
  "Zibilja Rituals": null;
892
+ Bannzeichen: null;
893
+ "Goblin Rituals": null;
894
+ "Magical Runes": null;
892
895
  Mod: null;
893
896
  "Check Modifier": null;
894
897
  "spells.traditions.general": null;
@@ -1575,6 +1578,10 @@ export declare const Locale: DB.Entity<"Locale", {
1575
1578
  ".input {$count :number} {{check required every {$count}. application in the same month}}": null;
1576
1579
  "see {$link}": null;
1577
1580
  CoD: null;
1581
+ "Search Difficulty": null;
1582
+ "Identification Difficulty": null;
1583
+ "Plant Applications": null;
1584
+ "Remedies and Traditions": null;
1578
1585
  "Romance Novel": null;
1579
1586
  Poetry: null;
1580
1587
  "Political Pamphlet": null;
@@ -1667,6 +1674,8 @@ export declare const Locale: DB.Entity<"Locale", {
1667
1674
  Variants: null;
1668
1675
  "Languages and Literacy totaling {$apValue} AP": null;
1669
1676
  "no Languages and Literacy totaling {$apValue} AP": null;
1677
+ "Languages totaling {$apValue} AP": null;
1678
+ "no Languages totaling {$apValue} AP": null;
1670
1679
  "Skill Specialization {$possibleSkills}": null;
1671
1680
  "no Skill Specialization {$possibleSkills}": null;
1672
1681
  "Skill Specialization for a {$skillOfGroup}": null;
@@ -1693,6 +1702,7 @@ export declare const Locale: DB.Entity<"Locale", {
1693
1702
  "except for {$list :list type=conjunction}": null;
1694
1703
  "depends on selected tradition": null;
1695
1704
  "Additional Prerequisites": null;
1705
+ "no changes": null;
1696
1706
  Enhancements: null;
1697
1707
  "SR {$value}": null;
1698
1708
  ".input {$hiddenCount :number} {{Prerequisites}}": null;
@@ -912,6 +912,9 @@ export const Locale = DB.Entity(import.meta.url, {
912
912
  "Animist Powers": null,
913
913
  "Geode Rituals": null,
914
914
  "Zibilja Rituals": null,
915
+ "Bannzeichen": null,
916
+ "Goblin Rituals": null,
917
+ "Magical Runes": null,
915
918
  "Mod": null,
916
919
  "Check Modifier": null,
917
920
  "spells.traditions.general": null,
@@ -1618,6 +1621,11 @@ export const Locale = DB.Entity(import.meta.url, {
1618
1621
  ".input {$count :number} {{check required every {$count}. application in the same month}}": null,
1619
1622
  "see {$link}": null,
1620
1623
  "CoD": null,
1624
+ // plants
1625
+ "Search Difficulty": null,
1626
+ "Identification Difficulty": null,
1627
+ "Plant Applications": null,
1628
+ "Remedies and Traditions": null,
1621
1629
  // books
1622
1630
  "Romance Novel": null,
1623
1631
  "Poetry": null,
@@ -1719,6 +1727,8 @@ export const Locale = DB.Entity(import.meta.url, {
1719
1727
  "Variants": null,
1720
1728
  "Languages and Literacy totaling {$apValue} AP": null,
1721
1729
  "no Languages and Literacy totaling {$apValue} AP": null,
1730
+ "Languages totaling {$apValue} AP": null,
1731
+ "no Languages totaling {$apValue} AP": null,
1722
1732
  "Skill Specialization {$possibleSkills}": null,
1723
1733
  "no Skill Specialization {$possibleSkills}": null,
1724
1734
  "Skill Specialization for a {$skillOfGroup}": null,
@@ -1745,6 +1755,7 @@ export const Locale = DB.Entity(import.meta.url, {
1745
1755
  "except for {$list :list type=conjunction}": null,
1746
1756
  "depends on selected tradition": null,
1747
1757
  "Additional Prerequisites": null,
1758
+ "no changes": null,
1748
1759
  // Enhancements
1749
1760
  "Enhancements": null,
1750
1761
  "SR {$value}": null,
@@ -49,6 +49,7 @@ export declare const Profession: DB.Entity<"Profession", {
49
49
  Group: DB.EnumCase<DB.ReferenceIdentifier>;
50
50
  }, []>>, false>;
51
51
  languages_scripts: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"LanguagesScriptsOptions", DB.Object<{
52
+ includeScripts: DB.MemberDecl<DB.Boolean, true>;
52
53
  ap_value: DB.MemberDecl<DB.Integer, true>;
53
54
  }>, []>>, false>;
54
55
  combat_techniques: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"CombatTechniquesOptions", DB.Object<{
@@ -149,31 +150,34 @@ export declare const Profession: DB.Entity<"Profession", {
149
150
  Vision: DB.EnumCase<DB.ReferenceIdentifier>;
150
151
  }, []>>, true>;
151
152
  level: DB.MemberDecl<DB.Integer, false>;
152
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
153
- General: DB.EnumCase<DB.ReferenceIdentifier>;
154
- Race: DB.EnumCase<DB.ReferenceIdentifier>;
155
- Skill: DB.EnumCase<DB.ReferenceIdentifier>;
156
- SkillApplication: DB.EnumCase<DB.ReferenceIdentifier>;
157
- CloseCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
158
- RangedCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
159
- Property: DB.EnumCase<DB.ReferenceIdentifier>;
160
- Aspect: DB.EnumCase<DB.ReferenceIdentifier>;
161
- Disease: DB.EnumCase<DB.ReferenceIdentifier>;
162
- Poison: DB.EnumCase<DB.ReferenceIdentifier>;
163
- Language: DB.EnumCase<DB.ReferenceIdentifier>;
164
- AnimalShape: DB.EnumCase<DB.ReferenceIdentifier>;
165
- LiturgicalChant: DB.EnumCase<DB.ReferenceIdentifier>;
166
- Ceremony: DB.EnumCase<DB.ReferenceIdentifier>;
167
- Spell: DB.EnumCase<DB.ReferenceIdentifier>;
168
- Ritual: DB.EnumCase<DB.ReferenceIdentifier>;
169
- TradeSecret: DB.EnumCase<DB.ReferenceIdentifier>;
170
- ArcaneBardTradition: DB.EnumCase<DB.ReferenceIdentifier>;
171
- ArcaneDancerTradition: DB.EnumCase<DB.ReferenceIdentifier>;
172
- Element: DB.EnumCase<DB.ReferenceIdentifier>;
153
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"ProfessionSpecialAbilityOption", {
154
+ Identifier: DB.EnumCase<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
155
+ General: DB.EnumCase<DB.ReferenceIdentifier>;
156
+ Race: DB.EnumCase<DB.ReferenceIdentifier>;
157
+ Skill: DB.EnumCase<DB.ReferenceIdentifier>;
158
+ SkillApplication: DB.EnumCase<DB.ReferenceIdentifier>;
159
+ CloseCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
160
+ RangedCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
161
+ Property: DB.EnumCase<DB.ReferenceIdentifier>;
162
+ Aspect: DB.EnumCase<DB.ReferenceIdentifier>;
163
+ Disease: DB.EnumCase<DB.ReferenceIdentifier>;
164
+ Poison: DB.EnumCase<DB.ReferenceIdentifier>;
165
+ Language: DB.EnumCase<DB.ReferenceIdentifier>;
166
+ AnimalShape: DB.EnumCase<DB.ReferenceIdentifier>;
167
+ LiturgicalChant: DB.EnumCase<DB.ReferenceIdentifier>;
168
+ Ceremony: DB.EnumCase<DB.ReferenceIdentifier>;
169
+ Spell: DB.EnumCase<DB.ReferenceIdentifier>;
170
+ Ritual: DB.EnumCase<DB.ReferenceIdentifier>;
171
+ TradeSecret: DB.EnumCase<DB.ReferenceIdentifier>;
172
+ ArcaneBardTradition: DB.EnumCase<DB.ReferenceIdentifier>;
173
+ ArcaneDancerTradition: DB.EnumCase<DB.ReferenceIdentifier>;
174
+ Element: DB.EnumCase<DB.ReferenceIdentifier>;
175
+ }, []>>>;
176
+ Select: DB.EnumCase<null>;
173
177
  }, []>>>, false>;
174
178
  }>, []>>>;
175
179
  Selection: DB.EnumCase<DB.IncludeIdentifier<[], DB.TypeAlias<"ProfessionSpecialAbilitySelection", DB.Object<{
176
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"ConstantProfessionSpecialAbility", DB.Object<{
180
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"ProfessionSpecialAbilitySelectionItem", DB.Object<{
177
181
  id: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"ProfessionSpecialAbilityIdentifier", {
178
182
  Enhancement: DB.EnumCase<DB.ReferenceIdentifier>;
179
183
  ArcaneOrbEnchantment: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -416,31 +420,34 @@ export declare const Profession: DB.Entity<"Profession", {
416
420
  Vision: DB.EnumCase<DB.ReferenceIdentifier>;
417
421
  }, []>>, true>;
418
422
  level: DB.MemberDecl<DB.Integer, false>;
419
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
420
- General: DB.EnumCase<DB.ReferenceIdentifier>;
421
- Race: DB.EnumCase<DB.ReferenceIdentifier>;
422
- Skill: DB.EnumCase<DB.ReferenceIdentifier>;
423
- SkillApplication: DB.EnumCase<DB.ReferenceIdentifier>;
424
- CloseCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
425
- RangedCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
426
- Property: DB.EnumCase<DB.ReferenceIdentifier>;
427
- Aspect: DB.EnumCase<DB.ReferenceIdentifier>;
428
- Disease: DB.EnumCase<DB.ReferenceIdentifier>;
429
- Poison: DB.EnumCase<DB.ReferenceIdentifier>;
430
- Language: DB.EnumCase<DB.ReferenceIdentifier>;
431
- AnimalShape: DB.EnumCase<DB.ReferenceIdentifier>;
432
- LiturgicalChant: DB.EnumCase<DB.ReferenceIdentifier>;
433
- Ceremony: DB.EnumCase<DB.ReferenceIdentifier>;
434
- Spell: DB.EnumCase<DB.ReferenceIdentifier>;
435
- Ritual: DB.EnumCase<DB.ReferenceIdentifier>;
436
- TradeSecret: DB.EnumCase<DB.ReferenceIdentifier>;
437
- ArcaneBardTradition: DB.EnumCase<DB.ReferenceIdentifier>;
438
- ArcaneDancerTradition: DB.EnumCase<DB.ReferenceIdentifier>;
439
- Element: DB.EnumCase<DB.ReferenceIdentifier>;
423
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"ProfessionSpecialAbilityOption", {
424
+ Identifier: DB.EnumCase<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
425
+ General: DB.EnumCase<DB.ReferenceIdentifier>;
426
+ Race: DB.EnumCase<DB.ReferenceIdentifier>;
427
+ Skill: DB.EnumCase<DB.ReferenceIdentifier>;
428
+ SkillApplication: DB.EnumCase<DB.ReferenceIdentifier>;
429
+ CloseCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
430
+ RangedCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
431
+ Property: DB.EnumCase<DB.ReferenceIdentifier>;
432
+ Aspect: DB.EnumCase<DB.ReferenceIdentifier>;
433
+ Disease: DB.EnumCase<DB.ReferenceIdentifier>;
434
+ Poison: DB.EnumCase<DB.ReferenceIdentifier>;
435
+ Language: DB.EnumCase<DB.ReferenceIdentifier>;
436
+ AnimalShape: DB.EnumCase<DB.ReferenceIdentifier>;
437
+ LiturgicalChant: DB.EnumCase<DB.ReferenceIdentifier>;
438
+ Ceremony: DB.EnumCase<DB.ReferenceIdentifier>;
439
+ Spell: DB.EnumCase<DB.ReferenceIdentifier>;
440
+ Ritual: DB.EnumCase<DB.ReferenceIdentifier>;
441
+ TradeSecret: DB.EnumCase<DB.ReferenceIdentifier>;
442
+ ArcaneBardTradition: DB.EnumCase<DB.ReferenceIdentifier>;
443
+ ArcaneDancerTradition: DB.EnumCase<DB.ReferenceIdentifier>;
444
+ Element: DB.EnumCase<DB.ReferenceIdentifier>;
445
+ }, []>>>;
446
+ Select: DB.EnumCase<null>;
440
447
  }, []>>>, false>;
441
448
  }>, []>>>;
442
449
  Selection: DB.EnumCase<DB.IncludeIdentifier<[], DB.TypeAlias<"ProfessionSpecialAbilitySelection", DB.Object<{
443
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"ConstantProfessionSpecialAbility", DB.Object<{
450
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"ProfessionSpecialAbilitySelectionItem", DB.Object<{
444
451
  id: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"ProfessionSpecialAbilityIdentifier", {
445
452
  Enhancement: DB.EnumCase<DB.ReferenceIdentifier>;
446
453
  ArcaneOrbEnchantment: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -837,6 +844,7 @@ export declare const ProfessionVersion: DB.Entity<"ProfessionVersion", {
837
844
  Group: DB.EnumCase<DB.ReferenceIdentifier>;
838
845
  }, []>>, false>;
839
846
  languages_scripts: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"LanguagesScriptsOptions", DB.Object<{
847
+ includeScripts: DB.MemberDecl<DB.Boolean, true>;
840
848
  ap_value: DB.MemberDecl<DB.Integer, true>;
841
849
  }>, []>>, false>;
842
850
  combat_techniques: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"CombatTechniquesOptions", DB.Object<{
@@ -937,31 +945,34 @@ export declare const ProfessionVersion: DB.Entity<"ProfessionVersion", {
937
945
  Vision: DB.EnumCase<DB.ReferenceIdentifier>;
938
946
  }, []>>, true>;
939
947
  level: DB.MemberDecl<DB.Integer, false>;
940
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
941
- General: DB.EnumCase<DB.ReferenceIdentifier>;
942
- Race: DB.EnumCase<DB.ReferenceIdentifier>;
943
- Skill: DB.EnumCase<DB.ReferenceIdentifier>;
944
- SkillApplication: DB.EnumCase<DB.ReferenceIdentifier>;
945
- CloseCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
946
- RangedCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
947
- Property: DB.EnumCase<DB.ReferenceIdentifier>;
948
- Aspect: DB.EnumCase<DB.ReferenceIdentifier>;
949
- Disease: DB.EnumCase<DB.ReferenceIdentifier>;
950
- Poison: DB.EnumCase<DB.ReferenceIdentifier>;
951
- Language: DB.EnumCase<DB.ReferenceIdentifier>;
952
- AnimalShape: DB.EnumCase<DB.ReferenceIdentifier>;
953
- LiturgicalChant: DB.EnumCase<DB.ReferenceIdentifier>;
954
- Ceremony: DB.EnumCase<DB.ReferenceIdentifier>;
955
- Spell: DB.EnumCase<DB.ReferenceIdentifier>;
956
- Ritual: DB.EnumCase<DB.ReferenceIdentifier>;
957
- TradeSecret: DB.EnumCase<DB.ReferenceIdentifier>;
958
- ArcaneBardTradition: DB.EnumCase<DB.ReferenceIdentifier>;
959
- ArcaneDancerTradition: DB.EnumCase<DB.ReferenceIdentifier>;
960
- Element: DB.EnumCase<DB.ReferenceIdentifier>;
948
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"ProfessionSpecialAbilityOption", {
949
+ Identifier: DB.EnumCase<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
950
+ General: DB.EnumCase<DB.ReferenceIdentifier>;
951
+ Race: DB.EnumCase<DB.ReferenceIdentifier>;
952
+ Skill: DB.EnumCase<DB.ReferenceIdentifier>;
953
+ SkillApplication: DB.EnumCase<DB.ReferenceIdentifier>;
954
+ CloseCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
955
+ RangedCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
956
+ Property: DB.EnumCase<DB.ReferenceIdentifier>;
957
+ Aspect: DB.EnumCase<DB.ReferenceIdentifier>;
958
+ Disease: DB.EnumCase<DB.ReferenceIdentifier>;
959
+ Poison: DB.EnumCase<DB.ReferenceIdentifier>;
960
+ Language: DB.EnumCase<DB.ReferenceIdentifier>;
961
+ AnimalShape: DB.EnumCase<DB.ReferenceIdentifier>;
962
+ LiturgicalChant: DB.EnumCase<DB.ReferenceIdentifier>;
963
+ Ceremony: DB.EnumCase<DB.ReferenceIdentifier>;
964
+ Spell: DB.EnumCase<DB.ReferenceIdentifier>;
965
+ Ritual: DB.EnumCase<DB.ReferenceIdentifier>;
966
+ TradeSecret: DB.EnumCase<DB.ReferenceIdentifier>;
967
+ ArcaneBardTradition: DB.EnumCase<DB.ReferenceIdentifier>;
968
+ ArcaneDancerTradition: DB.EnumCase<DB.ReferenceIdentifier>;
969
+ Element: DB.EnumCase<DB.ReferenceIdentifier>;
970
+ }, []>>>;
971
+ Select: DB.EnumCase<null>;
961
972
  }, []>>>, false>;
962
973
  }>, []>>>;
963
974
  Selection: DB.EnumCase<DB.IncludeIdentifier<[], DB.TypeAlias<"ProfessionSpecialAbilitySelection", DB.Object<{
964
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"ConstantProfessionSpecialAbility", DB.Object<{
975
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"ProfessionSpecialAbilitySelectionItem", DB.Object<{
965
976
  id: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"ProfessionSpecialAbilityIdentifier", {
966
977
  Enhancement: DB.EnumCase<DB.ReferenceIdentifier>;
967
978
  ArcaneOrbEnchantment: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -1204,31 +1215,34 @@ export declare const ProfessionVersion: DB.Entity<"ProfessionVersion", {
1204
1215
  Vision: DB.EnumCase<DB.ReferenceIdentifier>;
1205
1216
  }, []>>, true>;
1206
1217
  level: DB.MemberDecl<DB.Integer, false>;
1207
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
1208
- General: DB.EnumCase<DB.ReferenceIdentifier>;
1209
- Race: DB.EnumCase<DB.ReferenceIdentifier>;
1210
- Skill: DB.EnumCase<DB.ReferenceIdentifier>;
1211
- SkillApplication: DB.EnumCase<DB.ReferenceIdentifier>;
1212
- CloseCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
1213
- RangedCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
1214
- Property: DB.EnumCase<DB.ReferenceIdentifier>;
1215
- Aspect: DB.EnumCase<DB.ReferenceIdentifier>;
1216
- Disease: DB.EnumCase<DB.ReferenceIdentifier>;
1217
- Poison: DB.EnumCase<DB.ReferenceIdentifier>;
1218
- Language: DB.EnumCase<DB.ReferenceIdentifier>;
1219
- AnimalShape: DB.EnumCase<DB.ReferenceIdentifier>;
1220
- LiturgicalChant: DB.EnumCase<DB.ReferenceIdentifier>;
1221
- Ceremony: DB.EnumCase<DB.ReferenceIdentifier>;
1222
- Spell: DB.EnumCase<DB.ReferenceIdentifier>;
1223
- Ritual: DB.EnumCase<DB.ReferenceIdentifier>;
1224
- TradeSecret: DB.EnumCase<DB.ReferenceIdentifier>;
1225
- ArcaneBardTradition: DB.EnumCase<DB.ReferenceIdentifier>;
1226
- ArcaneDancerTradition: DB.EnumCase<DB.ReferenceIdentifier>;
1227
- Element: DB.EnumCase<DB.ReferenceIdentifier>;
1218
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"ProfessionSpecialAbilityOption", {
1219
+ Identifier: DB.EnumCase<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
1220
+ General: DB.EnumCase<DB.ReferenceIdentifier>;
1221
+ Race: DB.EnumCase<DB.ReferenceIdentifier>;
1222
+ Skill: DB.EnumCase<DB.ReferenceIdentifier>;
1223
+ SkillApplication: DB.EnumCase<DB.ReferenceIdentifier>;
1224
+ CloseCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
1225
+ RangedCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
1226
+ Property: DB.EnumCase<DB.ReferenceIdentifier>;
1227
+ Aspect: DB.EnumCase<DB.ReferenceIdentifier>;
1228
+ Disease: DB.EnumCase<DB.ReferenceIdentifier>;
1229
+ Poison: DB.EnumCase<DB.ReferenceIdentifier>;
1230
+ Language: DB.EnumCase<DB.ReferenceIdentifier>;
1231
+ AnimalShape: DB.EnumCase<DB.ReferenceIdentifier>;
1232
+ LiturgicalChant: DB.EnumCase<DB.ReferenceIdentifier>;
1233
+ Ceremony: DB.EnumCase<DB.ReferenceIdentifier>;
1234
+ Spell: DB.EnumCase<DB.ReferenceIdentifier>;
1235
+ Ritual: DB.EnumCase<DB.ReferenceIdentifier>;
1236
+ TradeSecret: DB.EnumCase<DB.ReferenceIdentifier>;
1237
+ ArcaneBardTradition: DB.EnumCase<DB.ReferenceIdentifier>;
1238
+ ArcaneDancerTradition: DB.EnumCase<DB.ReferenceIdentifier>;
1239
+ Element: DB.EnumCase<DB.ReferenceIdentifier>;
1240
+ }, []>>>;
1241
+ Select: DB.EnumCase<null>;
1228
1242
  }, []>>>, false>;
1229
1243
  }>, []>>>;
1230
1244
  Selection: DB.EnumCase<DB.IncludeIdentifier<[], DB.TypeAlias<"ProfessionSpecialAbilitySelection", DB.Object<{
1231
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"ConstantProfessionSpecialAbility", DB.Object<{
1245
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"ProfessionSpecialAbilitySelectionItem", DB.Object<{
1232
1246
  id: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"ProfessionSpecialAbilityIdentifier", {
1233
1247
  Enhancement: DB.EnumCase<DB.ReferenceIdentifier>;
1234
1248
  ArcaneOrbEnchantment: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -1617,6 +1631,7 @@ export declare const ProfessionPackage: DB.Entity<"ProfessionPackage", {
1617
1631
  Group: DB.EnumCase<DB.ReferenceIdentifier>;
1618
1632
  }, []>>, false>;
1619
1633
  languages_scripts: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"LanguagesScriptsOptions", DB.Object<{
1634
+ includeScripts: DB.MemberDecl<DB.Boolean, true>;
1620
1635
  ap_value: DB.MemberDecl<DB.Integer, true>;
1621
1636
  }>, []>>, false>;
1622
1637
  combat_techniques: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"CombatTechniquesOptions", DB.Object<{
@@ -1717,31 +1732,34 @@ export declare const ProfessionPackage: DB.Entity<"ProfessionPackage", {
1717
1732
  Vision: DB.EnumCase<DB.ReferenceIdentifier>;
1718
1733
  }, []>>, true>;
1719
1734
  level: DB.MemberDecl<DB.Integer, false>;
1720
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
1721
- General: DB.EnumCase<DB.ReferenceIdentifier>;
1722
- Race: DB.EnumCase<DB.ReferenceIdentifier>;
1723
- Skill: DB.EnumCase<DB.ReferenceIdentifier>;
1724
- SkillApplication: DB.EnumCase<DB.ReferenceIdentifier>;
1725
- CloseCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
1726
- RangedCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
1727
- Property: DB.EnumCase<DB.ReferenceIdentifier>;
1728
- Aspect: DB.EnumCase<DB.ReferenceIdentifier>;
1729
- Disease: DB.EnumCase<DB.ReferenceIdentifier>;
1730
- Poison: DB.EnumCase<DB.ReferenceIdentifier>;
1731
- Language: DB.EnumCase<DB.ReferenceIdentifier>;
1732
- AnimalShape: DB.EnumCase<DB.ReferenceIdentifier>;
1733
- LiturgicalChant: DB.EnumCase<DB.ReferenceIdentifier>;
1734
- Ceremony: DB.EnumCase<DB.ReferenceIdentifier>;
1735
- Spell: DB.EnumCase<DB.ReferenceIdentifier>;
1736
- Ritual: DB.EnumCase<DB.ReferenceIdentifier>;
1737
- TradeSecret: DB.EnumCase<DB.ReferenceIdentifier>;
1738
- ArcaneBardTradition: DB.EnumCase<DB.ReferenceIdentifier>;
1739
- ArcaneDancerTradition: DB.EnumCase<DB.ReferenceIdentifier>;
1740
- Element: DB.EnumCase<DB.ReferenceIdentifier>;
1735
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"ProfessionSpecialAbilityOption", {
1736
+ Identifier: DB.EnumCase<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
1737
+ General: DB.EnumCase<DB.ReferenceIdentifier>;
1738
+ Race: DB.EnumCase<DB.ReferenceIdentifier>;
1739
+ Skill: DB.EnumCase<DB.ReferenceIdentifier>;
1740
+ SkillApplication: DB.EnumCase<DB.ReferenceIdentifier>;
1741
+ CloseCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
1742
+ RangedCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
1743
+ Property: DB.EnumCase<DB.ReferenceIdentifier>;
1744
+ Aspect: DB.EnumCase<DB.ReferenceIdentifier>;
1745
+ Disease: DB.EnumCase<DB.ReferenceIdentifier>;
1746
+ Poison: DB.EnumCase<DB.ReferenceIdentifier>;
1747
+ Language: DB.EnumCase<DB.ReferenceIdentifier>;
1748
+ AnimalShape: DB.EnumCase<DB.ReferenceIdentifier>;
1749
+ LiturgicalChant: DB.EnumCase<DB.ReferenceIdentifier>;
1750
+ Ceremony: DB.EnumCase<DB.ReferenceIdentifier>;
1751
+ Spell: DB.EnumCase<DB.ReferenceIdentifier>;
1752
+ Ritual: DB.EnumCase<DB.ReferenceIdentifier>;
1753
+ TradeSecret: DB.EnumCase<DB.ReferenceIdentifier>;
1754
+ ArcaneBardTradition: DB.EnumCase<DB.ReferenceIdentifier>;
1755
+ ArcaneDancerTradition: DB.EnumCase<DB.ReferenceIdentifier>;
1756
+ Element: DB.EnumCase<DB.ReferenceIdentifier>;
1757
+ }, []>>>;
1758
+ Select: DB.EnumCase<null>;
1741
1759
  }, []>>>, false>;
1742
1760
  }>, []>>>;
1743
1761
  Selection: DB.EnumCase<DB.IncludeIdentifier<[], DB.TypeAlias<"ProfessionSpecialAbilitySelection", DB.Object<{
1744
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"ConstantProfessionSpecialAbility", DB.Object<{
1762
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"ProfessionSpecialAbilitySelectionItem", DB.Object<{
1745
1763
  id: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"ProfessionSpecialAbilityIdentifier", {
1746
1764
  Enhancement: DB.EnumCase<DB.ReferenceIdentifier>;
1747
1765
  ArcaneOrbEnchantment: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -1984,31 +2002,34 @@ export declare const ProfessionPackage: DB.Entity<"ProfessionPackage", {
1984
2002
  Vision: DB.EnumCase<DB.ReferenceIdentifier>;
1985
2003
  }, []>>, true>;
1986
2004
  level: DB.MemberDecl<DB.Integer, false>;
1987
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
1988
- General: DB.EnumCase<DB.ReferenceIdentifier>;
1989
- Race: DB.EnumCase<DB.ReferenceIdentifier>;
1990
- Skill: DB.EnumCase<DB.ReferenceIdentifier>;
1991
- SkillApplication: DB.EnumCase<DB.ReferenceIdentifier>;
1992
- CloseCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
1993
- RangedCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
1994
- Property: DB.EnumCase<DB.ReferenceIdentifier>;
1995
- Aspect: DB.EnumCase<DB.ReferenceIdentifier>;
1996
- Disease: DB.EnumCase<DB.ReferenceIdentifier>;
1997
- Poison: DB.EnumCase<DB.ReferenceIdentifier>;
1998
- Language: DB.EnumCase<DB.ReferenceIdentifier>;
1999
- AnimalShape: DB.EnumCase<DB.ReferenceIdentifier>;
2000
- LiturgicalChant: DB.EnumCase<DB.ReferenceIdentifier>;
2001
- Ceremony: DB.EnumCase<DB.ReferenceIdentifier>;
2002
- Spell: DB.EnumCase<DB.ReferenceIdentifier>;
2003
- Ritual: DB.EnumCase<DB.ReferenceIdentifier>;
2004
- TradeSecret: DB.EnumCase<DB.ReferenceIdentifier>;
2005
- ArcaneBardTradition: DB.EnumCase<DB.ReferenceIdentifier>;
2006
- ArcaneDancerTradition: DB.EnumCase<DB.ReferenceIdentifier>;
2007
- Element: DB.EnumCase<DB.ReferenceIdentifier>;
2005
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"ProfessionSpecialAbilityOption", {
2006
+ Identifier: DB.EnumCase<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
2007
+ General: DB.EnumCase<DB.ReferenceIdentifier>;
2008
+ Race: DB.EnumCase<DB.ReferenceIdentifier>;
2009
+ Skill: DB.EnumCase<DB.ReferenceIdentifier>;
2010
+ SkillApplication: DB.EnumCase<DB.ReferenceIdentifier>;
2011
+ CloseCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
2012
+ RangedCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
2013
+ Property: DB.EnumCase<DB.ReferenceIdentifier>;
2014
+ Aspect: DB.EnumCase<DB.ReferenceIdentifier>;
2015
+ Disease: DB.EnumCase<DB.ReferenceIdentifier>;
2016
+ Poison: DB.EnumCase<DB.ReferenceIdentifier>;
2017
+ Language: DB.EnumCase<DB.ReferenceIdentifier>;
2018
+ AnimalShape: DB.EnumCase<DB.ReferenceIdentifier>;
2019
+ LiturgicalChant: DB.EnumCase<DB.ReferenceIdentifier>;
2020
+ Ceremony: DB.EnumCase<DB.ReferenceIdentifier>;
2021
+ Spell: DB.EnumCase<DB.ReferenceIdentifier>;
2022
+ Ritual: DB.EnumCase<DB.ReferenceIdentifier>;
2023
+ TradeSecret: DB.EnumCase<DB.ReferenceIdentifier>;
2024
+ ArcaneBardTradition: DB.EnumCase<DB.ReferenceIdentifier>;
2025
+ ArcaneDancerTradition: DB.EnumCase<DB.ReferenceIdentifier>;
2026
+ Element: DB.EnumCase<DB.ReferenceIdentifier>;
2027
+ }, []>>>;
2028
+ Select: DB.EnumCase<null>;
2008
2029
  }, []>>>, false>;
2009
2030
  }>, []>>>;
2010
2031
  Selection: DB.EnumCase<DB.IncludeIdentifier<[], DB.TypeAlias<"ProfessionSpecialAbilitySelection", DB.Object<{
2011
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"ConstantProfessionSpecialAbility", DB.Object<{
2032
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"ProfessionSpecialAbilitySelectionItem", DB.Object<{
2012
2033
  id: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"ProfessionSpecialAbilityIdentifier", {
2013
2034
  Enhancement: DB.EnumCase<DB.ReferenceIdentifier>;
2014
2035
  ArcaneOrbEnchantment: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -2261,31 +2282,34 @@ export declare const ProfessionVariant: DB.Entity<"ProfessionVariant", {
2261
2282
  Vision: DB.EnumCase<DB.ReferenceIdentifier>;
2262
2283
  }, []>>, true>;
2263
2284
  level: DB.MemberDecl<DB.Integer, false>;
2264
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
2265
- General: DB.EnumCase<DB.ReferenceIdentifier>;
2266
- Race: DB.EnumCase<DB.ReferenceIdentifier>;
2267
- Skill: DB.EnumCase<DB.ReferenceIdentifier>;
2268
- SkillApplication: DB.EnumCase<DB.ReferenceIdentifier>;
2269
- CloseCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
2270
- RangedCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
2271
- Property: DB.EnumCase<DB.ReferenceIdentifier>;
2272
- Aspect: DB.EnumCase<DB.ReferenceIdentifier>;
2273
- Disease: DB.EnumCase<DB.ReferenceIdentifier>;
2274
- Poison: DB.EnumCase<DB.ReferenceIdentifier>;
2275
- Language: DB.EnumCase<DB.ReferenceIdentifier>;
2276
- AnimalShape: DB.EnumCase<DB.ReferenceIdentifier>;
2277
- LiturgicalChant: DB.EnumCase<DB.ReferenceIdentifier>;
2278
- Ceremony: DB.EnumCase<DB.ReferenceIdentifier>;
2279
- Spell: DB.EnumCase<DB.ReferenceIdentifier>;
2280
- Ritual: DB.EnumCase<DB.ReferenceIdentifier>;
2281
- TradeSecret: DB.EnumCase<DB.ReferenceIdentifier>;
2282
- ArcaneBardTradition: DB.EnumCase<DB.ReferenceIdentifier>;
2283
- ArcaneDancerTradition: DB.EnumCase<DB.ReferenceIdentifier>;
2284
- Element: DB.EnumCase<DB.ReferenceIdentifier>;
2285
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.Enum<"ProfessionSpecialAbilityOption", {
2286
+ Identifier: DB.EnumCase<DB.IncludeIdentifier<[], DB.Enum<"RequirableSelectOptionIdentifier", {
2287
+ General: DB.EnumCase<DB.ReferenceIdentifier>;
2288
+ Race: DB.EnumCase<DB.ReferenceIdentifier>;
2289
+ Skill: DB.EnumCase<DB.ReferenceIdentifier>;
2290
+ SkillApplication: DB.EnumCase<DB.ReferenceIdentifier>;
2291
+ CloseCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
2292
+ RangedCombatTechnique: DB.EnumCase<DB.ReferenceIdentifier>;
2293
+ Property: DB.EnumCase<DB.ReferenceIdentifier>;
2294
+ Aspect: DB.EnumCase<DB.ReferenceIdentifier>;
2295
+ Disease: DB.EnumCase<DB.ReferenceIdentifier>;
2296
+ Poison: DB.EnumCase<DB.ReferenceIdentifier>;
2297
+ Language: DB.EnumCase<DB.ReferenceIdentifier>;
2298
+ AnimalShape: DB.EnumCase<DB.ReferenceIdentifier>;
2299
+ LiturgicalChant: DB.EnumCase<DB.ReferenceIdentifier>;
2300
+ Ceremony: DB.EnumCase<DB.ReferenceIdentifier>;
2301
+ Spell: DB.EnumCase<DB.ReferenceIdentifier>;
2302
+ Ritual: DB.EnumCase<DB.ReferenceIdentifier>;
2303
+ TradeSecret: DB.EnumCase<DB.ReferenceIdentifier>;
2304
+ ArcaneBardTradition: DB.EnumCase<DB.ReferenceIdentifier>;
2305
+ ArcaneDancerTradition: DB.EnumCase<DB.ReferenceIdentifier>;
2306
+ Element: DB.EnumCase<DB.ReferenceIdentifier>;
2307
+ }, []>>>;
2308
+ Select: DB.EnumCase<null>;
2285
2309
  }, []>>>, false>;
2286
2310
  }>, []>>>;
2287
2311
  Selection: DB.EnumCase<DB.IncludeIdentifier<[], DB.TypeAlias<"ProfessionSpecialAbilitySelection", DB.Object<{
2288
- options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"ConstantProfessionSpecialAbility", DB.Object<{
2312
+ options: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"ProfessionSpecialAbilitySelectionItem", DB.Object<{
2289
2313
  id: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"ProfessionSpecialAbilityIdentifier", {
2290
2314
  Enhancement: DB.EnumCase<DB.ReferenceIdentifier>;
2291
2315
  ArcaneOrbEnchantment: DB.EnumCase<DB.ReferenceIdentifier>;
@@ -1,5 +1,6 @@
1
1
  import { isNotNullish } from "@elyukai/utils/nullable";
2
2
  import * as DB from "tsondb/schema/dsl";
3
+ import { verifyOptionsForActivatableEntry } from "./_ActivatableSelectOptions.js";
3
4
  import { CommonnessRatedAdvantageDisadvantage } from "./_CommonnessRatedAdvantageDisadvantage.js";
4
5
  import { AdvantageIdentifier, BannzeichenOptionIdentifier, CantripIdentifier, CurriculumIdentifier, DisadvantageIdentifier, ExperienceLevelIdentifier, MagicalTraditionIdentifier, ProfessionIdentifier, ProfessionPackageIdentifier, ProfessionVersionIdentifier, SkillGroupIdentifier, SkillIdentifier, } from "./_Identifier.js";
5
6
  import { CombatTechniqueIdentifier, LiturgyIdentifier, MagicalActionIdentifier, ProfessionSpecialAbilityIdentifier, RequirableSelectOptionIdentifier, SpellworkIdentifier, } from "./_IdentifierGroup.js";
@@ -305,8 +306,39 @@ const ProfessionSpecialAbility = DB.Enum(import.meta.url, {
305
306
  Selection: DB.EnumCase({ type: DB.IncludeIdentifier(ProfessionSpecialAbilitySelection) }),
306
307
  }),
307
308
  });
309
+ const ProfessionSpecialAbilityOption = DB.Enum(import.meta.url, {
310
+ name: "ProfessionSpecialAbilityOption",
311
+ values: () => ({
312
+ Identifier: DB.EnumCase({
313
+ comment: "The option is defined by the profession.",
314
+ type: DB.IncludeIdentifier(RequirableSelectOptionIdentifier),
315
+ }),
316
+ Select: DB.EnumCase({
317
+ comment: "The option has to be chosen when applying the profession.",
318
+ type: null,
319
+ }),
320
+ }),
321
+ });
308
322
  const ConstantProfessionSpecialAbility = DB.TypeAlias(import.meta.url, {
309
323
  name: "ConstantProfessionSpecialAbility",
324
+ type: () => DB.Object({
325
+ id: DB.Required({
326
+ comment: "The identifier of the special ability to grant.",
327
+ type: DB.IncludeIdentifier(ProfessionSpecialAbilityIdentifier),
328
+ }),
329
+ level: DB.Optional({
330
+ comment: "The level of the received special ability. If not specified and the special ability has levels, level 1 is used automatically.",
331
+ type: DB.Integer({ minimum: 1 }),
332
+ }),
333
+ options: DB.Optional({
334
+ comment: "Received select options. Order is important. Typically, you only need the first array index, though.",
335
+ type: DB.Array(DB.IncludeIdentifier(ProfessionSpecialAbilityOption), { minItems: 1 }),
336
+ }),
337
+ }),
338
+ customConstraints: ({ instanceContent, getInstanceById, getAllChildInstancesForParent }) => verifyOptionsForActivatableEntry(instanceContent, getInstanceById, getAllChildInstancesForParent),
339
+ });
340
+ const ProfessionSpecialAbilitySelectionItem = DB.TypeAlias(import.meta.url, {
341
+ name: "ProfessionSpecialAbilitySelectionItem",
310
342
  type: () => DB.Object({
311
343
  id: DB.Required({
312
344
  comment: "The identifier of the special ability to grant.",
@@ -321,13 +353,16 @@ const ConstantProfessionSpecialAbility = DB.TypeAlias(import.meta.url, {
321
353
  type: DB.Array(DB.IncludeIdentifier(RequirableSelectOptionIdentifier), { minItems: 1 }),
322
354
  }),
323
355
  }),
356
+ customConstraints: ({ instanceContent, getInstanceById, getAllChildInstancesForParent }) => verifyOptionsForActivatableEntry(instanceContent, getInstanceById, getAllChildInstancesForParent),
324
357
  });
325
358
  const ProfessionSpecialAbilitySelection = DB.TypeAlias(import.meta.url, {
326
359
  name: "ProfessionSpecialAbilitySelection",
327
360
  type: () => DB.Object({
328
361
  options: DB.Required({
329
362
  comment: `The list of special abilities to choose from. Must contain at least two entries.`,
330
- type: DB.Array(DB.IncludeIdentifier(ConstantProfessionSpecialAbility), { minItems: 2 }),
363
+ type: DB.Array(DB.IncludeIdentifier(ProfessionSpecialAbilitySelectionItem), {
364
+ minItems: 2,
365
+ }),
331
366
  }),
332
367
  }),
333
368
  });
@@ -542,6 +577,10 @@ const LanguagesScriptsOptions = DB.TypeAlias(import.meta.url, {
542
577
  name: "LanguagesScriptsOptions",
543
578
  comment: `Buy languages and scripts for a specific amount of AP.`,
544
579
  type: () => DB.Object({
580
+ includeScripts: DB.Required({
581
+ comment: "If scripts are included in the selection.",
582
+ type: DB.Boolean(),
583
+ }),
545
584
  ap_value: DB.Required({
546
585
  comment: "The AP value you can buy languages and scripts for.",
547
586
  type: DB.Integer({ minimum: 2 }),
@@ -354,6 +354,7 @@ export declare const Race: DB.Entity<"Race", {
354
354
  }>, []>>>, []>>, true>;
355
355
  translations: DB.MemberDecl<DB.NestedEntityMap<"RaceTranslation", {
356
356
  name: DB.MemberDecl<DB.String, true>;
357
+ nameInPrerequisites: DB.MemberDecl<DB.String, false>;
357
358
  hairColorLabel: DB.MemberDecl<DB.String, false>;
358
359
  errata: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"Errata", DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"Erratum", DB.Object<{
359
360
  date: DB.MemberDecl<DB.Date, true>;
package/lib/types/Race.js CHANGED
@@ -1,5 +1,7 @@
1
1
  import { isNotNullish } from "@elyukai/utils/nullable";
2
2
  import * as DB from "tsondb/schema/dsl";
3
+ import { Case } from "tsondb/schema/gen";
4
+ import { verifyOptionsForActivatableEntry } from "./_ActivatableSelectOptions.js";
3
5
  import { CommonnessRatedAdvantageDisadvantage } from "./_CommonnessRatedAdvantageDisadvantage.js";
4
6
  import { Dice, DieType } from "./_Dice.js";
5
7
  import { AdvantageIdentifier, AttributeIdentifier, CultureIdentifier, DisadvantageIdentifier, EyeColorIdentifier, HairColorIdentifier, RaceIdentifier, } from "./_Identifier.js";
@@ -58,6 +60,10 @@ export const Race = DB.Entity(import.meta.url, {
58
60
  comment: "The race’s name.",
59
61
  type: DB.String({ minLength: 1 }),
60
62
  }),
63
+ nameInPrerequisites: DB.Optional({
64
+ comment: "The race’s name in prerequisites, if different from the normal race’s name.",
65
+ type: DB.String({ minLength: 1 }),
66
+ }),
61
67
  hairColorLabel: DB.Optional({
62
68
  comment: "The label for hair colors if it is not a hair color in that sense: Some races may have different labels for hair color such as scale color.",
63
69
  type: DB.String({ minLength: 1 }),
@@ -324,6 +330,10 @@ export const RaceVariant = DB.Entity(import.meta.url, {
324
330
  },
325
331
  ],
326
332
  ],
333
+ customConstraints: ({ instanceContent, getInstanceById, getAllChildInstancesForParent }) => [
334
+ ...(instanceContent.automatic_advantages?.flatMap(advantage => verifyOptionsForActivatableEntry({ ...advantage, id: Case("Advantage", advantage.id) }, getInstanceById, getAllChildInstancesForParent)) ?? []),
335
+ ...(instanceContent.automatic_disadvantages?.flatMap(disadvantage => verifyOptionsForActivatableEntry({ ...disadvantage, id: Case("Disadvantage", disadvantage.id) }, getInstanceById, getAllChildInstancesForParent)) ?? []),
336
+ ],
327
337
  });
328
338
  const RandomHeightGeneration = DB.TypeAlias(import.meta.url, {
329
339
  name: "RandomHeightGeneration",
@@ -1,4 +1,6 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
+ import { Case, type GetAllChildInstanceContainersForParent, type GetInstanceById } from "tsondb/schema/gen";
3
+ import type { ActivatableIdentifier, ProfessionSpecialAbilityOption, RequirableSelectOptionIdentifier } from "../../gen/types.js";
2
4
  export declare const select_options: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"SelectOptions", DB.Object<{
3
5
  derived: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"SelectOptionCategory", {
4
6
  Blessings: DB.EnumCase<null>;
@@ -1223,3 +1225,11 @@ export declare const explicit_select_options: DB.MemberDecl<DB.ChildEntities<DB.
1223
1225
  }>, []>>>, []>>, false>;
1224
1226
  }>, true>;
1225
1227
  }, "parent">>, true>;
1228
+ /**
1229
+ * Stub for once option rules are formalized in the database schema.
1230
+ */
1231
+ export declare const verifyOptionsForActivatableEntry: (value: {
1232
+ id: ActivatableIdentifier | Case<"Enhancement", string>;
1233
+ level?: number;
1234
+ options?: (RequirableSelectOptionIdentifier | ProfessionSpecialAbilityOption)[];
1235
+ }, getInstanceById: GetInstanceById, getAllChildInstancesForParent: GetAllChildInstanceContainersForParent) => string[];
@@ -1,4 +1,6 @@
1
+ import { isEmpty, isNotEmpty } from "@elyukai/utils/array/nonEmpty";
1
2
  import * as DB from "tsondb/schema/dsl";
3
+ import { Case, fromUniformCase, } from "tsondb/schema/gen";
2
4
  import { NestedTranslationMap } from "./Locale.js";
3
5
  import { SelectOptionCategory } from "./_ActivatableSelectOptionCategory.js";
4
6
  import { NewSkillApplication, SkillUse } from "./_ActivatableSkillApplicationsAndUses.js";
@@ -216,3 +218,41 @@ Note that this is only a full definition of options for simple logic that can be
216
218
  // ]
217
219
  // }
218
220
  // },
221
+ /**
222
+ * Stub for once option rules are formalized in the database schema.
223
+ */
224
+ export const verifyOptionsForActivatableEntry = (value, getInstanceById, getAllChildInstancesForParent) => {
225
+ if (value.id.kind === "Enhancement") {
226
+ return [];
227
+ }
228
+ const referencedInstance = getInstanceById(value.id);
229
+ if (!referencedInstance) {
230
+ return [
231
+ `Referenced instance of entity ${value.id.kind} with id ${fromUniformCase(value.id)} not found.`,
232
+ ];
233
+ }
234
+ const generalSelectOptions = getAllChildInstancesForParent("GeneralSelectOption", value.id);
235
+ const errorMessages = [];
236
+ if (!("levels" in referencedInstance && typeof referencedInstance.levels === "number") &&
237
+ value.level !== undefined) {
238
+ errorMessages.push(`The referenced instance of entity ${value.id.kind} with id ${fromUniformCase(value.id)} does not have levels, but a level was specified in the prerequisite.`);
239
+ }
240
+ if ((("select_options" in referencedInstance &&
241
+ referencedInstance.select_options?.derived !== undefined) ||
242
+ isNotEmpty(generalSelectOptions)) &&
243
+ (value.options === undefined || isEmpty(value.options))) {
244
+ errorMessages.push(`The referenced instance of entity ${value.id.kind} with id ${fromUniformCase(value.id)} has select options, but no options were specified in the prerequisite.`);
245
+ }
246
+ for (const option of value.options ?? []) {
247
+ if (option.kind === "General") {
248
+ const referencedOption = getInstanceById(Case("GeneralSelectOption", option.General));
249
+ if (!referencedOption) {
250
+ errorMessages.push(`Referenced select option of entity GeneralSelectOption with id ${fromUniformCase(option)} not found.`);
251
+ }
252
+ if (referencedOption?.parent !== value.id) {
253
+ errorMessages.push(`Referenced select option of entity GeneralSelectOption with id ${fromUniformCase(option)} does not belong to the instance of entity ${value.id.kind} with id ${fromUniformCase(value.id)}.`);
254
+ }
255
+ }
256
+ }
257
+ return [];
258
+ };
@@ -1,4 +1,5 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
+ import { verifyOptionsForActivatableEntry } from "../../_ActivatableSelectOptions.js";
2
3
  import { ActivatableIdentifier, RequirableSelectOptionIdentifier } from "../../_IdentifierGroup.js";
3
4
  import { Preconditions } from "../ConditionalPrerequisites.js";
4
5
  import { DisplayOption } from "../DisplayOption.js";
@@ -29,4 +30,5 @@ export const ActivatablePrerequisite = DB.TypeAlias(import.meta.url, {
29
30
  type: DB.IncludeIdentifier(Preconditions),
30
31
  }),
31
32
  }),
33
+ customConstraints: ({ instanceContent, getInstanceById, getAllChildInstancesForParent }) => verifyOptionsForActivatableEntry(instanceContent, getInstanceById, getAllChildInstancesForParent),
32
34
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optolith/database-schema",
3
- "version": "0.77.1",
3
+ "version": "0.78.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",