optolith-database-schema 0.36.0 → 0.37.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,24 @@
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.37.0](https://github.com/elyukai/optolith-database-schema/compare/v0.36.1...v0.37.0) (2026-03-14)
6
+
7
+
8
+ ### ⚠ BREAKING CHANGES
9
+
10
+ * more detailed book rules and meta data
11
+
12
+ ### Features
13
+
14
+ * more detailed book rules and meta data ([04b3a74](https://github.com/elyukai/optolith-database-schema/commit/04b3a7451e8ccc629b670da95b178f115085363b))
15
+
16
+ ## [0.36.1](https://github.com/elyukai/optolith-database-schema/compare/v0.36.0...v0.36.1) (2026-03-13)
17
+
18
+
19
+ ### Features
20
+
21
+ * cost map style ([127cc6c](https://github.com/elyukai/optolith-database-schema/commit/127cc6cc48ea1c77ab4e31eb424ddc92c2cb248e))
22
+
5
23
  ## [0.36.0](https://github.com/elyukai/optolith-database-schema/compare/v0.35.0...v0.36.0) (2026-03-13)
6
24
 
7
25
 
package/gen/types.d.ts CHANGED
@@ -237,8 +237,10 @@ export type EnumMap = {
237
237
  BlessedTraditionType: BlessedTraditionType
238
238
  BlessingDuration: BlessingDuration
239
239
  BlessingRange: BlessingRange
240
+ BookContentQuality: BookContentQuality
240
241
  BookCost: BookCost
241
242
  BookCostVariant: BookCostVariant
243
+ BookRules: BookRules
242
244
  BookType: BookType
243
245
  BurningTime: BurningTime
244
246
  CantripDuration: CantripDuration
@@ -325,6 +327,7 @@ export type EnumMap = {
325
327
  MagicalSignCost: MagicalSignCost
326
328
  MagicalTraditionPrerequisiteRestriction: MagicalTraditionPrerequisiteRestriction
327
329
  MagicCommonProfessionConstraint: MagicCommonProfessionConstraint
330
+ MapStyle: MapStyle
328
331
  MathOperation: MathOperation<unknown>
329
332
  MaximumIndefiniteCurseDuration: MaximumIndefiniteCurseDuration
330
333
  MaximumIndefiniteDominationRitualDuration: MaximumIndefiniteDominationRitualDuration
@@ -483,6 +486,8 @@ export type TypeAliasMap = {
483
486
  BlessedTraditionPrerequisite: BlessedTraditionPrerequisite
484
487
  BlessedTraditionsSelectOptionCategory: BlessedTraditionsSelectOptionCategory
485
488
  BlessingPerformanceParameters: BlessingPerformanceParameters
489
+ BookRulesByEdition: BookRulesByEdition
490
+ BookRulesOfEdition: BookRulesOfEdition
486
491
  BySizeCategory: BySizeCategory<unknown>
487
492
  CalculationTranslation: CalculationTranslation
488
493
  CantripPerformanceParameters: CantripPerformanceParameters
@@ -702,6 +707,7 @@ export type TypeAliasMap = {
702
707
  PersonalityTraitEffect: PersonalityTraitEffect
703
708
  PersonalityTraitPrerequisite: PersonalityTraitPrerequisite
704
709
  PersonalityTraitPrerequisites: PersonalityTraitPrerequisites
710
+ PlainBookRules: PlainBookRules
705
711
  PlainCommonProfessions: PlainCommonProfessions
706
712
  PlainGeneralPrerequisites: PlainGeneralPrerequisites
707
713
  PlainPrerequisites: PlainPrerequisites<unknown>
@@ -2433,6 +2439,24 @@ export interface Locale {
2433
2439
  ".input {$count :number} {{check required every {$count}. application in the same month}}": string & { __params: { "count": number } }
2434
2440
  "see {$link}": string & { __params: { "link": StringableTranslationParameter } }
2435
2441
  "CoD": string
2442
+ "Romance Novel": string
2443
+ "Poetry": string
2444
+ "Political Pamphlet": string
2445
+ "Crime Story": string
2446
+ "Fairy Tale": string
2447
+ "Novel": string
2448
+ "Professional Publication": string
2449
+ "Magical Book": string
2450
+ "Religious Works": string
2451
+ "Content Quality": string
2452
+ "Modest": string
2453
+ "Average": string
2454
+ "Demanding": string
2455
+ "CL {$level}": string & { __params: { "level": StringableTranslationParameter } }
2456
+ "Availability": string
2457
+ "Reconstruction": string
2458
+ "References": string
2459
+ "Entertainment": string
2436
2460
  "Failed": string
2437
2461
  "Progress": string
2438
2462
  "Incubation Time": string
@@ -5839,6 +5863,11 @@ export interface OneTimeCostMap {
5839
5863
  */
5840
5864
  options: OneTimeCostMapOption[]
5841
5865
 
5866
+ /**
5867
+ * The style of the generated string. It may either be displayed in a compressed way (e.g. `1/2/3 AE for a small/medium/large object`) or in a verbose way (e.g. `1 AE for a small object, 2 AE for a medium object, 3 AE for a large object`). The default is `compressed`.
5868
+ */
5869
+ style?: MapStyle
5870
+
5842
5871
  /**
5843
5872
  * All translations for the entry, identified by IETF language tag (BCP47).
5844
5873
  */
@@ -5895,6 +5924,17 @@ export interface OneTimeCostMapOptionTranslation {
5895
5924
  label_standalone?: ResponsiveTextOptional
5896
5925
  }
5897
5926
 
5927
+ /**
5928
+ * The style of the generated string. It may either be displayed in a compressed way (e.g. `1/2/3 AE for a small/medium/large object`) or in a verbose way (e.g. `1 AE for a small object, 2 AE for a medium object, 3 AE for a large object`).
5929
+ */
5930
+ export type MapStyle =
5931
+ | {
5932
+ kind: "Compressed"
5933
+ }
5934
+ | {
5935
+ kind: "Verbose"
5936
+ }
5937
+
5898
5938
  export interface Range {
5899
5939
  /**
5900
5940
  * The range value.
@@ -19999,6 +20039,11 @@ export interface Book {
19999
20039
  */
20000
20040
  structure_points?: StructurePoints
20001
20041
 
20042
+ /**
20043
+ * The quality of the book’s content.
20044
+ */
20045
+ contentQuality?: BookContentQuality
20046
+
20002
20047
  /**
20003
20048
  * References to where in which publications this entry has been defined. Entries may also be added or removed in later printings.
20004
20049
  */
@@ -20046,7 +20091,22 @@ export interface BookTranslation {
20046
20091
  /**
20047
20092
  * Special rules text.
20048
20093
  */
20049
- rules?: string
20094
+ rules?: BookRules
20095
+
20096
+ /**
20097
+ * The legality of the item, if specified.
20098
+ */
20099
+ legality?: string
20100
+
20101
+ /**
20102
+ * The availability of the item, if specified.
20103
+ */
20104
+ availability?: string
20105
+
20106
+ /**
20107
+ * Special properties or features of the item.
20108
+ */
20109
+ special?: string
20050
20110
 
20051
20111
  errata?: Errata
20052
20112
  }
@@ -20167,6 +20227,96 @@ export interface IndefiniteBookCostVariantTranslation {
20167
20227
  description: string
20168
20228
  }
20169
20229
 
20230
+ /**
20231
+ * The quality of the book’s content.
20232
+ */
20233
+ export type BookContentQuality =
20234
+ | {
20235
+ kind: "Modest"
20236
+ }
20237
+ | {
20238
+ kind: "Average"
20239
+ }
20240
+ | {
20241
+ kind: "Demanding"
20242
+ Demanding: number
20243
+ }
20244
+
20245
+ /**
20246
+ * Skills and abilities you can learn by reading the book, as well as any other rules and effects concerning the book.
20247
+ */
20248
+ export type BookRules =
20249
+ | {
20250
+ kind: "Plain"
20251
+ Plain: PlainBookRules
20252
+ }
20253
+ | {
20254
+ kind: "Entertainment"
20255
+ }
20256
+ | {
20257
+ kind: "ByEdition"
20258
+ ByEdition: BookRulesByEdition
20259
+ }
20260
+
20261
+ /**
20262
+ * The book’s rules without any special effects or conditions.
20263
+ */
20264
+ export interface PlainBookRules {
20265
+ /**
20266
+ * The (main) rules text.
20267
+ */
20268
+ text: string
20269
+
20270
+ /**
20271
+ * Rules for reconstructing certain skills or abilities from the book.
20272
+ */
20273
+ reconstruction?: string
20274
+
20275
+ /**
20276
+ * References to skills and abilities that, while mentioned in the book, cannot be learned from this book alone.
20277
+ */
20278
+ references?: string
20279
+
20280
+ /**
20281
+ * Additional rules text that comes after all other rules.
20282
+ */
20283
+ textAfter?: string
20284
+ }
20285
+
20286
+ /**
20287
+ * The book’s rules with differences between each edition and more differentiation between types of rules.
20288
+ */
20289
+ export interface BookRulesByEdition {
20290
+ editions: BookRulesOfEdition[]
20291
+
20292
+ /**
20293
+ * Rules for reconstructing certain skills or abilities from the book.
20294
+ */
20295
+ reconstruction?: string
20296
+
20297
+ /**
20298
+ * References to skills and abilities that, while mentioned in the book, cannot be learned from this book alone.
20299
+ */
20300
+ references?: string
20301
+
20302
+ /**
20303
+ * Additional rules text that comes after all other rules.
20304
+ */
20305
+ textAfter?: string
20306
+ }
20307
+
20308
+ export interface BookRulesOfEdition {
20309
+ /**
20310
+ * The edition(s) the rules apply to.
20311
+ */
20312
+ label: string
20313
+
20314
+ /**
20315
+ * The rules text.
20316
+ */
20317
+ text: string
20318
+ }
20319
+
20170
20320
  export interface CeremonialItem {
20171
20321
  /**
20172
20322
  * The cost in silverthalers.
@@ -149,6 +149,10 @@ export declare const Ceremony: DB.Entity<"Ceremony", {
149
149
  }>, []>>, false>;
150
150
  }>, false>;
151
151
  }>, []>>>, true>;
152
+ style: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"MapStyle", {
153
+ Compressed: DB.EnumCase<null>;
154
+ Verbose: DB.EnumCase<null>;
155
+ }, []>>, false>;
152
156
  translations: DB.MemberDecl<DB.NestedEntityMap<"OneTimeCostMapTranslation", {
153
157
  list_prepend: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"ResponsiveTextOptional", DB.Object<{
154
158
  full: DB.MemberDecl<DB.String, true>;
@@ -149,6 +149,10 @@ export declare const LiturgicalChant: DB.Entity<"LiturgicalChant", {
149
149
  }>, []>>, false>;
150
150
  }>, false>;
151
151
  }>, []>>>, true>;
152
+ style: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"MapStyle", {
153
+ Compressed: DB.EnumCase<null>;
154
+ Verbose: DB.EnumCase<null>;
155
+ }, []>>, false>;
152
156
  translations: DB.MemberDecl<DB.NestedEntityMap<"OneTimeCostMapTranslation", {
153
157
  list_prepend: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"ResponsiveTextOptional", DB.Object<{
154
158
  full: DB.MemberDecl<DB.String, true>;
@@ -1477,6 +1477,24 @@ export declare const Locale: DB.Entity<"Locale", {
1477
1477
  ".input {$count :number} {{check required every {$count}. application in the same month}}": null;
1478
1478
  "see {$link}": null;
1479
1479
  CoD: null;
1480
+ "Romance Novel": null;
1481
+ Poetry: null;
1482
+ "Political Pamphlet": null;
1483
+ "Crime Story": null;
1484
+ "Fairy Tale": null;
1485
+ Novel: null;
1486
+ "Professional Publication": null;
1487
+ "Magical Book": null;
1488
+ "Religious Works": null;
1489
+ "Content Quality": null;
1490
+ Modest: null;
1491
+ Average: null;
1492
+ Demanding: null;
1493
+ "CL {$level}": null;
1494
+ Availability: null;
1495
+ Reconstruction: null;
1496
+ References: null;
1497
+ Entertainment: null;
1480
1498
  Failed: null;
1481
1499
  Progress: null;
1482
1500
  "Incubation Time": null;
@@ -1518,6 +1518,25 @@ export const Locale = DB.Entity(import.meta.url, {
1518
1518
  ".input {$count :number} {{check required every {$count}. application in the same month}}": null,
1519
1519
  "see {$link}": null,
1520
1520
  "CoD": null,
1521
+ // books
1522
+ "Romance Novel": null,
1523
+ "Poetry": null,
1524
+ "Political Pamphlet": null,
1525
+ "Crime Story": null,
1526
+ "Fairy Tale": null,
1527
+ "Novel": null,
1528
+ "Professional Publication": null,
1529
+ "Magical Book": null,
1530
+ "Religious Works": null,
1531
+ "Content Quality": null,
1532
+ "Modest": null,
1533
+ "Average": null,
1534
+ "Demanding": null,
1535
+ "CL {$level}": null,
1536
+ "Availability": null,
1537
+ "Reconstruction": null,
1538
+ "References": null,
1539
+ "Entertainment": null,
1521
1540
  // sex practices
1522
1541
  "Failed": null,
1523
1542
  // diseases
@@ -149,6 +149,10 @@ export declare const Ritual: DB.Entity<"Ritual", {
149
149
  }>, []>>, false>;
150
150
  }>, false>;
151
151
  }>, []>>>, true>;
152
+ style: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"MapStyle", {
153
+ Compressed: DB.EnumCase<null>;
154
+ Verbose: DB.EnumCase<null>;
155
+ }, []>>, false>;
152
156
  translations: DB.MemberDecl<DB.NestedEntityMap<"OneTimeCostMapTranslation", {
153
157
  list_prepend: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"ResponsiveTextOptional", DB.Object<{
154
158
  full: DB.MemberDecl<DB.String, true>;
@@ -149,6 +149,10 @@ export declare const Spell: DB.Entity<"Spell", {
149
149
  }>, []>>, false>;
150
150
  }>, false>;
151
151
  }>, []>>>, true>;
152
+ style: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"MapStyle", {
153
+ Compressed: DB.EnumCase<null>;
154
+ Verbose: DB.EnumCase<null>;
155
+ }, []>>, false>;
152
156
  translations: DB.MemberDecl<DB.NestedEntityMap<"OneTimeCostMapTranslation", {
153
157
  list_prepend: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"ResponsiveTextOptional", DB.Object<{
154
158
  full: DB.MemberDecl<DB.String, true>;
@@ -140,6 +140,10 @@ export declare const OneTimePerformanceParameters: DB.TypeAlias<"OneTimePerforma
140
140
  }>, []>>, false>;
141
141
  }>, false>;
142
142
  }>, []>>>, true>;
143
+ style: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"MapStyle", {
144
+ Compressed: DB.EnumCase<null>;
145
+ Verbose: DB.EnumCase<null>;
146
+ }, []>>, false>;
143
147
  translations: DB.MemberDecl<DB.NestedEntityMap<"OneTimeCostMapTranslation", {
144
148
  list_prepend: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"ResponsiveTextOptional", DB.Object<{
145
149
  full: DB.MemberDecl<DB.String, true>;
@@ -442,6 +446,10 @@ export declare const FastPerformanceParameters: DB.Enum<"FastPerformanceParamete
442
446
  }>, []>>, false>;
443
447
  }>, false>;
444
448
  }>, []>>>, true>;
449
+ style: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"MapStyle", {
450
+ Compressed: DB.EnumCase<null>;
451
+ Verbose: DB.EnumCase<null>;
452
+ }, []>>, false>;
445
453
  translations: DB.MemberDecl<DB.NestedEntityMap<"OneTimeCostMapTranslation", {
446
454
  list_prepend: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"ResponsiveTextOptional", DB.Object<{
447
455
  full: DB.MemberDecl<DB.String, true>;
@@ -893,6 +901,10 @@ export declare const SlowPerformanceParameters: DB.Enum<"SlowPerformanceParamete
893
901
  }>, []>>, false>;
894
902
  }>, false>;
895
903
  }>, []>>>, true>;
904
+ style: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"MapStyle", {
905
+ Compressed: DB.EnumCase<null>;
906
+ Verbose: DB.EnumCase<null>;
907
+ }, []>>, false>;
896
908
  translations: DB.MemberDecl<DB.NestedEntityMap<"OneTimeCostMapTranslation", {
897
909
  list_prepend: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"ResponsiveTextOptional", DB.Object<{
898
910
  full: DB.MemberDecl<DB.String, true>;
@@ -135,6 +135,10 @@ export declare const OneTimeCost: DB.Enum<"OneTimeCost", {
135
135
  }>, []>>, false>;
136
136
  }>, false>;
137
137
  }>, []>>>, true>;
138
+ style: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"MapStyle", {
139
+ Compressed: DB.EnumCase<null>;
140
+ Verbose: DB.EnumCase<null>;
141
+ }, []>>, false>;
138
142
  translations: DB.MemberDecl<DB.NestedEntityMap<"OneTimeCostMapTranslation", {
139
143
  list_prepend: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"ResponsiveTextOptional", DB.Object<{
140
144
  full: DB.MemberDecl<DB.String, true>;
@@ -183,6 +187,10 @@ export declare const OneTimeCostMap: DB.TypeAlias<"OneTimeCostMap", DB.Object<{
183
187
  }>, []>>, false>;
184
188
  }>, false>;
185
189
  }>, []>>>, true>;
190
+ style: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"MapStyle", {
191
+ Compressed: DB.EnumCase<null>;
192
+ Verbose: DB.EnumCase<null>;
193
+ }, []>>, false>;
186
194
  translations: DB.MemberDecl<DB.NestedEntityMap<"OneTimeCostMapTranslation", {
187
195
  list_prepend: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"ResponsiveTextOptional", DB.Object<{
188
196
  full: DB.MemberDecl<DB.String, true>;
@@ -198,6 +206,10 @@ export declare const OneTimeCostMap: DB.TypeAlias<"OneTimeCostMap", DB.Object<{
198
206
  }>, []>>, false>;
199
207
  }>, false>;
200
208
  }>, []>;
209
+ export declare const MapStyle: DB.Enum<"MapStyle", {
210
+ Compressed: DB.EnumCase<null>;
211
+ Verbose: DB.EnumCase<null>;
212
+ }, []>;
201
213
  export declare const SustainedCost: DB.Enum<"SustainedCost", {
202
214
  Modifiable: DB.EnumCase<DB.IncludeIdentifier<[], DB.TypeAlias<"ModifiableSustainedCost", DB.Object<{
203
215
  initial_modification_level: DB.MemberDecl<DB.ReferenceIdentifier, true>;
@@ -123,6 +123,10 @@ This will generate the exact same string as seen above – given it is set for a
123
123
  minItems: 2,
124
124
  }),
125
125
  }),
126
+ style: DB.Optional({
127
+ comment: "The style of the generated string. It may either be displayed in a compressed way (e.g. `1/2/3 AE for a small/medium/large object`) or in a verbose way (e.g. `1 AE for a small object, 2 AE for a medium object, 3 AE for a large object`). The default is `compressed`.",
128
+ type: DB.IncludeIdentifier(MapStyle),
129
+ }),
126
130
  translations: NestedTranslationMap(DB.Optional, "OneTimeCostMap", DB.Object({
127
131
  list_prepend: DB.Optional({
128
132
  comment: "Place a string between the `for` and the grouped map option labels.",
@@ -162,6 +166,14 @@ const OneTimeCostMapOption = DB.TypeAlias(import.meta.url, {
162
166
  })),
163
167
  }),
164
168
  });
169
+ export const MapStyle = DB.Enum(import.meta.url, {
170
+ name: "MapStyle",
171
+ comment: "The style of the generated string. It may either be displayed in a compressed way (e.g. `1/2/3 AE for a small/medium/large object`) or in a verbose way (e.g. `1 AE for a small object, 2 AE for a medium object, 3 AE for a large object`).",
172
+ values: () => ({
173
+ Compressed: DB.EnumCase({ type: null }),
174
+ Verbose: DB.EnumCase({ type: null }),
175
+ }),
176
+ });
165
177
  export const SustainedCost = DB.Enum(import.meta.url, {
166
178
  name: "SustainedCost",
167
179
  values: () => ({
@@ -88,6 +88,11 @@ export declare const Book: DB.Entity<"Book", {
88
88
  structure_points: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"StructurePoints", DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"StructurePointsComponent", DB.Object<{
89
89
  points: DB.MemberDecl<DB.Integer, true>;
90
90
  }>, []>>>, []>>, false>;
91
+ contentQuality: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"BookContentQuality", {
92
+ Modest: DB.EnumCase<null>;
93
+ Average: DB.EnumCase<null>;
94
+ Demanding: DB.EnumCase<DB.Integer>;
95
+ }, []>>, false>;
91
96
  src: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"PublicationRefs", DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"PublicationRef", DB.Object<{
92
97
  id: DB.MemberDecl<DB.ReferenceIdentifier, true>;
93
98
  occurrences: DB.MemberDecl<DB.NestedEntityMap<string, {
@@ -135,7 +140,27 @@ export declare const Book: DB.Entity<"Book", {
135
140
  language: DB.MemberDecl<DB.String, false>;
136
141
  script: DB.MemberDecl<DB.String, false>;
137
142
  note: DB.MemberDecl<DB.String, false>;
138
- rules: DB.MemberDecl<DB.String, false>;
143
+ rules: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"BookRules", {
144
+ Plain: DB.EnumCase<DB.IncludeIdentifier<[], DB.TypeAlias<"PlainBookRules", DB.Object<{
145
+ text: DB.MemberDecl<DB.String, true>;
146
+ reconstruction: DB.MemberDecl<DB.String, false>;
147
+ references: DB.MemberDecl<DB.String, false>;
148
+ textAfter: DB.MemberDecl<DB.String, false>;
149
+ }>, []>>>;
150
+ Entertainment: DB.EnumCase<null>;
151
+ ByEdition: DB.EnumCase<DB.IncludeIdentifier<[], DB.TypeAlias<"BookRulesByEdition", DB.Object<{
152
+ editions: DB.MemberDecl<DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"BookRulesOfEdition", DB.Object<{
153
+ label: DB.MemberDecl<DB.String, true>;
154
+ text: DB.MemberDecl<DB.String, true>;
155
+ }>, []>>>, true>;
156
+ reconstruction: DB.MemberDecl<DB.String, false>;
157
+ references: DB.MemberDecl<DB.String, false>;
158
+ textAfter: DB.MemberDecl<DB.String, false>;
159
+ }>, []>>>;
160
+ }, []>>, false>;
161
+ legality: DB.MemberDecl<DB.String, false>;
162
+ availability: DB.MemberDecl<DB.String, false>;
163
+ special: DB.MemberDecl<DB.String, false>;
139
164
  errata: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"Errata", DB.Array<DB.IncludeIdentifier<[], DB.TypeAlias<"Erratum", DB.Object<{
140
165
  date: DB.MemberDecl<DB.Date, true>;
141
166
  description: DB.MemberDecl<DB.String, true>;
@@ -28,6 +28,10 @@ export const Book = DB.Entity(import.meta.url, {
28
28
  comment: "The structure points of the item. Use an array if the item consists of multiple components that have individual structure points.",
29
29
  type: DB.IncludeIdentifier(StructurePoints),
30
30
  }),
31
+ contentQuality: DB.Optional({
32
+ comment: "The quality of the book’s content.",
33
+ type: DB.IncludeIdentifier(BookContentQuality),
34
+ }),
31
35
  src,
32
36
  translations: NestedTranslationMap(DB.Required, "Book", DB.Object({
33
37
  name: DB.Required({
@@ -52,6 +56,18 @@ export const Book = DB.Entity(import.meta.url, {
52
56
  }),
53
57
  rules: DB.Optional({
54
58
  comment: "Special rules text.",
59
+ type: DB.IncludeIdentifier(BookRules),
60
+ }),
61
+ legality: DB.Optional({
62
+ comment: "The legality of the item, if specified.",
63
+ type: DB.String({ minLength: 1, markdown: "inline" }),
64
+ }),
65
+ availability: DB.Optional({
66
+ comment: "The availability of the item, if specified.",
67
+ type: DB.String({ minLength: 1, markdown: "inline" }),
68
+ }),
69
+ special: DB.Optional({
70
+ comment: "Special properties or features of the item.",
55
71
  type: DB.String({ minLength: 1, markdown: "block" }),
56
72
  }),
57
73
  errata: DB.Optional({
@@ -179,3 +195,77 @@ const IndefiniteBookCostVariant = DB.TypeAlias(import.meta.url, {
179
195
  })),
180
196
  }),
181
197
  });
198
+ const BookContentQuality = DB.Enum(import.meta.url, {
199
+ name: "BookContentQuality",
200
+ comment: "The quality of the book’s content.",
201
+ values: () => ({
202
+ Modest: DB.EnumCase({ type: null }),
203
+ Average: DB.EnumCase({ type: null }),
204
+ Demanding: DB.EnumCase({ type: DB.Integer({ minimum: 1, maximum: 3 }) }),
205
+ }),
206
+ });
207
+ const BookRules = DB.Enum(import.meta.url, {
208
+ name: "BookRules",
209
+ comment: "Skills and abilities you can learn by reading the book, as well as any other rules and effects concerning the book.",
210
+ values: () => ({
211
+ Plain: DB.EnumCase({ type: DB.IncludeIdentifier(PlainBookRules) }),
212
+ Entertainment: DB.EnumCase({ type: null }),
213
+ ByEdition: DB.EnumCase({ type: DB.IncludeIdentifier(BookRulesByEdition) }),
214
+ }),
215
+ });
216
+ const PlainBookRules = DB.TypeAlias(import.meta.url, {
217
+ name: "PlainBookRules",
218
+ comment: "The book’s rules without any special effects or conditions.",
219
+ type: () => DB.Object({
220
+ text: DB.Required({
221
+ comment: "The (main) rules text.",
222
+ type: DB.String({ minLength: 1, markdown: "block" }),
223
+ }),
224
+ reconstruction: DB.Optional({
225
+ comment: "Rules for reconstructing certain skills or abilities from the book.",
226
+ type: DB.String({ minLength: 1, markdown: "block" }),
227
+ }),
228
+ references: DB.Optional({
229
+ comment: "References to skills and abilities that, while mentioned in the book, cannot be learned from this book alone.",
230
+ type: DB.String({ minLength: 1, markdown: "block" }),
231
+ }),
232
+ textAfter: DB.Optional({
233
+ comment: "Additional rules text that comes after all other rules.",
234
+ type: DB.String({ minLength: 1, markdown: "block" }),
235
+ }),
236
+ }),
237
+ });
238
+ const BookRulesByEdition = DB.TypeAlias(import.meta.url, {
239
+ name: "BookRulesByEdition",
240
+ comment: "The book’s rules with differences between each edition and more differentiation between types of rules.",
241
+ type: () => DB.Object({
242
+ editions: DB.Required({
243
+ type: DB.Array(DB.IncludeIdentifier(BookRulesOfEdition), { minItems: 1 }),
244
+ }),
245
+ reconstruction: DB.Optional({
246
+ comment: "Rules for reconstructing certain skills or abilities from the book.",
247
+ type: DB.String({ minLength: 1, markdown: "block" }),
248
+ }),
249
+ references: DB.Optional({
250
+ comment: "References to skills and abilities that, while mentioned in the book, cannot be learned from this book alone.",
251
+ type: DB.String({ minLength: 1, markdown: "block" }),
252
+ }),
253
+ textAfter: DB.Optional({
254
+ comment: "Additional rules text that comes after all other rules.",
255
+ type: DB.String({ minLength: 1, markdown: "block" }),
256
+ }),
257
+ }),
258
+ });
259
+ const BookRulesOfEdition = DB.TypeAlias(import.meta.url, {
260
+ name: "BookRulesOfEdition",
261
+ type: () => DB.Object({
262
+ label: DB.Required({
263
+ comment: "The edition(s) the rules apply to.",
264
+ type: DB.String({ minLength: 1 }),
265
+ }),
266
+ text: DB.Required({
267
+ comment: "The rules text.",
268
+ type: DB.String({ minLength: 1, markdown: "block" }),
269
+ }),
270
+ }),
271
+ });
@@ -28,6 +28,10 @@ export declare const GeodeRitual: DB.Entity<"GeodeRitual", {
28
28
  }>, []>>, false>;
29
29
  }>, false>;
30
30
  }>, []>>>, true>;
31
+ style: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"MapStyle", {
32
+ Compressed: DB.EnumCase<null>;
33
+ Verbose: DB.EnumCase<null>;
34
+ }, []>>, false>;
31
35
  translations: DB.MemberDecl<DB.NestedEntityMap<"OneTimeCostMapTranslation", {
32
36
  list_prepend: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"ResponsiveTextOptional", DB.Object<{
33
37
  full: DB.MemberDecl<DB.String, true>;
@@ -148,6 +148,10 @@ export declare const ZibiljaRitual: DB.Entity<"ZibiljaRitual", {
148
148
  }>, []>>, false>;
149
149
  }>, false>;
150
150
  }>, []>>>, true>;
151
+ style: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"MapStyle", {
152
+ Compressed: DB.EnumCase<null>;
153
+ Verbose: DB.EnumCase<null>;
154
+ }, []>>, false>;
151
155
  translations: DB.MemberDecl<DB.NestedEntityMap<"OneTimeCostMapTranslation", {
152
156
  list_prepend: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"ResponsiveTextOptional", DB.Object<{
153
157
  full: DB.MemberDecl<DB.String, true>;
@@ -47,6 +47,10 @@ export declare const MagicalSign: DB.Entity<"MagicalSign", {
47
47
  }>, []>>, false>;
48
48
  }>, false>;
49
49
  }>, []>>>, true>;
50
+ style: DB.MemberDecl<DB.IncludeIdentifier<[], DB.Enum<"MapStyle", {
51
+ Compressed: DB.EnumCase<null>;
52
+ Verbose: DB.EnumCase<null>;
53
+ }, []>>, false>;
50
54
  translations: DB.MemberDecl<DB.NestedEntityMap<"OneTimeCostMapTranslation", {
51
55
  list_prepend: DB.MemberDecl<DB.IncludeIdentifier<[], DB.TypeAlias<"ResponsiveTextOptional", DB.Object<{
52
56
  full: DB.MemberDecl<DB.String, true>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "optolith-database-schema",
3
- "version": "0.36.0",
3
+ "version": "0.37.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",