optolith-database-schema 0.24.3 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/gen/types.d.ts +49 -6
  3. package/lib/main.d.ts +7 -0
  4. package/lib/test.d.ts +1 -1
  5. package/lib/test.js +10 -1
  6. package/lib/types/Advantage.js +7 -0
  7. package/lib/types/AnimalDisease.js +6 -0
  8. package/lib/types/AnimalType.js +6 -0
  9. package/lib/types/ArcaneBardTradition.js +6 -0
  10. package/lib/types/ArcaneDancerTradition.js +6 -0
  11. package/lib/types/Aspect.js +6 -0
  12. package/lib/types/Attribute.js +10 -0
  13. package/lib/types/Blessing.js +6 -0
  14. package/lib/types/Cantrip.js +6 -0
  15. package/lib/types/Ceremony.js +6 -0
  16. package/lib/types/CombatTechnique.d.ts +79 -55
  17. package/lib/types/CombatTechnique.js +37 -7
  18. package/lib/types/Condition.js +6 -0
  19. package/lib/types/Continent.js +6 -0
  20. package/lib/types/Culture.js +6 -0
  21. package/lib/types/DerivedCharacteristic.js +10 -0
  22. package/lib/types/Disadvantage.js +7 -0
  23. package/lib/types/Disease.js +6 -0
  24. package/lib/types/Element.js +6 -0
  25. package/lib/types/ExperienceLevel.js +6 -0
  26. package/lib/types/EyeColor.js +6 -0
  27. package/lib/types/FamiliarsTrick.js +6 -0
  28. package/lib/types/HairColor.js +6 -0
  29. package/lib/types/Lessons.js +12 -0
  30. package/lib/types/LiturgicalChant.js +6 -0
  31. package/lib/types/Locale.js +10 -0
  32. package/lib/types/MetaCondition.js +6 -0
  33. package/lib/types/PactCategory.js +36 -0
  34. package/lib/types/Patron.js +6 -0
  35. package/lib/types/PatronCategory.js +6 -0
  36. package/lib/types/PersonalityTrait.js +6 -0
  37. package/lib/types/Profession.d.ts +25 -0
  38. package/lib/types/Profession.js +16 -0
  39. package/lib/types/Property.js +6 -0
  40. package/lib/types/Race.js +17 -0
  41. package/lib/types/Region.js +6 -0
  42. package/lib/types/Ritual.js +6 -0
  43. package/lib/types/Service.js +6 -0
  44. package/lib/types/SexPractice.js +6 -0
  45. package/lib/types/Skill.js +15 -0
  46. package/lib/types/SkillGroup.js +6 -0
  47. package/lib/types/SkillModificationLevel.js +8 -0
  48. package/lib/types/SocialStatus.js +7 -0
  49. package/lib/types/Spell.js +6 -0
  50. package/lib/types/State.js +6 -0
  51. package/lib/types/Talisman.js +6 -0
  52. package/lib/types/TargetCategory.js +6 -0
  53. package/lib/types/_ActivatableSelectOptions.js +11 -0
  54. package/lib/types/_Enhancements.js +11 -0
  55. package/lib/types/_Influence.js +6 -0
  56. package/lib/types/equipment/EquipmentPackage.js +6 -0
  57. package/lib/types/equipment/item/Ammunition.js +6 -0
  58. package/lib/types/equipment/item/Animal.js +6 -0
  59. package/lib/types/equipment/item/AnimalCare.js +6 -0
  60. package/lib/types/equipment/item/Armor.js +6 -0
  61. package/lib/types/equipment/item/BandageOrRemedy.js +16 -0
  62. package/lib/types/equipment/item/Book.js +6 -0
  63. package/lib/types/equipment/item/CeremonialItem.js +16 -0
  64. package/lib/types/equipment/item/Clothes.js +16 -0
  65. package/lib/types/equipment/item/Container.js +16 -0
  66. package/lib/types/equipment/item/Elixir.js +6 -0
  67. package/lib/types/equipment/item/EquipmentOfBlessedOnes.js +16 -0
  68. package/lib/types/equipment/item/GemOrPreciousStone.js +6 -0
  69. package/lib/types/equipment/item/IlluminationLightSource.js +16 -0
  70. package/lib/types/equipment/item/IlluminationRefillOrSupply.js +16 -0
  71. package/lib/types/equipment/item/Jewelry.js +6 -0
  72. package/lib/types/equipment/item/Laboratory.js +6 -0
  73. package/lib/types/equipment/item/Liebesspielzeug.js +16 -0
  74. package/lib/types/equipment/item/LuxuryGood.js +16 -0
  75. package/lib/types/equipment/item/MagicalArtifact.js +16 -0
  76. package/lib/types/equipment/item/MusicalInstrument.js +16 -0
  77. package/lib/types/equipment/item/Newspaper.js +6 -0
  78. package/lib/types/equipment/item/Poison.js +6 -0
  79. package/lib/types/equipment/item/ToolOfTheTrade.js +6 -0
  80. package/lib/types/equipment/item/TravelGearOrTool.js +16 -0
  81. package/lib/types/equipment/item/Vehicle.js +6 -0
  82. package/lib/types/equipment/item/Weapon.d.ts +45 -45
  83. package/lib/types/equipment/item/Weapon.js +13 -5
  84. package/lib/types/equipment/item/WeaponAccessory.js +16 -0
  85. package/lib/types/equipment/item/_Item.js +19 -1
  86. package/lib/types/equipment/item/_Weapon.d.ts +13 -4
  87. package/lib/types/equipment/item/_Weapon.js +32 -4
  88. package/lib/types/equipment/item/sub/ArmorType.js +6 -0
  89. package/lib/types/equipment/item/sub/Reach.js +6 -0
  90. package/lib/types/magicalActions/AnimistPower.js +6 -0
  91. package/lib/types/magicalActions/AnimistPower_Tribe.js +6 -0
  92. package/lib/types/magicalActions/Curse.js +6 -0
  93. package/lib/types/magicalActions/DominationRitual.js +6 -0
  94. package/lib/types/magicalActions/ElvenMagicalSong.js +6 -0
  95. package/lib/types/magicalActions/GeodeRitual.js +6 -0
  96. package/lib/types/magicalActions/JesterTrick.js +6 -0
  97. package/lib/types/magicalActions/MagicalDance.js +6 -0
  98. package/lib/types/magicalActions/MagicalMelody.js +6 -0
  99. package/lib/types/magicalActions/MagicalRune.js +6 -0
  100. package/lib/types/magicalActions/ZibiljaRitual.js +6 -0
  101. package/lib/types/rule/AlternativeRule.js +6 -0
  102. package/lib/types/rule/CoreRule.js +6 -0
  103. package/lib/types/rule/FocusRule.js +6 -0
  104. package/lib/types/rule/FocusRule_Subject.js +6 -0
  105. package/lib/types/rule/OptionalRule.js +6 -0
  106. package/lib/types/source/Publication.js +6 -0
  107. package/lib/types/specialAbility/AdvancedCombatSpecialAbility.js +7 -0
  108. package/lib/types/specialAbility/AdvancedKarmaSpecialAbility.js +7 -0
  109. package/lib/types/specialAbility/AdvancedMagicalSpecialAbility.js +7 -0
  110. package/lib/types/specialAbility/AdvancedSkillSpecialAbility.js +7 -0
  111. package/lib/types/specialAbility/AncestorGlyph.js +7 -0
  112. package/lib/types/specialAbility/BlessedTradition.js +7 -0
  113. package/lib/types/specialAbility/BrawlingSpecialAbility.js +7 -0
  114. package/lib/types/specialAbility/CeremonialItemSpecialAbility.js +12 -0
  115. package/lib/types/specialAbility/CombatSpecialAbility.js +7 -0
  116. package/lib/types/specialAbility/CombatStyleSpecialAbility.js +7 -0
  117. package/lib/types/specialAbility/CommandSpecialAbility.js +7 -0
  118. package/lib/types/specialAbility/FamiliarSpecialAbility.js +7 -0
  119. package/lib/types/specialAbility/FatePointSexSpecialAbility.js +7 -0
  120. package/lib/types/specialAbility/FatePointSpecialAbility.js +7 -0
  121. package/lib/types/specialAbility/GeneralSpecialAbility.js +7 -0
  122. package/lib/types/specialAbility/KarmaSpecialAbility.js +7 -0
  123. package/lib/types/specialAbility/LiturgicalStyleSpecialAbility.js +7 -0
  124. package/lib/types/specialAbility/LycantropicGift.js +7 -0
  125. package/lib/types/specialAbility/MagicStyleSpecialAbility.js +7 -0
  126. package/lib/types/specialAbility/MagicalSign.js +7 -0
  127. package/lib/types/specialAbility/MagicalSpecialAbility.js +7 -0
  128. package/lib/types/specialAbility/MagicalTradition.js +7 -0
  129. package/lib/types/specialAbility/PactGift.js +7 -0
  130. package/lib/types/specialAbility/ProtectiveWardingCircleSpecialAbility.js +7 -0
  131. package/lib/types/specialAbility/Sermon.js +7 -0
  132. package/lib/types/specialAbility/SexSpecialAbility.js +7 -0
  133. package/lib/types/specialAbility/SikaryanDrainSpecialAbility.js +7 -0
  134. package/lib/types/specialAbility/SkillStyleSpecialAbility.js +7 -0
  135. package/lib/types/specialAbility/VampiricGift.js +7 -0
  136. package/lib/types/specialAbility/Vision.js +7 -0
  137. package/lib/types/specialAbility/sub/Language.js +6 -0
  138. package/lib/types/specialAbility/sub/Script.js +6 -0
  139. package/lib/types/specialAbility/sub/TradeSecret.js +6 -0
  140. package/lib/types/traditionArtifacts/ArcaneOrbEnchantment.js +7 -0
  141. package/lib/types/traditionArtifacts/AttireEnchantment.js +7 -0
  142. package/lib/types/traditionArtifacts/Beutelzauber.js +7 -0
  143. package/lib/types/traditionArtifacts/BowlEnchantment.js +7 -0
  144. package/lib/types/traditionArtifacts/CauldronEnchantment.js +7 -0
  145. package/lib/types/traditionArtifacts/ChronicleEnchantment.js +7 -0
  146. package/lib/types/traditionArtifacts/DaggerRitual.js +7 -0
  147. package/lib/types/traditionArtifacts/FoolsHatEnchantment.js +7 -0
  148. package/lib/types/traditionArtifacts/Haubenzauber.js +7 -0
  149. package/lib/types/traditionArtifacts/InstrumentEnchantment.js +7 -0
  150. package/lib/types/traditionArtifacts/Krallenkettenzauber.js +7 -0
  151. package/lib/types/traditionArtifacts/Kristallkugelzauber.js +7 -0
  152. package/lib/types/traditionArtifacts/OrbEnchantment.js +7 -0
  153. package/lib/types/traditionArtifacts/RingEnchantment.js +7 -0
  154. package/lib/types/traditionArtifacts/SickleRitual.js +7 -0
  155. package/lib/types/traditionArtifacts/SpellSwordEnchantment.js +7 -0
  156. package/lib/types/traditionArtifacts/StaffEnchantment.js +7 -0
  157. package/lib/types/traditionArtifacts/ToyEnchantment.js +7 -0
  158. package/lib/types/traditionArtifacts/Trinkhornzauber.js +7 -0
  159. package/lib/types/traditionArtifacts/WandEnchantment.js +7 -0
  160. package/lib/types/traditionArtifacts/WeaponEnchantment.js +7 -0
  161. package/package.json +2 -2
@@ -1,16 +1,16 @@
1
- import { Entity, IncludeIdentifier, NestedEntityMap, Object, String, TypeAlias } from "tsondb/schema/def";
1
+ import { Entity, IncludeIdentifier, NestedEntityMap, ObjectType, String, TypeAlias } from "tsondb/schema/def";
2
2
  export declare const Weapon: Entity<"Weapon", {
3
3
  cost: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"Cost", {
4
4
  Free: import("tsondb/schema/def").EnumCaseDecl<null>;
5
5
  Various: import("tsondb/schema/def").EnumCaseDecl<null>;
6
6
  Invaluable: import("tsondb/schema/def").EnumCaseDecl<null>;
7
- Fixed: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"FixedCost", Object<{
7
+ Fixed: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"FixedCost", ObjectType<{
8
8
  value: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").FloatType, true>;
9
9
  translations: import("tsondb/schema/def").MemberDecl<NestedEntityMap<"FixedCostTranslation", {
10
10
  wrap_in_text: import("tsondb/schema/def").MemberDecl<String, true>;
11
11
  }>, false>;
12
12
  }>, []>>>;
13
- Range: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"CostRange", Object<{
13
+ Range: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"CostRange", ObjectType<{
14
14
  from: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").FloatType, true>;
15
15
  to: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").FloatType, true>;
16
16
  translations: import("tsondb/schema/def").MemberDecl<NestedEntityMap<"CostRangeTranslation", {
@@ -22,27 +22,27 @@ export declare const Weapon: Entity<"Weapon", {
22
22
  complexity: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"Complexity", {
23
23
  Primitive: import("tsondb/schema/def").EnumCaseDecl<null>;
24
24
  Simple: import("tsondb/schema/def").EnumCaseDecl<null>;
25
- Complex: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"ComplexComplexity", Object<{
25
+ Complex: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"ComplexComplexity", ObjectType<{
26
26
  ap_value: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
27
27
  }>, []>>>;
28
28
  }, []>>, false>;
29
- structure_points: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"StructurePoints", import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"StructurePointsComponent", Object<{
29
+ structure_points: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"StructurePoints", import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"StructurePointsComponent", ObjectType<{
30
30
  points: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
31
31
  }>, []>>>, []>>, false>;
32
32
  melee_uses: import("tsondb/schema/def").MemberDecl<NestedEntityMap<string, {
33
- damage: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"MeleeDamage", Object<{
34
- dice: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"Dice", Object<{
33
+ damage: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"MeleeDamage", ObjectType<{
34
+ dice: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"Dice", ObjectType<{
35
35
  number: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
36
36
  sides: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"DieType", import("tsondb/schema/def").IntegerType, []>>, true>;
37
37
  }>, []>>, true>;
38
38
  flat: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, false>;
39
39
  }>, []>>, true>;
40
40
  damage_threshold: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"PrimaryAttributeDamageThreshold", {
41
- Default: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"DefaultPrimaryAttributeDamageThreshold", Object<{
41
+ Default: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"DefaultPrimaryAttributeDamageThreshold", ObjectType<{
42
42
  threshold: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
43
43
  }>, []>>>;
44
- List: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"PrimaryAttributeDamageThresholdList", Object<{
45
- list: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"SinglePrimaryAttributeDamageThreshold", Object<{
44
+ List: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"PrimaryAttributeDamageThresholdList", ObjectType<{
45
+ list: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"SinglePrimaryAttributeDamageThreshold", ObjectType<{
46
46
  attribute: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ReferenceIdentifierType, true>;
47
47
  threshold: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
48
48
  }>, []>>>, true>;
@@ -55,7 +55,7 @@ export declare const Weapon: Entity<"Weapon", {
55
55
  size: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"ShieldSize", {
56
56
  Small: import("tsondb/schema/def").EnumCaseDecl<null>;
57
57
  Medium: import("tsondb/schema/def").EnumCaseDecl<null>;
58
- Large: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"LargeShieldSize", Object<{
58
+ Large: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"LargeShieldSize", ObjectType<{
59
59
  attack_penalty: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, false>;
60
60
  }>, []>>>;
61
61
  }, []>>, false>;
@@ -65,8 +65,8 @@ export declare const Weapon: Entity<"Weapon", {
65
65
  }>, false>;
66
66
  ranged_uses: import("tsondb/schema/def").MemberDecl<NestedEntityMap<string, {
67
67
  damage: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"RangedDamage", {
68
- Default: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"DefaultRangedDamage", Object<{
69
- dice: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"Dice", Object<{
68
+ Default: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"DefaultRangedDamage", ObjectType<{
69
+ dice: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"Dice", ObjectType<{
70
70
  number: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
71
71
  sides: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"DieType", import("tsondb/schema/def").IntegerType, []>>, true>;
72
72
  }>, []>>, true>;
@@ -75,10 +75,10 @@ export declare const Weapon: Entity<"Weapon", {
75
75
  NotApplicable: import("tsondb/schema/def").EnumCaseDecl<null>;
76
76
  Special: import("tsondb/schema/def").EnumCaseDecl<null>;
77
77
  }, []>>, true>;
78
- reload_time: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"ReloadTime", Object<{
78
+ reload_time: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"ReloadTime", ObjectType<{
79
79
  value: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
80
80
  }>, []>>>, true>;
81
- range: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RangeBrackets", Object<{
81
+ range: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RangeBrackets", ObjectType<{
82
82
  close: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
83
83
  medium: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
84
84
  far: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
@@ -87,20 +87,20 @@ export declare const Weapon: Entity<"Weapon", {
87
87
  length: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"Length", import("tsondb/schema/def").IntegerType, []>>, false>;
88
88
  is_improvised_weapon: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").BooleanType, true>;
89
89
  }>, false>;
90
- restrictedTo: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedTo", Object<{
91
- races: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToRaces", Object<{
90
+ restrictedTo: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedTo", ObjectType<{
91
+ races: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToRaces", ObjectType<{
92
92
  scope: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<import("tsondb/schema/def").ReferenceIdentifierType>, true>;
93
93
  }>, []>>, false>;
94
- cultures: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToCultures", Object<{
94
+ cultures: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToCultures", ObjectType<{
95
95
  scope: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<import("tsondb/schema/def").ReferenceIdentifierType>, true>;
96
96
  }>, []>>, false>;
97
- professions: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToProfessions", Object<{
97
+ professions: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToProfessions", ObjectType<{
98
98
  scope: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<import("tsondb/schema/def").ReferenceIdentifierType>, true>;
99
99
  }>, []>>, false>;
100
- magicalTraditions: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToMagicalTraditions", Object<{
100
+ magicalTraditions: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToMagicalTraditions", ObjectType<{
101
101
  scope: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<import("tsondb/schema/def").ReferenceIdentifierType>, true>;
102
102
  }>, []>>, false>;
103
- blessedTraditions: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToBlessedTraditions", Object<{
103
+ blessedTraditions: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToBlessedTraditions", ObjectType<{
104
104
  scope: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"RestrictedToBlessedTraditionsScope", {
105
105
  Specific: import("tsondb/schema/def").EnumCaseDecl<import("tsondb/schema/def").ArrayType<import("tsondb/schema/def").ReferenceIdentifierType>>;
106
106
  Church: import("tsondb/schema/def").EnumCaseDecl<null>;
@@ -109,12 +109,12 @@ export declare const Weapon: Entity<"Weapon", {
109
109
  isSanctifiedBy: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").BooleanType, true>;
110
110
  }>, []>>, false>;
111
111
  }>, []>>, false>;
112
- src: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"PublicationRefs", import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"PublicationRef", Object<{
112
+ src: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"PublicationRefs", import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"PublicationRef", ObjectType<{
113
113
  id: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ReferenceIdentifierType, true>;
114
114
  occurrences: import("tsondb/schema/def").MemberDecl<NestedEntityMap<string, {
115
- initial: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"InitialOccurrence", Object<{
115
+ initial: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"InitialOccurrence", ObjectType<{
116
116
  printing: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, false>;
117
- pages: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"PageRange", Object<{
117
+ pages: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"PageRange", ObjectType<{
118
118
  first_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"Page", {
119
119
  InsideCoverFront: import("tsondb/schema/def").EnumCaseDecl<null>;
120
120
  InsideCoverBack: import("tsondb/schema/def").EnumCaseDecl<null>;
@@ -128,9 +128,9 @@ export declare const Weapon: Entity<"Weapon", {
128
128
  }>, []>>>, true>;
129
129
  }>, []>>, true>;
130
130
  revisions: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"Revision", {
131
- Since: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"Since", Object<{
131
+ Since: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"Since", ObjectType<{
132
132
  printing: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
133
- pages: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"PageRange", Object<{
133
+ pages: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"PageRange", ObjectType<{
134
134
  first_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"Page", {
135
135
  InsideCoverFront: import("tsondb/schema/def").EnumCaseDecl<null>;
136
136
  InsideCoverBack: import("tsondb/schema/def").EnumCaseDecl<null>;
@@ -143,7 +143,7 @@ export declare const Weapon: Entity<"Weapon", {
143
143
  }, []>>, false>;
144
144
  }>, []>>>, true>;
145
145
  }>, []>>>;
146
- Deprecated: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"Deprecation", Object<{
146
+ Deprecated: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"Deprecation", ObjectType<{
147
147
  printing: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
148
148
  }>, []>>>;
149
149
  }, []>>>, false>;
@@ -156,27 +156,27 @@ export declare const Weapon: Entity<"Weapon", {
156
156
  rules: import("tsondb/schema/def").MemberDecl<String, false>;
157
157
  advantage: import("tsondb/schema/def").MemberDecl<String, false>;
158
158
  disadvantage: import("tsondb/schema/def").MemberDecl<String, false>;
159
- errata: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"Errata", import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"Erratum", Object<{
159
+ errata: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"Errata", import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"Erratum", ObjectType<{
160
160
  date: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").DateType, true>;
161
161
  description: import("tsondb/schema/def").MemberDecl<String, true>;
162
162
  }>, []>>>, []>>, false>;
163
163
  }>, true>;
164
164
  }, undefined>;
165
- export declare const ImprovisedWeapon: TypeAlias<"ImprovisedWeapon", Object<{
165
+ export declare const ImprovisedWeapon: TypeAlias<"ImprovisedWeapon", ObjectType<{
166
166
  melee_uses: import("tsondb/schema/def").MemberDecl<NestedEntityMap<string, {
167
- damage: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"MeleeDamage", Object<{
168
- dice: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"Dice", Object<{
167
+ damage: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"MeleeDamage", ObjectType<{
168
+ dice: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"Dice", ObjectType<{
169
169
  number: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
170
170
  sides: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"DieType", import("tsondb/schema/def").IntegerType, []>>, true>;
171
171
  }>, []>>, true>;
172
172
  flat: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, false>;
173
173
  }>, []>>, true>;
174
174
  damage_threshold: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"PrimaryAttributeDamageThreshold", {
175
- Default: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"DefaultPrimaryAttributeDamageThreshold", Object<{
175
+ Default: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"DefaultPrimaryAttributeDamageThreshold", ObjectType<{
176
176
  threshold: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
177
177
  }>, []>>>;
178
- List: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"PrimaryAttributeDamageThresholdList", Object<{
179
- list: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"SinglePrimaryAttributeDamageThreshold", Object<{
178
+ List: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"PrimaryAttributeDamageThresholdList", ObjectType<{
179
+ list: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"SinglePrimaryAttributeDamageThreshold", ObjectType<{
180
180
  attribute: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ReferenceIdentifierType, true>;
181
181
  threshold: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
182
182
  }>, []>>>, true>;
@@ -189,7 +189,7 @@ export declare const ImprovisedWeapon: TypeAlias<"ImprovisedWeapon", Object<{
189
189
  size: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"ShieldSize", {
190
190
  Small: import("tsondb/schema/def").EnumCaseDecl<null>;
191
191
  Medium: import("tsondb/schema/def").EnumCaseDecl<null>;
192
- Large: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"LargeShieldSize", Object<{
192
+ Large: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"LargeShieldSize", ObjectType<{
193
193
  attack_penalty: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, false>;
194
194
  }>, []>>>;
195
195
  }, []>>, false>;
@@ -199,8 +199,8 @@ export declare const ImprovisedWeapon: TypeAlias<"ImprovisedWeapon", Object<{
199
199
  }>, false>;
200
200
  ranged_uses: import("tsondb/schema/def").MemberDecl<NestedEntityMap<string, {
201
201
  damage: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"RangedDamage", {
202
- Default: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"DefaultRangedDamage", Object<{
203
- dice: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"Dice", Object<{
202
+ Default: import("tsondb/schema/def").EnumCaseDecl<IncludeIdentifier<[], TypeAlias<"DefaultRangedDamage", ObjectType<{
203
+ dice: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"Dice", ObjectType<{
204
204
  number: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
205
205
  sides: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"DieType", import("tsondb/schema/def").IntegerType, []>>, true>;
206
206
  }>, []>>, true>;
@@ -209,10 +209,10 @@ export declare const ImprovisedWeapon: TypeAlias<"ImprovisedWeapon", Object<{
209
209
  NotApplicable: import("tsondb/schema/def").EnumCaseDecl<null>;
210
210
  Special: import("tsondb/schema/def").EnumCaseDecl<null>;
211
211
  }, []>>, true>;
212
- reload_time: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"ReloadTime", Object<{
212
+ reload_time: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<IncludeIdentifier<[], TypeAlias<"ReloadTime", ObjectType<{
213
213
  value: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
214
214
  }>, []>>>, true>;
215
- range: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RangeBrackets", Object<{
215
+ range: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RangeBrackets", ObjectType<{
216
216
  close: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
217
217
  medium: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
218
218
  far: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").IntegerType, true>;
@@ -221,20 +221,20 @@ export declare const ImprovisedWeapon: TypeAlias<"ImprovisedWeapon", Object<{
221
221
  length: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"Length", import("tsondb/schema/def").IntegerType, []>>, false>;
222
222
  is_improvised_weapon: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").BooleanType, true>;
223
223
  }>, false>;
224
- restrictedTo: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedTo", Object<{
225
- races: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToRaces", Object<{
224
+ restrictedTo: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedTo", ObjectType<{
225
+ races: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToRaces", ObjectType<{
226
226
  scope: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<import("tsondb/schema/def").ReferenceIdentifierType>, true>;
227
227
  }>, []>>, false>;
228
- cultures: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToCultures", Object<{
228
+ cultures: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToCultures", ObjectType<{
229
229
  scope: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<import("tsondb/schema/def").ReferenceIdentifierType>, true>;
230
230
  }>, []>>, false>;
231
- professions: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToProfessions", Object<{
231
+ professions: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToProfessions", ObjectType<{
232
232
  scope: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<import("tsondb/schema/def").ReferenceIdentifierType>, true>;
233
233
  }>, []>>, false>;
234
- magicalTraditions: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToMagicalTraditions", Object<{
234
+ magicalTraditions: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToMagicalTraditions", ObjectType<{
235
235
  scope: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ArrayType<import("tsondb/schema/def").ReferenceIdentifierType>, true>;
236
236
  }>, []>>, false>;
237
- blessedTraditions: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToBlessedTraditions", Object<{
237
+ blessedTraditions: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RestrictedToBlessedTraditions", ObjectType<{
238
238
  scope: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], import("tsondb/schema/def").EnumDecl<"RestrictedToBlessedTraditionsScope", {
239
239
  Specific: import("tsondb/schema/def").EnumCaseDecl<import("tsondb/schema/def").ArrayType<import("tsondb/schema/def").ReferenceIdentifierType>>;
240
240
  Church: import("tsondb/schema/def").EnumCaseDecl<null>;
@@ -1,4 +1,4 @@
1
- import { Entity, IncludeIdentifier, NestedEntityMap, Object, Optional, Required, String, TypeAlias, } from "tsondb/schema/def";
1
+ import { Entity, IncludeIdentifier, NestedEntityMap, ObjectType, Optional, Required, String, TypeAlias, } from "tsondb/schema/def";
2
2
  import { CloseCombatTechnique, RangedCombatTechnique } from "../../CombatTechnique.js";
3
3
  import { NestedTranslationMap } from "../../Locale.js";
4
4
  import { Errata } from "../../source/_Erratum.js";
@@ -6,10 +6,11 @@ import { src } from "../../source/_PublicationRef.js";
6
6
  import { Complexity, Cost, RestrictedTo, StructurePoints, Weight } from "./_Item.js";
7
7
  import { MeleeWeapon } from "./_MeleeWeapon.js";
8
8
  import { RangedWeapon } from "./_RangedWeapon.js";
9
+ import { checkWeaponCombatTechniqueIntegrity } from "./_Weapon.js";
9
10
  export const Weapon = Entity(import.meta.url, {
10
11
  name: "Weapon",
11
12
  namePlural: "Weapons",
12
- type: () => Object({
13
+ type: () => ObjectType({
13
14
  cost: Required({
14
15
  comment: "The cost in silverthalers.",
15
16
  type: IncludeIdentifier(Cost),
@@ -49,7 +50,7 @@ export const Weapon = Entity(import.meta.url, {
49
50
  type: IncludeIdentifier(RestrictedTo),
50
51
  }),
51
52
  src,
52
- translations: NestedTranslationMap(Required, "Weapon", Object({
53
+ translations: NestedTranslationMap(Required, "Weapon", ObjectType({
53
54
  name: Required({
54
55
  comment: "The item’s name.",
55
56
  type: String({ minLength: 1 }),
@@ -80,10 +81,17 @@ export const Weapon = Entity(import.meta.url, {
80
81
  })),
81
82
  }),
82
83
  displayName: {},
84
+ uniqueConstraints: [
85
+ {
86
+ entityMapKeyPath: "translations",
87
+ keyPathInEntityMap: "name",
88
+ },
89
+ ],
90
+ customConstraints: params => checkWeaponCombatTechniqueIntegrity(params, false),
83
91
  });
84
92
  export const ImprovisedWeapon = TypeAlias(import.meta.url, {
85
93
  name: "ImprovisedWeapon",
86
- type: () => Object({
94
+ type: () => ObjectType({
87
95
  melee_uses: Optional({
88
96
  comment: "A list of stat blocks for each close combat technique this weapon can be used with.",
89
97
  type: NestedEntityMap({
@@ -106,7 +114,7 @@ export const ImprovisedWeapon = TypeAlias(import.meta.url, {
106
114
  comment: "Define if during character creation this weapon can only be bought by a specific subset of characters.",
107
115
  type: IncludeIdentifier(RestrictedTo),
108
116
  }),
109
- translations: NestedTranslationMap(Optional, "ImprovisedWeapon", Object({
117
+ translations: NestedTranslationMap(Optional, "ImprovisedWeapon", ObjectType({
110
118
  advantage: Optional({
111
119
  comment: "The weapon advantage text.",
112
120
  type: String({ minLength: 1, isMarkdown: true }),
@@ -1,6 +1,7 @@
1
1
  import { Entity, IncludeIdentifier, Object, Optional, Required } from "tsondb/schema/def";
2
2
  import { src } from "../../source/_PublicationRef.js";
3
3
  import { CombatUse, Complexity, Cost, DefaultItemTranslations, StructurePoints, Weight, } from "./_Item.js";
4
+ import { checkWeaponCombatTechniqueIntegrity } from "./_Weapon.js";
4
5
  export const WeaponAccessory = Entity(import.meta.url, {
5
6
  name: "WeaponAccessory",
6
7
  namePlural: "WeaponAccessories",
@@ -29,4 +30,19 @@ export const WeaponAccessory = Entity(import.meta.url, {
29
30
  translations: DefaultItemTranslations("WeaponAccessory"),
30
31
  }),
31
32
  displayName: {},
33
+ uniqueConstraints: [
34
+ {
35
+ entityMapKeyPath: "translations",
36
+ keyPathInEntityMap: "name",
37
+ },
38
+ ],
39
+ customConstraints: ({ instanceContent, ...rest }) => {
40
+ if (instanceContent.combat_use && instanceContent.combat_use.kind === "Weapon") {
41
+ return checkWeaponCombatTechniqueIntegrity({
42
+ ...rest,
43
+ instanceContent: instanceContent.combat_use.Weapon,
44
+ }, true);
45
+ }
46
+ return [];
47
+ },
32
48
  });
@@ -3,8 +3,10 @@ import { BlessedTraditionIdentifier, CultureIdentifier, MagicalTraditionIdentifi
3
3
  import { NestedTranslationMap } from "../../Locale.js";
4
4
  import { Errata } from "../../source/_Erratum.js";
5
5
  import { src } from "../../source/_PublicationRef.js";
6
+ import { checkWeaponCombatTechniqueIntegrity } from "./_Weapon.js";
6
7
  import { SecondaryArmor } from "./Armor.js";
7
8
  import { ImprovisedWeapon } from "./Weapon.js";
9
+ const COMBAT_USE = "combat_use";
8
10
  export const DefaultItem = (sourceUrl, singularName, pluralName) => Entity(sourceUrl, {
9
11
  name: singularName,
10
12
  namePlural: pluralName ?? `${singularName}s`,
@@ -25,7 +27,7 @@ export const DefaultItem = (sourceUrl, singularName, pluralName) => Entity(sourc
25
27
  comment: "The structure points of the item. Use an array if the item consists of multiple components that have individual structure points.",
26
28
  type: IncludeIdentifier(StructurePoints),
27
29
  }),
28
- combat_use: Optional({
30
+ [COMBAT_USE]: Optional({
29
31
  comment: "The item can also be used either as an improvised weapon or as an armor, although this is not the primary use case of the item.",
30
32
  type: IncludeIdentifier(CombatUse),
31
33
  }),
@@ -33,6 +35,22 @@ export const DefaultItem = (sourceUrl, singularName, pluralName) => Entity(sourc
33
35
  translations: DefaultItemTranslations(singularName),
34
36
  }),
35
37
  displayName: {},
38
+ uniqueConstraints: [
39
+ {
40
+ entityMapKeyPath: "translations",
41
+ keyPathInEntityMap: "name",
42
+ },
43
+ ],
44
+ customConstraints: ({ instanceContent, ...rest }) => {
45
+ const combatUse = instanceContent.combat_use;
46
+ if (combatUse && combatUse.kind === "Weapon") {
47
+ return checkWeaponCombatTechniqueIntegrity({
48
+ ...rest,
49
+ instanceContent: combatUse.Weapon,
50
+ }, true);
51
+ }
52
+ return [];
53
+ },
36
54
  });
37
55
  export const DefaultItemTranslations = (singularName) => NestedTranslationMap(Required, singularName, Object({
38
56
  name: Required({
@@ -1,13 +1,22 @@
1
- import { Array, Enum, EnumCase, IncludeIdentifier, Integer, Object, TypeAlias } from "tsondb/schema/def";
1
+ import { Array, Enum, EnumCase, IncludeIdentifier, Integer, ObjectType, TypeAlias, type GetDisplayNameWithId, type GetInstanceById } from "tsondb/schema/def";
2
+ import type { MeleeWeapon, RangedWeapon } from "../../../../gen/types.js";
2
3
  export declare const PrimaryAttributeDamageThreshold: Enum<"PrimaryAttributeDamageThreshold", {
3
- Default: EnumCase<IncludeIdentifier<[], TypeAlias<"DefaultPrimaryAttributeDamageThreshold", Object<{
4
+ Default: EnumCase<IncludeIdentifier<[], TypeAlias<"DefaultPrimaryAttributeDamageThreshold", ObjectType<{
4
5
  threshold: import("tsondb/schema/def").MemberDecl<Integer, true>;
5
6
  }>, []>>>;
6
- List: EnumCase<IncludeIdentifier<[], TypeAlias<"PrimaryAttributeDamageThresholdList", Object<{
7
- list: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], TypeAlias<"SinglePrimaryAttributeDamageThreshold", Object<{
7
+ List: EnumCase<IncludeIdentifier<[], TypeAlias<"PrimaryAttributeDamageThresholdList", ObjectType<{
8
+ list: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], TypeAlias<"SinglePrimaryAttributeDamageThreshold", ObjectType<{
8
9
  attribute: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ReferenceIdentifierType, true>;
9
10
  threshold: import("tsondb/schema/def").MemberDecl<Integer, true>;
10
11
  }>, []>>>, true>;
11
12
  }>, []>>>;
12
13
  }, []>;
13
14
  export declare const Length: TypeAlias<"Length", Integer, []>;
15
+ export declare const checkWeaponCombatTechniqueIntegrity: ({ instanceContent, getInstanceById, getDisplayNameWithId, }: {
16
+ instanceContent: {
17
+ melee_uses?: Record<string, MeleeWeapon>;
18
+ ranged_uses?: Record<string, RangedWeapon>;
19
+ };
20
+ getInstanceById: GetInstanceById;
21
+ getDisplayNameWithId: GetDisplayNameWithId;
22
+ }, _secondary: boolean) => string[];
@@ -1,4 +1,4 @@
1
- import { Array, Enum, EnumCase, IncludeIdentifier, Integer, Object, Required, TypeAlias, } from "tsondb/schema/def";
1
+ import { Array, Enum, EnumCase, IncludeIdentifier, Integer, ObjectType, Required, TypeAlias, } from "tsondb/schema/def";
2
2
  import { AttributeIdentifier } from "../../_Identifier.js";
3
3
  export const PrimaryAttributeDamageThreshold = Enum(import.meta.url, {
4
4
  name: "PrimaryAttributeDamageThreshold",
@@ -10,7 +10,7 @@ export const PrimaryAttributeDamageThreshold = Enum(import.meta.url, {
10
10
  });
11
11
  const DefaultPrimaryAttributeDamageThreshold = TypeAlias(import.meta.url, {
12
12
  name: "DefaultPrimaryAttributeDamageThreshold",
13
- type: () => Object({
13
+ type: () => ObjectType({
14
14
  threshold: Required({
15
15
  comment: "The attribute value representing the damage threshold for the primary attribute of the item's combat technique.",
16
16
  type: Integer({ minimum: 1 }),
@@ -19,7 +19,7 @@ const DefaultPrimaryAttributeDamageThreshold = TypeAlias(import.meta.url, {
19
19
  });
20
20
  const PrimaryAttributeDamageThresholdList = TypeAlias(import.meta.url, {
21
21
  name: "PrimaryAttributeDamageThresholdList",
22
- type: () => Object({
22
+ type: () => ObjectType({
23
23
  list: Required({
24
24
  comment: "A list of primary attributes with their associated threshold.",
25
25
  type: Array(IncludeIdentifier(SinglePrimaryAttributeDamageThreshold), {
@@ -31,7 +31,7 @@ const PrimaryAttributeDamageThresholdList = TypeAlias(import.meta.url, {
31
31
  });
32
32
  const SinglePrimaryAttributeDamageThreshold = TypeAlias(import.meta.url, {
33
33
  name: "SinglePrimaryAttributeDamageThreshold",
34
- type: () => Object({
34
+ type: () => ObjectType({
35
35
  attribute: Required({
36
36
  comment: "The primary attribute.",
37
37
  type: AttributeIdentifier(),
@@ -47,3 +47,31 @@ export const Length = TypeAlias(import.meta.url, {
47
47
  comment: "The length of the weapon in cm/halffingers.",
48
48
  type: () => Integer({ minimum: 1 }),
49
49
  });
50
+ export const checkWeaponCombatTechniqueIntegrity = ({ instanceContent, getInstanceById, getDisplayNameWithId, }, _secondary) => {
51
+ const checkPart = (rule, value, name, type, id) => (rule.kind === "Prohibited") === (value === undefined) || rule.kind === "Optional"
52
+ ? undefined
53
+ : `${name} must${rule.kind === "Required" ? "" : " not"} be provided for ${type} combat technique ${getDisplayNameWithId(type === "close" ? "CloseCombatTechnique" : "RangedCombatTechnique", id)}`;
54
+ return [
55
+ instanceContent.melee_uses === undefined && instanceContent.ranged_uses === undefined
56
+ ? "either melee uses or ranged uses have to be provided"
57
+ : undefined,
58
+ ...Object.entries(instanceContent.melee_uses ?? {}).flatMap(([ctId, meleeUse]) => {
59
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- integrity has been checked, it must be present
60
+ const ct = getInstanceById("CloseCombatTechnique", ctId);
61
+ return [
62
+ checkPart(ct.special.can_parry, meleeUse.parryModifier, "a parry modifier", "close", ctId),
63
+ checkPart(ct.special.has_damage_threshold, meleeUse.damage_threshold, "a damage threshold", "close", ctId),
64
+ checkPart(ct.special.has_length, meleeUse.length, "a length", "close", ctId),
65
+ checkPart(ct.special.has_reach, meleeUse.reach, "a reach", "close", ctId),
66
+ checkPart(ct.special.has_shield_size, meleeUse.size, "a shield size", "close", ctId),
67
+ ].filter(v => v !== undefined);
68
+ }),
69
+ ...Object.entries(instanceContent.ranged_uses ?? {}).flatMap(([ctId, rangedUse]) => {
70
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion -- integrity has been checked, it must be present
71
+ const ct = getInstanceById("RangedCombatTechnique", ctId);
72
+ return [
73
+ checkPart(ct.special.has_ammunition, rangedUse.ammunition, "an ammunition", "ranged", ctId),
74
+ ].filter(v => v !== undefined);
75
+ }),
76
+ ].filter(v => v !== undefined);
77
+ };
@@ -16,4 +16,10 @@ export const ArmorType = Entity(import.meta.url, {
16
16
  })),
17
17
  }),
18
18
  displayName: {},
19
+ uniqueConstraints: [
20
+ {
21
+ entityMapKeyPath: "translations",
22
+ keyPathInEntityMap: "name",
23
+ },
24
+ ],
19
25
  });
@@ -12,4 +12,10 @@ export const Reach = Entity(import.meta.url, {
12
12
  })),
13
13
  }),
14
14
  displayName: {},
15
+ uniqueConstraints: [
16
+ {
17
+ entityMapKeyPath: "translations",
18
+ keyPathInEntityMap: "name",
19
+ },
20
+ ],
15
21
  });
@@ -74,6 +74,12 @@ If no tribe tradition is given, the animist power is generally available to all
74
74
  })),
75
75
  }),
76
76
  displayName: {},
77
+ uniqueConstraints: [
78
+ {
79
+ entityMapKeyPath: "translations",
80
+ keyPathInEntityMap: "name",
81
+ },
82
+ ],
77
83
  });
78
84
  const AnimistPowerLevel = TypeAlias(import.meta.url, {
79
85
  name: "AnimistPowerLevel",
@@ -17,4 +17,10 @@ export const Tribe = Entity(import.meta.url, {
17
17
  })),
18
18
  }),
19
19
  displayName: {},
20
+ uniqueConstraints: [
21
+ {
22
+ entityMapKeyPath: "translations",
23
+ keyPathInEntityMap: "name",
24
+ },
25
+ ],
20
26
  });
@@ -53,6 +53,12 @@ export const Curse = Entity(import.meta.url, {
53
53
  })),
54
54
  }),
55
55
  displayName: {},
56
+ uniqueConstraints: [
57
+ {
58
+ entityMapKeyPath: "translations",
59
+ keyPathInEntityMap: "name",
60
+ },
61
+ ],
56
62
  });
57
63
  const CursePerformanceParameters = TypeAlias(import.meta.url, {
58
64
  name: "CursePerformanceParameters",
@@ -52,6 +52,12 @@ export const DominationRitual = Entity(import.meta.url, {
52
52
  })),
53
53
  }),
54
54
  displayName: {},
55
+ uniqueConstraints: [
56
+ {
57
+ entityMapKeyPath: "translations",
58
+ keyPathInEntityMap: "name",
59
+ },
60
+ ],
55
61
  });
56
62
  const DominationRitualPerformanceParameters = TypeAlias(import.meta.url, {
57
63
  name: "DominationRitualPerformanceParameters",
@@ -61,6 +61,12 @@ export const ElvenMagicalSong = Entity(import.meta.url, {
61
61
  })),
62
62
  }),
63
63
  displayName: {},
64
+ uniqueConstraints: [
65
+ {
66
+ entityMapKeyPath: "translations",
67
+ keyPathInEntityMap: "name",
68
+ },
69
+ ],
64
70
  });
65
71
  const ElvenMagicalSongPerformanceParameters = TypeAlias(import.meta.url, {
66
72
  name: "ElvenMagicalSongPerformanceParameters",
@@ -71,6 +71,12 @@ export const GeodeRitual = Entity(import.meta.url, {
71
71
  })),
72
72
  }),
73
73
  displayName: {},
74
+ uniqueConstraints: [
75
+ {
76
+ entityMapKeyPath: "translations",
77
+ keyPathInEntityMap: "name",
78
+ },
79
+ ],
74
80
  });
75
81
  const GeodeRitualPerformanceParameters = TypeAlias(import.meta.url, {
76
82
  name: "GeodeRitualPerformanceParameters",
@@ -73,6 +73,12 @@ export const JesterTrick = Entity(import.meta.url, {
73
73
  })),
74
74
  }),
75
75
  displayName: {},
76
+ uniqueConstraints: [
77
+ {
78
+ entityMapKeyPath: "translations",
79
+ keyPathInEntityMap: "name",
80
+ },
81
+ ],
76
82
  });
77
83
  export const JesterTrickPerformanceParameters = TypeAlias(import.meta.url, {
78
84
  name: "JesterTrickPerformanceParameters",
@@ -60,6 +60,12 @@ export const MagicalDance = Entity(import.meta.url, {
60
60
  })),
61
61
  }),
62
62
  displayName: {},
63
+ uniqueConstraints: [
64
+ {
65
+ entityMapKeyPath: "translations",
66
+ keyPathInEntityMap: "name",
67
+ },
68
+ ],
63
69
  });
64
70
  const MagicalDancePerformanceParameters = TypeAlias(import.meta.url, {
65
71
  name: "MagicalDancePerformanceParameters",