@optolith/database-schema 0.88.0 → 0.89.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,17 @@
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.89.0](https://github.com/Optolith/database-schema/compare/v0.88.0...v0.89.0) (2026-10-09)
6
+
7
+ ### ⚠ BREAKING CHANGES
8
+
9
+ * blessed tradition groups in cultures
10
+
11
+ ### Features
12
+
13
+ * blessed tradition groups in cultures ([6a1cc80](https://github.com/Optolith/database-schema/commit/6a1cc805a8f32c32e993fcc6a1226a3aa16daa30))
14
+ * name of people in culture ([1b9fbcf](https://github.com/Optolith/database-schema/commit/1b9fbcfbfbf24a46f73ac8c14959d5c57bc9f317))
15
+
5
16
  ## [0.88.0](https://github.com/Optolith/database-schema/compare/v0.87.0...v0.88.0) (2026-10-08)
6
17
 
7
18
  ### ⚠ BREAKING CHANGES
package/gen/types.d.ts CHANGED
@@ -30,6 +30,7 @@ export type EntityMap = {
30
30
  Beutelzauber: Beutelzauber
31
31
  Biome: Biome
32
32
  BlessedTradition: BlessedTradition
33
+ BlessedTraditionGroup: BlessedTraditionGroup
33
34
  Blessing: Blessing
34
35
  Book: Book
35
36
  BotanicRegion: BotanicRegion
@@ -563,6 +564,7 @@ export type TypeAliasMap = {
563
564
  BindingCostMapOptionValue: BindingCostMapOptionValue
564
565
  BindingCostPerLevel: BindingCostPerLevel
565
566
  BlessedTraditionConstraint: BlessedTraditionConstraint
567
+ BlessedTraditionGroupConstraint: BlessedTraditionGroupConstraint
566
568
  BlessedTraditionPrerequisite: BlessedTraditionPrerequisite
567
569
  BlessedTraditionsSelectOptionCategory: BlessedTraditionsSelectOptionCategory
568
570
  BlessingPerformanceParameters: BlessingPerformanceParameters
@@ -7855,6 +7857,11 @@ export interface LiturgyTraditionWithAspects {
7855
7857
  }
7856
7858
 
7857
7859
  export interface BlessedTradition {
7860
+ /**
7861
+ * The group of traditions this tradition belongs to.
7862
+ */
7863
+ group: BlessedTraditionGroup_ID
7864
+
7858
7865
  /**
7859
7866
  * Definitions for possible options for the activatable entry, derived from entry categories.
7860
7867
  *
@@ -7973,6 +7980,32 @@ export interface BlessedTraditionTranslation {
7973
7980
  errata?: Errata
7974
7981
  }
7975
7982
 
7983
+ export interface BlessedTraditionGroup {
7984
+ /**
7985
+ * All translations for the entry, identified by IETF language tag (BCP47).
7986
+ */
7987
+ translations: {
7988
+ [localeId: string]: BlessedTraditionGroupTranslation
7989
+ }
7990
+ }
7991
+
7992
+ /**
7993
+ * The entity’s identifier. A UUID or a locale code if it is registered as the locale entity.
7994
+ */
7995
+ export type BlessedTraditionGroup_ID = string
7996
+
7997
+ export interface BlessedTraditionGroupTranslation {
7998
+ /**
7999
+ * The name of the group.
8000
+ */
8001
+ name: string
8002
+
8003
+ /**
8004
+ * The text to use when all Blessed Ones of this group are recommended for a culture.
8005
+ */
8006
+ nameInCulture: string
8007
+ }
8008
+
7976
8009
  export interface Blessing {
7977
8010
  /**
7978
8011
  * Measurable parameters of a blessing.
@@ -9865,6 +9898,11 @@ export interface CultureTranslation {
9865
9898
  */
9866
9899
  nameInPrerequisites?: string
9867
9900
 
9901
+ /**
9902
+ * The name for people of this culture, if different from the normal culture’s name.
9903
+ */
9904
+ nameOfPeople?: string
9905
+
9868
9906
  /**
9869
9907
  * The description of the area knowledge.
9870
9908
  */
@@ -10119,6 +10157,9 @@ export type CommonnessWeight =
10119
10157
  | {
10120
10158
  kind: "Only"
10121
10159
  }
10160
+ | {
10161
+ kind: "ExceptFor"
10162
+ }
10122
10163
 
10123
10164
  export interface ProfessionVariant {
10124
10165
  /**
@@ -21237,6 +21278,10 @@ export type BlessedCommonProfessionConstraint =
21237
21278
  kind: "Profession"
21238
21279
  Profession: ProfessionConstraint
21239
21280
  }
21281
+ | {
21282
+ kind: "Group"
21283
+ Group: BlessedTraditionGroupConstraint
21284
+ }
21240
21285
  | {
21241
21286
  kind: "Religious"
21242
21287
  }
@@ -21258,6 +21303,23 @@ export interface BlessedTraditionConstraint {
21258
21303
  rarity?: Rarity
21259
21304
  }
21260
21305
 
21306
+ export interface BlessedTraditionGroupConstraint {
21307
+ /**
21308
+ * The blessed tradition group’s identifier.
21309
+ */
21310
+ id: BlessedTraditionGroup_ID
21311
+
21312
+ /**
21313
+ * Some traditions are more common than others. There may be cultures where some traditions are not represented at all.
21314
+ */
21315
+ weighted_professions?: Weighted<BlessedTradition_ID>
21316
+
21317
+ /**
21318
+ * Some traditions may be found in a culture, but are not that common.
21319
+ */
21320
+ rarity?: Rarity
21321
+ }
21322
+
21261
21323
  /**
21262
21324
  * Reference to a commonness-rated advantage or disadvantage. Commonness-rating terms used in the source books are strongly recommended, common, uncommon, suggested and unsuitable.
21263
21325
  */
package/lib/main.js CHANGED
@@ -29,6 +29,7 @@ export const schema = new Schema([
29
29
  Types.Beutelzauber,
30
30
  Types.Biome,
31
31
  Types.BlessedTradition,
32
+ Types.BlessedTraditionGroup,
32
33
  Types.Blessing,
33
34
  Types.Book,
34
35
  Types.BotanicRegion,
@@ -243,6 +243,7 @@ export declare const Culture: DB.Entity<"Culture", {
243
243
  translations: DB.MemberDecl<DB.NestedEntityMap<"CultureTranslation", {
244
244
  name: DB.MemberDecl<DB.String, true>;
245
245
  nameInPrerequisites: DB.MemberDecl<DB.String, false>;
246
+ nameOfPeople: DB.MemberDecl<DB.String, false>;
246
247
  area_knowledge: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"AreaKnowledgeTranslation", DB.Object<{
247
248
  description: DB.MemberDecl<DB.String, true>;
248
249
  abbreviated: DB.MemberDecl<DB.String, true>;
@@ -1,6 +1,6 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
2
  import { CommonnessRatedAdvantageDisadvantage } from "./_CommonnessRatedAdvantageDisadvantage.js";
3
- import { AdvantageIdentifier, BlessedTraditionIdentifier, DisadvantageIdentifier, LanguageIdentifier, LanguageSpecializationIdentifier, MagicalTraditionIdentifier, ProfessionIdentifier, ProfessionVariantIdentifier, ScriptIdentifier, SkillIdentifier, SocialStatusIdentifier, } from "./_Identifier.js";
3
+ import { AdvantageIdentifier, BlessedTraditionGroupIdentifier, BlessedTraditionIdentifier, DisadvantageIdentifier, LanguageIdentifier, LanguageSpecializationIdentifier, MagicalTraditionIdentifier, ProfessionIdentifier, ProfessionVariantIdentifier, ScriptIdentifier, SkillIdentifier, SocialStatusIdentifier, } from "./_Identifier.js";
4
4
  import { BinarySex } from "./_Sex.js";
5
5
  import { NestedTranslationMap } from "./Locale.js";
6
6
  import { Errata } from "./source/_Erratum.js";
@@ -67,6 +67,10 @@ export const Culture = DB.Entity(import.meta.url, {
67
67
  comment: "The culture’s name in prerequisites, if different from the normal culture’s name.",
68
68
  type: DB.String({ minLength: 1 }),
69
69
  }),
70
+ nameOfPeople: DB.Optional({
71
+ comment: "The name for people of this culture, if different from the normal culture’s name.",
72
+ type: DB.String({ minLength: 1 }),
73
+ }),
70
74
  area_knowledge: DB.Required({
71
75
  comment: "The description of the area knowledge.",
72
76
  type: DB.IncludeIdentifier(AreaKnowledgeTranslation),
@@ -144,6 +148,7 @@ const CommonnessWeight = DB.Enum(import.meta.url, {
144
148
  values: () => ({
145
149
  Mostly: DB.EnumCase({ type: null }),
146
150
  Only: DB.EnumCase({ type: null }),
151
+ ExceptFor: DB.EnumCase({ type: null }),
147
152
  }),
148
153
  });
149
154
  const Weighted = DB.GenTypeAlias(import.meta.url, {
@@ -243,6 +248,23 @@ const BlessedTraditionConstraint = DB.TypeAlias(import.meta.url, {
243
248
  }),
244
249
  }),
245
250
  });
251
+ const BlessedTraditionGroupConstraint = DB.TypeAlias(import.meta.url, {
252
+ name: "BlessedTraditionGroupConstraint",
253
+ type: () => DB.Object({
254
+ id: DB.Required({
255
+ comment: "The blessed tradition group’s identifier.",
256
+ type: BlessedTraditionGroupIdentifier(),
257
+ }),
258
+ weighted_professions: DB.Optional({
259
+ comment: "Some traditions are more common than others. There may be cultures where some traditions are not represented at all.",
260
+ type: DB.GenIncludeIdentifier(Weighted, [BlessedTraditionIdentifier()]),
261
+ }),
262
+ rarity: DB.Optional({
263
+ comment: "Some traditions may be found in a culture, but are not that common.",
264
+ type: DB.IncludeIdentifier(Rarity),
265
+ }),
266
+ }),
267
+ });
246
268
  const MundaneCommonProfessionConstraint = DB.Enum(import.meta.url, {
247
269
  name: "MundaneCommonProfessionConstraint",
248
270
  values: () => ({
@@ -262,6 +284,7 @@ const BlessedCommonProfessionConstraint = DB.Enum(import.meta.url, {
262
284
  values: () => ({
263
285
  Tradition: DB.EnumCase({ type: DB.IncludeIdentifier(BlessedTraditionConstraint) }),
264
286
  Profession: DB.EnumCase({ type: DB.IncludeIdentifier(ProfessionConstraint) }),
287
+ Group: DB.EnumCase({ type: DB.IncludeIdentifier(BlessedTraditionGroupConstraint) }),
265
288
  Religious: DB.EnumCase({ type: null }),
266
289
  }),
267
290
  });
@@ -27,6 +27,7 @@ export declare const BannzeichenOptionIdentifier: () => R;
27
27
  export declare const BeutelzauberIdentifier: () => R;
28
28
  export declare const BiomeIdentifier: () => R;
29
29
  export declare const BlessedTraditionIdentifier: () => R;
30
+ export declare const BlessedTraditionGroupIdentifier: () => R;
30
31
  export declare const BlessingIdentifier: () => R;
31
32
  export declare const BookIdentifier: () => R;
32
33
  export declare const BowlEnchantmentIdentifier: () => R;
@@ -128,6 +128,7 @@ import { Sermon } from "./specialAbility/Sermon.js";
128
128
  import { SexSpecialAbility } from "./specialAbility/SexSpecialAbility.js";
129
129
  import { SikaryanDrainSpecialAbility } from "./specialAbility/SikaryanDrainSpecialAbility.js";
130
130
  import { SkillStyleSpecialAbility } from "./specialAbility/SkillStyleSpecialAbility.js";
131
+ import { BlessedTraditionGroup } from "./specialAbility/sub/BlessedTraditionGroup.js";
131
132
  import { CeremonialItemSpecialAbilityGroup } from "./specialAbility/sub/CeremonialItemSpecialAbilityGroup.js";
132
133
  import { Language, LanguageSpecialization } from "./specialAbility/sub/Language.js";
133
134
  import { MagicalTraditionSubgroup } from "./specialAbility/sub/MagicalTraditionSubgroup.js";
@@ -194,6 +195,7 @@ export const BannzeichenOptionIdentifier = () => R(BannzeichenOption);
194
195
  export const BeutelzauberIdentifier = () => R(Beutelzauber);
195
196
  export const BiomeIdentifier = () => R(Biome);
196
197
  export const BlessedTraditionIdentifier = () => R(BlessedTradition);
198
+ export const BlessedTraditionGroupIdentifier = () => R(BlessedTraditionGroup);
197
199
  export const BlessingIdentifier = () => R(Blessing);
198
200
  export const BookIdentifier = () => R(Book);
199
201
  export const BowlEnchantmentIdentifier = () => R(BowlEnchantment);
@@ -132,6 +132,7 @@ export { Sermon } from "./specialAbility/Sermon.js";
132
132
  export { SexSpecialAbility } from "./specialAbility/SexSpecialAbility.js";
133
133
  export { SikaryanDrainSpecialAbility } from "./specialAbility/SikaryanDrainSpecialAbility.js";
134
134
  export { SkillStyleSpecialAbility } from "./specialAbility/SkillStyleSpecialAbility.js";
135
+ export { BlessedTraditionGroup } from "./specialAbility/sub/BlessedTraditionGroup.ts";
135
136
  export { CeremonialItemSpecialAbilityGroup } from "./specialAbility/sub/CeremonialItemSpecialAbilityGroup.js";
136
137
  export { Language } from "./specialAbility/sub/Language.js";
137
138
  export { MagicalTraditionSubgroup } from "./specialAbility/sub/MagicalTraditionSubgroup.ts";
@@ -132,6 +132,7 @@ export { Sermon } from "./specialAbility/Sermon.js";
132
132
  export { SexSpecialAbility } from "./specialAbility/SexSpecialAbility.js";
133
133
  export { SikaryanDrainSpecialAbility } from "./specialAbility/SikaryanDrainSpecialAbility.js";
134
134
  export { SkillStyleSpecialAbility } from "./specialAbility/SkillStyleSpecialAbility.js";
135
+ export { BlessedTraditionGroup } from "./specialAbility/sub/BlessedTraditionGroup.js";
135
136
  export { CeremonialItemSpecialAbilityGroup } from "./specialAbility/sub/CeremonialItemSpecialAbilityGroup.js";
136
137
  export { Language } from "./specialAbility/sub/Language.js";
137
138
  export { MagicalTraditionSubgroup } from "./specialAbility/sub/MagicalTraditionSubgroup.js";
@@ -1,5 +1,6 @@
1
1
  import * as DB from "tsondb/schema/dsl";
2
2
  export declare const BlessedTradition: DB.Entity<"BlessedTradition", {
3
+ group: DB.MemberDecl<DB.ReferenceIdentifier, true>;
3
4
  select_options: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"SelectOptions", DB.Object<{
4
5
  derived: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"SelectOptionCategory", {
5
6
  Blessings: DB.EnumCase<null>;
@@ -4,7 +4,7 @@ import { ap_value, ap_value_append, ap_value_l10n } from "../_ActivatableAdventu
4
4
  import { activatableDisplayNameCustomizer } from "../_ActivatableNames.js";
5
5
  import { explicit_select_options, select_options, verifySelectOptionRules, } from "../_ActivatableSelectOptions.js";
6
6
  import { skill_applications, skill_uses } from "../_ActivatableSkillApplicationsAndUses.js";
7
- import { AspectIdentifier, AttributeIdentifier, BlessingIdentifier, GeneralIdentifier, SkillIdentifier, } from "../_Identifier.js";
7
+ import { AspectIdentifier, AttributeIdentifier, BlessedTraditionGroupIdentifier, BlessingIdentifier, GeneralIdentifier, SkillIdentifier, } from "../_Identifier.js";
8
8
  import { CombatTechniqueIdentifier } from "../_IdentifierGroup.js";
9
9
  import { GeneralPrerequisites } from "../_Prerequisite.js";
10
10
  import { NestedTranslationMap } from "../Locale.js";
@@ -15,6 +15,10 @@ export const BlessedTradition = DB.Entity(import.meta.url, {
15
15
  name: "BlessedTradition",
16
16
  namePlural: "BlessedTraditions",
17
17
  type: () => DB.Object({
18
+ group: DB.Required({
19
+ comment: "The group of traditions this tradition belongs to.",
20
+ type: BlessedTraditionGroupIdentifier(),
21
+ }),
18
22
  select_options,
19
23
  explicit_select_options,
20
24
  skill_applications,
@@ -0,0 +1,7 @@
1
+ import * as DB from "tsondb/schema/dsl";
2
+ export declare const BlessedTraditionGroup: DB.Entity<"BlessedTraditionGroup", {
3
+ translations: DB.MemberDecl<DB.NestedEntityMap<"BlessedTraditionGroupTranslation", {
4
+ name: DB.MemberDecl<DB.String, true>;
5
+ nameInCulture: DB.MemberDecl<DB.String, true>;
6
+ }>, true>;
7
+ }, undefined>;
@@ -0,0 +1,25 @@
1
+ import * as DB from "tsondb/schema/dsl";
2
+ import { NestedTranslationMap } from "../../Locale.js";
3
+ export const BlessedTraditionGroup = DB.Entity(import.meta.url, {
4
+ name: "BlessedTraditionGroup",
5
+ namePlural: "BlessedTraditionGroup",
6
+ type: () => DB.Object({
7
+ translations: NestedTranslationMap(DB.Required, "BlessedTraditionGroup", DB.Object({
8
+ name: DB.Required({
9
+ comment: "The name of the group.",
10
+ type: DB.String({ minLength: 1 }),
11
+ }),
12
+ nameInCulture: DB.Required({
13
+ comment: "The text to use when all Blessed Ones of this group are recommended for a culture.",
14
+ type: DB.String({ minLength: 1 }),
15
+ }),
16
+ })),
17
+ }),
18
+ instanceDisplayName: {},
19
+ uniqueConstraints: [
20
+ {
21
+ entityMapKeyPath: "translations",
22
+ keyPathInEntityMap: "name",
23
+ },
24
+ ],
25
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@optolith/database-schema",
3
- "version": "0.88.0",
3
+ "version": "0.89.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",