optolith-database-schema 0.25.0 → 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.
- package/CHANGELOG.md +13 -0
- package/gen/types.d.ts +32 -6
- package/lib/main.d.ts +7 -0
- package/lib/types/CombatTechnique.d.ts +79 -55
- package/lib/types/CombatTechnique.js +25 -7
- package/lib/types/Profession.d.ts +25 -0
- package/lib/types/Profession.js +16 -0
- package/lib/types/equipment/item/BandageOrRemedy.js +10 -0
- package/lib/types/equipment/item/CeremonialItem.js +10 -0
- package/lib/types/equipment/item/Clothes.js +10 -0
- package/lib/types/equipment/item/Container.js +10 -0
- package/lib/types/equipment/item/EquipmentOfBlessedOnes.js +10 -0
- package/lib/types/equipment/item/IlluminationLightSource.js +10 -0
- package/lib/types/equipment/item/IlluminationRefillOrSupply.js +10 -0
- package/lib/types/equipment/item/Liebesspielzeug.js +10 -0
- package/lib/types/equipment/item/LuxuryGood.js +10 -0
- package/lib/types/equipment/item/MagicalArtifact.js +10 -0
- package/lib/types/equipment/item/MusicalInstrument.js +10 -0
- package/lib/types/equipment/item/TravelGearOrTool.js +10 -0
- package/lib/types/equipment/item/Weapon.d.ts +45 -45
- package/lib/types/equipment/item/Weapon.js +7 -5
- package/lib/types/equipment/item/WeaponAccessory.js +10 -0
- package/lib/types/equipment/item/_Item.js +13 -1
- package/lib/types/equipment/item/_Weapon.d.ts +13 -4
- package/lib/types/equipment/item/_Weapon.js +32 -4
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
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.26.0](https://github.com/elyukai/optolith-database-schema/compare/v0.25.0...v0.26.0) (2025-12-15)
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
### ⚠ BREAKING CHANGES
|
|
9
|
+
|
|
10
|
+
* Combat techniques need to specify special rules
|
|
11
|
+
differently.
|
|
12
|
+
|
|
13
|
+
### Features
|
|
14
|
+
|
|
15
|
+
* add profession liturgies for ap sum option ([a1316af](https://github.com/elyukai/optolith-database-schema/commit/a1316af0c1f8b85e79f5f393eed2c3bec5204645)), closes [#86](https://github.com/elyukai/optolith-database-schema/issues/86)
|
|
16
|
+
* custom constraint for weapon values ([02be29d](https://github.com/elyukai/optolith-database-schema/commit/02be29dab7bca40fb4c370c48a9f775ccf8aaf7d))
|
|
17
|
+
|
|
5
18
|
## [0.25.0](https://github.com/elyukai/optolith-database-schema/compare/v0.24.3...v0.25.0) (2025-12-14)
|
|
6
19
|
|
|
7
20
|
|
package/gen/types.d.ts
CHANGED
|
@@ -4131,17 +4131,31 @@ export interface CloseCombatTechniqueSpecialRules {
|
|
|
4131
4131
|
/**
|
|
4132
4132
|
* Is parrying possible with this combat technique?
|
|
4133
4133
|
*/
|
|
4134
|
-
can_parry:
|
|
4134
|
+
can_parry: WeaponCombatTechniqueValueRule
|
|
4135
4135
|
|
|
4136
|
-
has_damage_threshold:
|
|
4136
|
+
has_damage_threshold: WeaponCombatTechniqueValueRule
|
|
4137
4137
|
|
|
4138
|
-
has_reach:
|
|
4138
|
+
has_reach: WeaponCombatTechniqueValueRule
|
|
4139
4139
|
|
|
4140
|
-
has_length:
|
|
4140
|
+
has_length: WeaponCombatTechniqueValueRule
|
|
4141
4141
|
|
|
4142
|
-
has_shield_size:
|
|
4142
|
+
has_shield_size: WeaponCombatTechniqueValueRule
|
|
4143
4143
|
}
|
|
4144
4144
|
|
|
4145
|
+
/**
|
|
4146
|
+
* Defines if the weapon must/can/must not define a value for this parameter.
|
|
4147
|
+
*/
|
|
4148
|
+
export type WeaponCombatTechniqueValueRule =
|
|
4149
|
+
| {
|
|
4150
|
+
kind: "Required"
|
|
4151
|
+
}
|
|
4152
|
+
| {
|
|
4153
|
+
kind: "Optional"
|
|
4154
|
+
}
|
|
4155
|
+
| {
|
|
4156
|
+
kind: "Prohibited"
|
|
4157
|
+
}
|
|
4158
|
+
|
|
4145
4159
|
export interface RangedCombatTechnique {
|
|
4146
4160
|
/**
|
|
4147
4161
|
* Special rules for the combat technique that apply to all weapons in this category.
|
|
@@ -4199,7 +4213,7 @@ export interface RangedCombatTechniqueTranslation {
|
|
|
4199
4213
|
* Special rules for the combat technique that apply to all weapons in this category.
|
|
4200
4214
|
*/
|
|
4201
4215
|
export interface RangedCombatTechniqueSpecialRules {
|
|
4202
|
-
has_ammunition:
|
|
4216
|
+
has_ammunition: WeaponCombatTechniqueValueRule
|
|
4203
4217
|
}
|
|
4204
4218
|
|
|
4205
4219
|
export interface Property {
|
|
@@ -7737,6 +7751,7 @@ export interface ProfessionPackageOptions {
|
|
|
7737
7751
|
curses?: CursesOptions
|
|
7738
7752
|
terrain_knowledge?: TerrainKnowledgeOptions
|
|
7739
7753
|
skills?: SkillsOptions
|
|
7754
|
+
liturgies?: LiturgiesOptions
|
|
7740
7755
|
}
|
|
7741
7756
|
|
|
7742
7757
|
/**
|
|
@@ -8043,6 +8058,16 @@ export interface SkillsOptions {
|
|
|
8043
8058
|
ap_value: number
|
|
8044
8059
|
}
|
|
8045
8060
|
|
|
8061
|
+
/**
|
|
8062
|
+
* Buy liturgical chants and ceremonies for a specific amount of AP.
|
|
8063
|
+
*/
|
|
8064
|
+
export interface LiturgiesOptions {
|
|
8065
|
+
/**
|
|
8066
|
+
* The AP value you can buy liturgical chants and ceremonies for.
|
|
8067
|
+
*/
|
|
8068
|
+
ap_value: number
|
|
8069
|
+
}
|
|
8070
|
+
|
|
8046
8071
|
export type ProfessionSpecialAbility =
|
|
8047
8072
|
| {
|
|
8048
8073
|
kind: "Constant"
|
|
@@ -17226,6 +17251,7 @@ export interface ProfessionVariantPackageOptions {
|
|
|
17226
17251
|
curses?: VariantOptionAction<CursesOptions>
|
|
17227
17252
|
terrain_knowledge?: VariantOptionAction<TerrainKnowledgeOptions>
|
|
17228
17253
|
skills?: VariantOptionAction<SkillsOptions>
|
|
17254
|
+
liturgies?: VariantOptionAction<LiturgiesOptions>
|
|
17229
17255
|
}
|
|
17230
17256
|
|
|
17231
17257
|
export type VariantOptionAction<T> =
|
package/lib/main.d.ts
CHANGED
|
@@ -1,2 +1,9 @@
|
|
|
1
1
|
import { Schema } from "tsondb/schema";
|
|
2
|
+
import type { ChildEntityMap, EntityMap } from "../gen/types.js";
|
|
3
|
+
declare module "tsondb/schema" {
|
|
4
|
+
interface Register {
|
|
5
|
+
entityMap: EntityMap;
|
|
6
|
+
childEntityMap: ChildEntityMap;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
2
9
|
export declare const schema: Schema;
|
|
@@ -1,19 +1,39 @@
|
|
|
1
|
-
import { Array,
|
|
1
|
+
import { Array, Entity, Enum, EnumCase, IncludeIdentifier, Integer, Object, String, TypeAlias } from "tsondb/schema/def";
|
|
2
2
|
export declare const CloseCombatTechnique: Entity<"CloseCombatTechnique", {
|
|
3
3
|
special: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"CloseCombatTechniqueSpecialRules", Object<{
|
|
4
|
-
can_parry: import("tsondb/schema/def").MemberDecl<
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
can_parry: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"WeaponCombatTechniqueValueRule", {
|
|
5
|
+
Required: EnumCase<null>;
|
|
6
|
+
Optional: EnumCase<null>;
|
|
7
|
+
Prohibited: EnumCase<null>;
|
|
8
|
+
}, []>>, true>;
|
|
9
|
+
has_damage_threshold: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"WeaponCombatTechniqueValueRule", {
|
|
10
|
+
Required: EnumCase<null>;
|
|
11
|
+
Optional: EnumCase<null>;
|
|
12
|
+
Prohibited: EnumCase<null>;
|
|
13
|
+
}, []>>, true>;
|
|
14
|
+
has_reach: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"WeaponCombatTechniqueValueRule", {
|
|
15
|
+
Required: EnumCase<null>;
|
|
16
|
+
Optional: EnumCase<null>;
|
|
17
|
+
Prohibited: EnumCase<null>;
|
|
18
|
+
}, []>>, true>;
|
|
19
|
+
has_length: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"WeaponCombatTechniqueValueRule", {
|
|
20
|
+
Required: EnumCase<null>;
|
|
21
|
+
Optional: EnumCase<null>;
|
|
22
|
+
Prohibited: EnumCase<null>;
|
|
23
|
+
}, []>>, true>;
|
|
24
|
+
has_shield_size: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"WeaponCombatTechniqueValueRule", {
|
|
25
|
+
Required: EnumCase<null>;
|
|
26
|
+
Optional: EnumCase<null>;
|
|
27
|
+
Prohibited: EnumCase<null>;
|
|
28
|
+
}, []>>, true>;
|
|
9
29
|
}>, []>>, true>;
|
|
10
30
|
primary_attribute: import("tsondb/schema/def").MemberDecl<Array<import("tsondb/schema/def").ReferenceIdentifierType>, true>;
|
|
11
31
|
breaking_point_rating: import("tsondb/schema/def").MemberDecl<Integer, true>;
|
|
12
|
-
improvement_cost: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[],
|
|
13
|
-
A:
|
|
14
|
-
B:
|
|
15
|
-
C:
|
|
16
|
-
D:
|
|
32
|
+
improvement_cost: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"ImprovementCost", {
|
|
33
|
+
A: EnumCase<null>;
|
|
34
|
+
B: EnumCase<null>;
|
|
35
|
+
C: EnumCase<null>;
|
|
36
|
+
D: EnumCase<null>;
|
|
17
37
|
}, []>>, true>;
|
|
18
38
|
src: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"PublicationRefs", Array<IncludeIdentifier<[], TypeAlias<"PublicationRef", Object<{
|
|
19
39
|
id: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ReferenceIdentifierType, true>;
|
|
@@ -21,35 +41,35 @@ export declare const CloseCombatTechnique: Entity<"CloseCombatTechnique", {
|
|
|
21
41
|
initial: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"InitialOccurrence", Object<{
|
|
22
42
|
printing: import("tsondb/schema/def").MemberDecl<Integer, false>;
|
|
23
43
|
pages: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], TypeAlias<"PageRange", Object<{
|
|
24
|
-
first_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[],
|
|
25
|
-
InsideCoverFront:
|
|
26
|
-
InsideCoverBack:
|
|
27
|
-
Numbered:
|
|
44
|
+
first_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"Page", {
|
|
45
|
+
InsideCoverFront: EnumCase<null>;
|
|
46
|
+
InsideCoverBack: EnumCase<null>;
|
|
47
|
+
Numbered: EnumCase<Integer>;
|
|
28
48
|
}, []>>, true>;
|
|
29
|
-
last_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[],
|
|
30
|
-
InsideCoverFront:
|
|
31
|
-
InsideCoverBack:
|
|
32
|
-
Numbered:
|
|
49
|
+
last_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"Page", {
|
|
50
|
+
InsideCoverFront: EnumCase<null>;
|
|
51
|
+
InsideCoverBack: EnumCase<null>;
|
|
52
|
+
Numbered: EnumCase<Integer>;
|
|
33
53
|
}, []>>, false>;
|
|
34
54
|
}>, []>>>, true>;
|
|
35
55
|
}>, []>>, true>;
|
|
36
|
-
revisions: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[],
|
|
37
|
-
Since:
|
|
56
|
+
revisions: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], Enum<"Revision", {
|
|
57
|
+
Since: EnumCase<IncludeIdentifier<[], TypeAlias<"Since", Object<{
|
|
38
58
|
printing: import("tsondb/schema/def").MemberDecl<Integer, true>;
|
|
39
59
|
pages: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], TypeAlias<"PageRange", Object<{
|
|
40
|
-
first_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[],
|
|
41
|
-
InsideCoverFront:
|
|
42
|
-
InsideCoverBack:
|
|
43
|
-
Numbered:
|
|
60
|
+
first_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"Page", {
|
|
61
|
+
InsideCoverFront: EnumCase<null>;
|
|
62
|
+
InsideCoverBack: EnumCase<null>;
|
|
63
|
+
Numbered: EnumCase<Integer>;
|
|
44
64
|
}, []>>, true>;
|
|
45
|
-
last_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[],
|
|
46
|
-
InsideCoverFront:
|
|
47
|
-
InsideCoverBack:
|
|
48
|
-
Numbered:
|
|
65
|
+
last_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"Page", {
|
|
66
|
+
InsideCoverFront: EnumCase<null>;
|
|
67
|
+
InsideCoverBack: EnumCase<null>;
|
|
68
|
+
Numbered: EnumCase<Integer>;
|
|
49
69
|
}, []>>, false>;
|
|
50
70
|
}>, []>>>, true>;
|
|
51
71
|
}>, []>>>;
|
|
52
|
-
Deprecated:
|
|
72
|
+
Deprecated: EnumCase<IncludeIdentifier<[], TypeAlias<"Deprecation", Object<{
|
|
53
73
|
printing: import("tsondb/schema/def").MemberDecl<Integer, true>;
|
|
54
74
|
}>, []>>>;
|
|
55
75
|
}, []>>>, false>;
|
|
@@ -66,15 +86,19 @@ export declare const CloseCombatTechnique: Entity<"CloseCombatTechnique", {
|
|
|
66
86
|
}, undefined>;
|
|
67
87
|
export declare const RangedCombatTechnique: Entity<"RangedCombatTechnique", {
|
|
68
88
|
special: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"RangedCombatTechniqueSpecialRules", Object<{
|
|
69
|
-
has_ammunition: import("tsondb/schema/def").MemberDecl<
|
|
89
|
+
has_ammunition: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"WeaponCombatTechniqueValueRule", {
|
|
90
|
+
Required: EnumCase<null>;
|
|
91
|
+
Optional: EnumCase<null>;
|
|
92
|
+
Prohibited: EnumCase<null>;
|
|
93
|
+
}, []>>, true>;
|
|
70
94
|
}>, []>>, true>;
|
|
71
95
|
primary_attribute: import("tsondb/schema/def").MemberDecl<Array<import("tsondb/schema/def").ReferenceIdentifierType>, true>;
|
|
72
96
|
breaking_point_rating: import("tsondb/schema/def").MemberDecl<Integer, true>;
|
|
73
|
-
improvement_cost: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[],
|
|
74
|
-
A:
|
|
75
|
-
B:
|
|
76
|
-
C:
|
|
77
|
-
D:
|
|
97
|
+
improvement_cost: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"ImprovementCost", {
|
|
98
|
+
A: EnumCase<null>;
|
|
99
|
+
B: EnumCase<null>;
|
|
100
|
+
C: EnumCase<null>;
|
|
101
|
+
D: EnumCase<null>;
|
|
78
102
|
}, []>>, true>;
|
|
79
103
|
src: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"PublicationRefs", Array<IncludeIdentifier<[], TypeAlias<"PublicationRef", Object<{
|
|
80
104
|
id: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ReferenceIdentifierType, true>;
|
|
@@ -82,35 +106,35 @@ export declare const RangedCombatTechnique: Entity<"RangedCombatTechnique", {
|
|
|
82
106
|
initial: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"InitialOccurrence", Object<{
|
|
83
107
|
printing: import("tsondb/schema/def").MemberDecl<Integer, false>;
|
|
84
108
|
pages: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], TypeAlias<"PageRange", Object<{
|
|
85
|
-
first_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[],
|
|
86
|
-
InsideCoverFront:
|
|
87
|
-
InsideCoverBack:
|
|
88
|
-
Numbered:
|
|
109
|
+
first_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"Page", {
|
|
110
|
+
InsideCoverFront: EnumCase<null>;
|
|
111
|
+
InsideCoverBack: EnumCase<null>;
|
|
112
|
+
Numbered: EnumCase<Integer>;
|
|
89
113
|
}, []>>, true>;
|
|
90
|
-
last_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[],
|
|
91
|
-
InsideCoverFront:
|
|
92
|
-
InsideCoverBack:
|
|
93
|
-
Numbered:
|
|
114
|
+
last_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"Page", {
|
|
115
|
+
InsideCoverFront: EnumCase<null>;
|
|
116
|
+
InsideCoverBack: EnumCase<null>;
|
|
117
|
+
Numbered: EnumCase<Integer>;
|
|
94
118
|
}, []>>, false>;
|
|
95
119
|
}>, []>>>, true>;
|
|
96
120
|
}>, []>>, true>;
|
|
97
|
-
revisions: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[],
|
|
98
|
-
Since:
|
|
121
|
+
revisions: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], Enum<"Revision", {
|
|
122
|
+
Since: EnumCase<IncludeIdentifier<[], TypeAlias<"Since", Object<{
|
|
99
123
|
printing: import("tsondb/schema/def").MemberDecl<Integer, true>;
|
|
100
124
|
pages: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], TypeAlias<"PageRange", Object<{
|
|
101
|
-
first_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[],
|
|
102
|
-
InsideCoverFront:
|
|
103
|
-
InsideCoverBack:
|
|
104
|
-
Numbered:
|
|
125
|
+
first_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"Page", {
|
|
126
|
+
InsideCoverFront: EnumCase<null>;
|
|
127
|
+
InsideCoverBack: EnumCase<null>;
|
|
128
|
+
Numbered: EnumCase<Integer>;
|
|
105
129
|
}, []>>, true>;
|
|
106
|
-
last_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[],
|
|
107
|
-
InsideCoverFront:
|
|
108
|
-
InsideCoverBack:
|
|
109
|
-
Numbered:
|
|
130
|
+
last_page: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"Page", {
|
|
131
|
+
InsideCoverFront: EnumCase<null>;
|
|
132
|
+
InsideCoverBack: EnumCase<null>;
|
|
133
|
+
Numbered: EnumCase<Integer>;
|
|
110
134
|
}, []>>, false>;
|
|
111
135
|
}>, []>>>, true>;
|
|
112
136
|
}>, []>>>;
|
|
113
|
-
Deprecated:
|
|
137
|
+
Deprecated: EnumCase<IncludeIdentifier<[], TypeAlias<"Deprecation", Object<{
|
|
114
138
|
printing: import("tsondb/schema/def").MemberDecl<Integer, true>;
|
|
115
139
|
}>, []>>>;
|
|
116
140
|
}, []>>>, false>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Array,
|
|
1
|
+
import { Array, Entity, Enum, EnumCase, IncludeIdentifier, Integer, Object, Optional, Required, String, TypeAlias, } from "tsondb/schema/def";
|
|
2
2
|
import { AttributeIdentifier } from "./_Identifier.js";
|
|
3
3
|
import { ImprovementCost } from "./_ImprovementCost.js";
|
|
4
4
|
import { NestedTranslationMap } from "./Locale.js";
|
|
@@ -47,18 +47,36 @@ export const CloseCombatTechnique = Entity(import.meta.url, {
|
|
|
47
47
|
},
|
|
48
48
|
],
|
|
49
49
|
});
|
|
50
|
+
const WeaponCombatTechniqueValueRule = Enum(import.meta.url, {
|
|
51
|
+
name: "WeaponCombatTechniqueValueRule",
|
|
52
|
+
comment: "Defines if the weapon must/can/must not define a value for this parameter.",
|
|
53
|
+
values: () => ({
|
|
54
|
+
Required: EnumCase({
|
|
55
|
+
comment: "The parameter must be present in all weapons for this combat technique.",
|
|
56
|
+
type: null,
|
|
57
|
+
}),
|
|
58
|
+
Optional: EnumCase({
|
|
59
|
+
comment: "The parameter can be present in any weapons for this combat technique.",
|
|
60
|
+
type: null,
|
|
61
|
+
}),
|
|
62
|
+
Prohibited: EnumCase({
|
|
63
|
+
comment: "The parameter must not be present in any weapon for this combat technique.",
|
|
64
|
+
type: null,
|
|
65
|
+
}),
|
|
66
|
+
}),
|
|
67
|
+
});
|
|
50
68
|
const CloseCombatTechniqueSpecialRules = TypeAlias(import.meta.url, {
|
|
51
69
|
name: "CloseCombatTechniqueSpecialRules",
|
|
52
70
|
comment: "Special rules for the combat technique that apply to all weapons in this category.",
|
|
53
71
|
type: () => Object({
|
|
54
72
|
can_parry: Required({
|
|
55
73
|
comment: "Is parrying possible with this combat technique?",
|
|
56
|
-
type:
|
|
74
|
+
type: IncludeIdentifier(WeaponCombatTechniqueValueRule),
|
|
57
75
|
}),
|
|
58
|
-
has_damage_threshold: Required({ type:
|
|
59
|
-
has_reach: Required({ type:
|
|
60
|
-
has_length: Required({ type:
|
|
61
|
-
has_shield_size: Required({ type:
|
|
76
|
+
has_damage_threshold: Required({ type: IncludeIdentifier(WeaponCombatTechniqueValueRule) }),
|
|
77
|
+
has_reach: Required({ type: IncludeIdentifier(WeaponCombatTechniqueValueRule) }),
|
|
78
|
+
has_length: Required({ type: IncludeIdentifier(WeaponCombatTechniqueValueRule) }),
|
|
79
|
+
has_shield_size: Required({ type: IncludeIdentifier(WeaponCombatTechniqueValueRule) }),
|
|
62
80
|
}),
|
|
63
81
|
});
|
|
64
82
|
export const RangedCombatTechnique = Entity(import.meta.url, {
|
|
@@ -108,6 +126,6 @@ const RangedCombatTechniqueSpecialRules = TypeAlias(import.meta.url, {
|
|
|
108
126
|
name: "RangedCombatTechniqueSpecialRules",
|
|
109
127
|
comment: "Special rules for the combat technique that apply to all weapons in this category.",
|
|
110
128
|
type: () => Object({
|
|
111
|
-
has_ammunition: Required({ type:
|
|
129
|
+
has_ammunition: Required({ type: IncludeIdentifier(WeaponCombatTechniqueValueRule) }),
|
|
112
130
|
}),
|
|
113
131
|
});
|
|
@@ -76,6 +76,9 @@ export declare const Profession: Entity<"Profession", {
|
|
|
76
76
|
group: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ReferenceIdentifierType, false>;
|
|
77
77
|
ap_value: import("tsondb/schema/def").MemberDecl<Integer, true>;
|
|
78
78
|
}>, []>>, false>;
|
|
79
|
+
liturgies: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"LiturgiesOptions", ObjectType<{
|
|
80
|
+
ap_value: import("tsondb/schema/def").MemberDecl<Integer, true>;
|
|
81
|
+
}>, []>>, false>;
|
|
79
82
|
}>, []>>, false>;
|
|
80
83
|
special_abilities: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], Enum<"ProfessionSpecialAbility", {
|
|
81
84
|
Constant: EnumCase<IncludeIdentifier<[], TypeAlias<"ConstantProfessionSpecialAbility", ObjectType<{
|
|
@@ -332,6 +335,10 @@ export declare const Profession: Entity<"Profession", {
|
|
|
332
335
|
Remove: EnumCase<null>;
|
|
333
336
|
Override: EnumCase<TypeArgument<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>;
|
|
334
337
|
}, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>, false>;
|
|
338
|
+
liturgies: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], Enum<"VariantOptionAction", {
|
|
339
|
+
Remove: EnumCase<null>;
|
|
340
|
+
Override: EnumCase<TypeArgument<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>;
|
|
341
|
+
}, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>, false>;
|
|
335
342
|
}>, []>>, false>;
|
|
336
343
|
special_abilities: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], TypeAlias<"ProfessionVariantSpecialAbility", ObjectType<{
|
|
337
344
|
action: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"VariantSpecialAbilityAction", {
|
|
@@ -692,6 +699,9 @@ export declare const ProfessionVersion: Entity<"ProfessionVersion", {
|
|
|
692
699
|
group: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ReferenceIdentifierType, false>;
|
|
693
700
|
ap_value: import("tsondb/schema/def").MemberDecl<Integer, true>;
|
|
694
701
|
}>, []>>, false>;
|
|
702
|
+
liturgies: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"LiturgiesOptions", ObjectType<{
|
|
703
|
+
ap_value: import("tsondb/schema/def").MemberDecl<Integer, true>;
|
|
704
|
+
}>, []>>, false>;
|
|
695
705
|
}>, []>>, false>;
|
|
696
706
|
special_abilities: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], Enum<"ProfessionSpecialAbility", {
|
|
697
707
|
Constant: EnumCase<IncludeIdentifier<[], TypeAlias<"ConstantProfessionSpecialAbility", ObjectType<{
|
|
@@ -948,6 +958,10 @@ export declare const ProfessionVersion: Entity<"ProfessionVersion", {
|
|
|
948
958
|
Remove: EnumCase<null>;
|
|
949
959
|
Override: EnumCase<TypeArgument<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>;
|
|
950
960
|
}, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>, false>;
|
|
961
|
+
liturgies: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], Enum<"VariantOptionAction", {
|
|
962
|
+
Remove: EnumCase<null>;
|
|
963
|
+
Override: EnumCase<TypeArgument<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>;
|
|
964
|
+
}, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>, false>;
|
|
951
965
|
}>, []>>, false>;
|
|
952
966
|
special_abilities: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], TypeAlias<"ProfessionVariantSpecialAbility", ObjectType<{
|
|
953
967
|
action: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"VariantSpecialAbilityAction", {
|
|
@@ -1300,6 +1314,9 @@ export declare const ProfessionPackage: Entity<"ProfessionPackage", {
|
|
|
1300
1314
|
group: import("tsondb/schema/def").MemberDecl<import("tsondb/schema/def").ReferenceIdentifierType, false>;
|
|
1301
1315
|
ap_value: import("tsondb/schema/def").MemberDecl<Integer, true>;
|
|
1302
1316
|
}>, []>>, false>;
|
|
1317
|
+
liturgies: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], TypeAlias<"LiturgiesOptions", ObjectType<{
|
|
1318
|
+
ap_value: import("tsondb/schema/def").MemberDecl<Integer, true>;
|
|
1319
|
+
}>, []>>, false>;
|
|
1303
1320
|
}>, []>>, false>;
|
|
1304
1321
|
special_abilities: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], Enum<"ProfessionSpecialAbility", {
|
|
1305
1322
|
Constant: EnumCase<IncludeIdentifier<[], TypeAlias<"ConstantProfessionSpecialAbility", ObjectType<{
|
|
@@ -1556,6 +1573,10 @@ export declare const ProfessionPackage: Entity<"ProfessionPackage", {
|
|
|
1556
1573
|
Remove: EnumCase<null>;
|
|
1557
1574
|
Override: EnumCase<TypeArgument<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>;
|
|
1558
1575
|
}, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>, false>;
|
|
1576
|
+
liturgies: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], Enum<"VariantOptionAction", {
|
|
1577
|
+
Remove: EnumCase<null>;
|
|
1578
|
+
Override: EnumCase<TypeArgument<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>;
|
|
1579
|
+
}, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>, false>;
|
|
1559
1580
|
}>, []>>, false>;
|
|
1560
1581
|
special_abilities: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], TypeAlias<"ProfessionVariantSpecialAbility", ObjectType<{
|
|
1561
1582
|
action: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"VariantSpecialAbilityAction", {
|
|
@@ -1828,6 +1849,10 @@ export declare const ProfessionVariant: Entity<"ProfessionVariant", {
|
|
|
1828
1849
|
Remove: EnumCase<null>;
|
|
1829
1850
|
Override: EnumCase<TypeArgument<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>;
|
|
1830
1851
|
}, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>, false>;
|
|
1852
|
+
liturgies: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<import("tsondb/schema/def").TypeParameter<string, import("tsondb/schema/def").Type>[], Enum<"VariantOptionAction", {
|
|
1853
|
+
Remove: EnumCase<null>;
|
|
1854
|
+
Override: EnumCase<TypeArgument<import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>>>;
|
|
1855
|
+
}, [T: import("tsondb/schema/def").TypeParameter<"T", import("tsondb/schema/def").Type>]>>, false>;
|
|
1831
1856
|
}>, []>>, false>;
|
|
1832
1857
|
special_abilities: import("tsondb/schema/def").MemberDecl<Array<IncludeIdentifier<[], TypeAlias<"ProfessionVariantSpecialAbility", ObjectType<{
|
|
1833
1858
|
action: import("tsondb/schema/def").MemberDecl<IncludeIdentifier<[], Enum<"VariantSpecialAbilityAction", {
|
package/lib/types/Profession.js
CHANGED
|
@@ -435,6 +435,9 @@ const ProfessionPackageOptions = TypeAlias(import.meta.url, {
|
|
|
435
435
|
skills: Optional({
|
|
436
436
|
type: IncludeIdentifier(SkillsOptions),
|
|
437
437
|
}),
|
|
438
|
+
liturgies: Optional({
|
|
439
|
+
type: IncludeIdentifier(LiturgiesOptions),
|
|
440
|
+
}),
|
|
438
441
|
}, { minProperties: 1 }),
|
|
439
442
|
});
|
|
440
443
|
const ProfessionVariantPackageOptions = TypeAlias(import.meta.url, {
|
|
@@ -470,6 +473,9 @@ const ProfessionVariantPackageOptions = TypeAlias(import.meta.url, {
|
|
|
470
473
|
skills: Optional({
|
|
471
474
|
type: GenIncludeIdentifier(VariantOptionAction, [IncludeIdentifier(SkillsOptions)]),
|
|
472
475
|
}),
|
|
476
|
+
liturgies: Optional({
|
|
477
|
+
type: GenIncludeIdentifier(VariantOptionAction, [IncludeIdentifier(LiturgiesOptions)]),
|
|
478
|
+
}),
|
|
473
479
|
}, { minProperties: 1 }),
|
|
474
480
|
});
|
|
475
481
|
const VariantOptionAction = GenEnum(import.meta.url, {
|
|
@@ -589,6 +595,16 @@ const SkillsOptions = TypeAlias(import.meta.url, {
|
|
|
589
595
|
}),
|
|
590
596
|
}),
|
|
591
597
|
});
|
|
598
|
+
const LiturgiesOptions = TypeAlias(import.meta.url, {
|
|
599
|
+
name: "LiturgiesOptions",
|
|
600
|
+
comment: `Buy liturgical chants and ceremonies for a specific amount of AP.`,
|
|
601
|
+
type: () => ObjectType({
|
|
602
|
+
ap_value: Required({
|
|
603
|
+
comment: "The AP value you can buy liturgical chants and ceremonies for.",
|
|
604
|
+
type: Integer({ minimum: 1 }),
|
|
605
|
+
}),
|
|
606
|
+
}),
|
|
607
|
+
});
|
|
592
608
|
const ProfessionName = TypeAlias(import.meta.url, {
|
|
593
609
|
name: "ProfessionName",
|
|
594
610
|
comment: "The name of the profession that may have sex-specific names. Useful if the term in generell is different (i.e. actor/actress) or if the language uses gendered nouns. The default name is also used in case neither the male nor female name strictly applies.",
|
|
@@ -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 BandageOrRemedy = Entity(import.meta.url, {
|
|
5
6
|
name: "BandageOrRemedy",
|
|
6
7
|
namePlural: "BandagesAndRemedies",
|
|
@@ -35,4 +36,13 @@ export const BandageOrRemedy = Entity(import.meta.url, {
|
|
|
35
36
|
keyPathInEntityMap: "name",
|
|
36
37
|
},
|
|
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
|
+
},
|
|
38
48
|
});
|
|
@@ -2,6 +2,7 @@ import { Entity, IncludeIdentifier, Object, Optional, Required } from "tsondb/sc
|
|
|
2
2
|
import { BlessedTraditionIdentifier } from "../../_Identifier.js";
|
|
3
3
|
import { src } from "../../source/_PublicationRef.js";
|
|
4
4
|
import { CombatUse, Complexity, Cost, DefaultItemTranslations, StructurePoints, Weight, } from "./_Item.js";
|
|
5
|
+
import { checkWeaponCombatTechniqueIntegrity } from "./_Weapon.js";
|
|
5
6
|
export const CeremonialItem = Entity(import.meta.url, {
|
|
6
7
|
name: "CeremonialItem",
|
|
7
8
|
namePlural: "CeremonialItems",
|
|
@@ -40,4 +41,13 @@ export const CeremonialItem = Entity(import.meta.url, {
|
|
|
40
41
|
keyPathInEntityMap: "name",
|
|
41
42
|
},
|
|
42
43
|
],
|
|
44
|
+
customConstraints: ({ instanceContent, ...rest }) => {
|
|
45
|
+
if (instanceContent.combat_use && instanceContent.combat_use.kind === "Weapon") {
|
|
46
|
+
return checkWeaponCombatTechniqueIntegrity({
|
|
47
|
+
...rest,
|
|
48
|
+
instanceContent: instanceContent.combat_use.Weapon,
|
|
49
|
+
}, true);
|
|
50
|
+
}
|
|
51
|
+
return [];
|
|
52
|
+
},
|
|
43
53
|
});
|
|
@@ -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 Clothes = Entity(import.meta.url, {
|
|
5
6
|
name: "Clothes",
|
|
6
7
|
namePlural: "Clothes",
|
|
@@ -35,4 +36,13 @@ export const Clothes = Entity(import.meta.url, {
|
|
|
35
36
|
keyPathInEntityMap: "name",
|
|
36
37
|
},
|
|
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
|
+
},
|
|
38
48
|
});
|
|
@@ -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 Container = Entity(import.meta.url, {
|
|
5
6
|
name: "Container",
|
|
6
7
|
namePlural: "Containers",
|
|
@@ -35,4 +36,13 @@ export const Container = Entity(import.meta.url, {
|
|
|
35
36
|
keyPathInEntityMap: "name",
|
|
36
37
|
},
|
|
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
|
+
},
|
|
38
48
|
});
|
|
@@ -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, Cost, DefaultItemTranslations, RestrictedTo, StructurePoints } from "./_Item.js";
|
|
4
|
+
import { checkWeaponCombatTechniqueIntegrity } from "./_Weapon.js";
|
|
4
5
|
export const EquipmentOfBlessedOnes = Entity(import.meta.url, {
|
|
5
6
|
name: "EquipmentOfBlessedOnes",
|
|
6
7
|
namePlural: "EquipmentOfBlessedOnes",
|
|
@@ -31,4 +32,13 @@ export const EquipmentOfBlessedOnes = Entity(import.meta.url, {
|
|
|
31
32
|
keyPathInEntityMap: "name",
|
|
32
33
|
},
|
|
33
34
|
],
|
|
35
|
+
customConstraints: ({ instanceContent, ...rest }) => {
|
|
36
|
+
if (instanceContent.combat_use && instanceContent.combat_use.kind === "Weapon") {
|
|
37
|
+
return checkWeaponCombatTechniqueIntegrity({
|
|
38
|
+
...rest,
|
|
39
|
+
instanceContent: instanceContent.combat_use.Weapon,
|
|
40
|
+
}, true);
|
|
41
|
+
}
|
|
42
|
+
return [];
|
|
43
|
+
},
|
|
34
44
|
});
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Entity, Enum, EnumCase, Float, IncludeIdentifier, Object, Optional, Required, TypeAlias, } 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 IlluminationLightSource = Entity(import.meta.url, {
|
|
5
6
|
name: "IlluminationLightSource",
|
|
6
7
|
namePlural: "IlluminationLightSources",
|
|
@@ -39,6 +40,15 @@ export const IlluminationLightSource = Entity(import.meta.url, {
|
|
|
39
40
|
keyPathInEntityMap: "name",
|
|
40
41
|
},
|
|
41
42
|
],
|
|
43
|
+
customConstraints: ({ instanceContent, ...rest }) => {
|
|
44
|
+
if (instanceContent.combat_use && instanceContent.combat_use.kind === "Weapon") {
|
|
45
|
+
return checkWeaponCombatTechniqueIntegrity({
|
|
46
|
+
...rest,
|
|
47
|
+
instanceContent: instanceContent.combat_use.Weapon,
|
|
48
|
+
}, true);
|
|
49
|
+
}
|
|
50
|
+
return [];
|
|
51
|
+
},
|
|
42
52
|
});
|
|
43
53
|
const BurningTime = Enum(import.meta.url, {
|
|
44
54
|
name: "BurningTime",
|
|
@@ -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 IlluminationRefillOrSupply = Entity(import.meta.url, {
|
|
5
6
|
name: "IlluminationRefillOrSupply",
|
|
6
7
|
namePlural: "IlluminationRefillsAndSupplies",
|
|
@@ -35,4 +36,13 @@ export const IlluminationRefillOrSupply = Entity(import.meta.url, {
|
|
|
35
36
|
keyPathInEntityMap: "name",
|
|
36
37
|
},
|
|
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
|
+
},
|
|
38
48
|
});
|