@archivist-gg/dnd5e 0.3.1 → 0.3.4

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 (259) hide show
  1. package/LICENSES/SRD.md +25 -6
  2. package/dist/armor/armor.codec.js +4 -3
  3. package/dist/armor/armor.parser.js +3 -2
  4. package/dist/armor/armor.schema.d.ts +4 -0
  5. package/dist/armor/armor.schema.js +2 -1
  6. package/dist/armor/armor.types.d.ts +8 -0
  7. package/dist/background/background.codec.js +7 -6
  8. package/dist/background/background.parser.js +6 -5
  9. package/dist/background/background.schema.d.ts +26 -0
  10. package/dist/background/background.schema.js +5 -4
  11. package/dist/background/background.types.d.ts +22 -0
  12. package/dist/{chunk-4TIJKN6O.js → chunk-23LZLBJK.js} +1 -1
  13. package/dist/{chunk-AFKTJXRA.js → chunk-2DFENQIJ.js} +18 -0
  14. package/dist/chunk-2FRUSVZS.js +489 -0
  15. package/dist/chunk-4FWNK4FD.js +159 -0
  16. package/dist/chunk-4U55VNC7.js +22 -0
  17. package/dist/{chunk-4JHOHWBI.js → chunk-4XTNPNQB.js} +1 -1
  18. package/dist/{chunk-HCP3GMHS.js → chunk-5N2GW72F.js} +15 -2
  19. package/dist/{chunk-42Y5IJKT.js → chunk-5U5FFFA3.js} +5 -1
  20. package/dist/{chunk-4F6AIZ36.js → chunk-5XMQPTHD.js} +1 -1
  21. package/dist/{chunk-GJOI2GHP.js → chunk-6GNXYAYP.js} +1 -1
  22. package/dist/chunk-6PKV5V2H.js +178 -0
  23. package/dist/{chunk-66XXW2Z2.js → chunk-6PXTNCBP.js} +2 -2
  24. package/dist/chunk-6X2NV665.js +33 -0
  25. package/dist/{chunk-LV4SNWZQ.js → chunk-6X4KUDMU.js} +8 -1
  26. package/dist/{chunk-ZMR77DDL.js → chunk-AW3EHF3L.js} +1 -1
  27. package/dist/chunk-CJYCVNW2.js +7 -0
  28. package/dist/chunk-COEOOQX2.js +133 -0
  29. package/dist/{chunk-XTIQWSFM.js → chunk-D5U7GMPX.js} +1 -1
  30. package/dist/{chunk-RAWJTA45.js → chunk-DEEHHLAP.js} +1 -1
  31. package/dist/{chunk-6IRYTM5V.js → chunk-DPUJDOKV.js} +119 -28
  32. package/dist/{chunk-73HOFQQ5.js → chunk-ESS46GR4.js} +1 -1
  33. package/dist/chunk-EVMUJYUD.js +195 -0
  34. package/dist/{chunk-2BWAID3Y.js → chunk-FDBWYMZK.js} +29 -3
  35. package/dist/{chunk-K6Q5OUGK.js → chunk-GFZ7PITJ.js} +86 -10
  36. package/dist/chunk-H7KBLR4X.js +81 -0
  37. package/dist/{chunk-L7E2UT5A.js → chunk-HB7XZXDK.js} +5 -1
  38. package/dist/{chunk-BIK4DFWK.js → chunk-HJ5EEZ47.js} +1 -1
  39. package/dist/{chunk-6NK2MUD3.js → chunk-HZA7OE7N.js} +9 -2
  40. package/dist/{chunk-TN6ZLTNU.js → chunk-I2NDWFDD.js} +51 -4
  41. package/dist/{chunk-RSDRMH54.js → chunk-IMZFOOVL.js} +1 -1
  42. package/dist/{chunk-3DZ74AKK.js → chunk-IN4M4X7P.js} +8 -2
  43. package/dist/chunk-IUAAXXNO.js +58 -0
  44. package/dist/{chunk-XJNECUPT.js → chunk-JC5UNIVM.js} +19 -0
  45. package/dist/chunk-JJ46T5XX.js +297 -0
  46. package/dist/{chunk-SE7AZDR3.js → chunk-JRDPUDT5.js} +29 -3
  47. package/dist/{chunk-24GFQU7T.js → chunk-JSZ4H6AQ.js} +1 -1
  48. package/dist/chunk-KU3YLF6D.js +106 -0
  49. package/dist/{chunk-5INR4NSL.js → chunk-LDDCNPHD.js} +1 -1
  50. package/dist/{chunk-5ZBE4CWV.js → chunk-LMBAEIP6.js} +1 -1
  51. package/dist/chunk-LVQLWRCU.js +15 -0
  52. package/dist/chunk-MI7P3NX3.js +161 -0
  53. package/dist/chunk-O4SRD3J5.js +165 -0
  54. package/dist/{chunk-D3CLOBE3.js → chunk-OSQFPGLM.js} +44 -8
  55. package/dist/chunk-OZP6JFGT.js +162 -0
  56. package/dist/{chunk-NAEPSZAM.js → chunk-PDJSUH24.js} +24 -2
  57. package/dist/chunk-PP2UHLBA.js +50 -0
  58. package/dist/chunk-PVCEA4HZ.js +6 -0
  59. package/dist/{chunk-XLSVNUTK.js → chunk-R3VAKWKW.js} +1 -1
  60. package/dist/chunk-RIXI5D3R.js +89 -0
  61. package/dist/chunk-RLGQ5PZZ.js +16 -0
  62. package/dist/chunk-S7REMWW4.js +21 -0
  63. package/dist/{chunk-7VJ6BOA5.js → chunk-SMLXZUBH.js} +9 -1
  64. package/dist/{chunk-NXSWH3AE.js → chunk-T26ZVCL5.js} +1 -1
  65. package/dist/chunk-TOM66P2P.js +38 -0
  66. package/dist/chunk-UA5KS2PL.js +26 -0
  67. package/dist/{chunk-N6N74K6X.js → chunk-UBBKSYBY.js} +1 -1
  68. package/dist/{chunk-353WXS6S.js → chunk-UIRMA5KM.js} +1 -1
  69. package/dist/{chunk-GE4TLPWM.js → chunk-US5IKYCW.js} +1 -1
  70. package/dist/chunk-UXPGW4TI.js +101 -0
  71. package/dist/chunk-VQAXTIBW.js +100 -0
  72. package/dist/{chunk-WP2CX2JO.js → chunk-WELIKLZF.js} +22 -1
  73. package/dist/chunk-WPWOHGPI.js +172 -0
  74. package/dist/{chunk-GZ46OVGZ.js → chunk-WSVMLNTO.js} +1 -1
  75. package/dist/{chunk-4LZJXJJS.js → chunk-WXWPK3LI.js} +6 -2
  76. package/dist/{chunk-ZZGEVJKX.js → chunk-XBQMCEI2.js} +1 -1
  77. package/dist/{chunk-PHQRGDRQ.js → chunk-XGOFP7AQ.js} +5 -1
  78. package/dist/chunk-XJ2F2WO6.js +8 -0
  79. package/dist/chunk-XQCSGNXE.js +1580 -0
  80. package/dist/chunk-YBLDE5CG.js +42 -0
  81. package/dist/{chunk-JEYQU3JT.js → chunk-YHYTW5QA.js} +2 -18
  82. package/dist/{chunk-TLYDBT5F.js → chunk-YJJTISBN.js} +64 -7
  83. package/dist/{chunk-PZOWBI3B.js → chunk-YLL2QXY2.js} +7 -2
  84. package/dist/{chunk-MDEJHMKK.js → chunk-ZONJ66NE.js} +26 -5
  85. package/dist/class/class.codec.js +12 -9
  86. package/dist/class/class.parser.js +11 -8
  87. package/dist/class/class.schema.d.ts +55 -3
  88. package/dist/class/class.schema.js +9 -7
  89. package/dist/class/class.types.d.ts +48 -3
  90. package/dist/condition/condition.codec.d.ts +9 -0
  91. package/dist/condition/condition.entity-type.d.ts +2 -0
  92. package/dist/condition/condition.parser.d.ts +13 -0
  93. package/dist/condition/condition.parser.js +7 -0
  94. package/dist/condition/condition.schema.d.ts +29 -0
  95. package/dist/condition/condition.types.d.ts +15 -0
  96. package/dist/condition/condition.types.js +0 -0
  97. package/dist/dnd/constants.d.ts +22 -0
  98. package/dist/dnd/constants.js +9 -3
  99. package/dist/dnd/formula-tags.js +2 -2
  100. package/dist/dnd/math.d.ts +26 -0
  101. package/dist/dnd/math.js +12 -2
  102. package/dist/dnd/prose-tags.js +1 -1
  103. package/dist/dnd/resource-formula.d.ts +36 -10
  104. package/dist/dnd/resource-formula.js +10 -155
  105. package/dist/dnd/srd-tag-converter.js +3 -3
  106. package/dist/dnd/tag-grammar.js +1 -1
  107. package/dist/dnd/warn-once.d.ts +2 -0
  108. package/dist/dnd/warn-once.js +8 -0
  109. package/dist/entities/base-item-resolver.js +2 -2
  110. package/dist/entities/slug.d.ts +13 -0
  111. package/dist/entities/slug.js +5 -3
  112. package/dist/entities/wikilink-display.d.ts +3 -0
  113. package/dist/entities/wikilink-display.js +10 -0
  114. package/dist/feat/feat.category-codes.d.ts +32 -0
  115. package/dist/feat/feat.category-codes.js +14 -0
  116. package/dist/feat/feat.codec.js +7 -5
  117. package/dist/feat/feat.parser.js +6 -4
  118. package/dist/feat/feat.schema.d.ts +230 -0
  119. package/dist/feat/feat.schema.js +5 -3
  120. package/dist/feat/feat.types.d.ts +37 -1
  121. package/dist/index.js +2033 -6907
  122. package/dist/item/item.codec.js +4 -3
  123. package/dist/item/item.enrichment.js +4 -4
  124. package/dist/item/item.parser.js +3 -2
  125. package/dist/item/item.schema.d.ts +69 -3
  126. package/dist/item/item.schema.js +2 -1
  127. package/dist/item/item.types.d.ts +69 -3
  128. package/dist/monster/monster.codec.d.ts +7 -6
  129. package/dist/monster/monster.enrichment.js +4 -4
  130. package/dist/monster/monster.format.d.ts +135 -0
  131. package/dist/monster/monster.format.js +78 -0
  132. package/dist/monster/monster.parser.d.ts +6 -1
  133. package/dist/monster/monster.parser.js +10 -1
  134. package/dist/monster/monster.schema.d.ts +369 -0
  135. package/dist/monster/monster.schema.js +34 -0
  136. package/dist/monster/monster.types.d.ts +200 -14
  137. package/dist/optional-feature/optional-feature.codec.js +6 -5
  138. package/dist/optional-feature/optional-feature.parser.js +5 -4
  139. package/dist/optional-feature/optional-feature.schema.d.ts +176 -0
  140. package/dist/optional-feature/optional-feature.schema.js +4 -3
  141. package/dist/pack.d.ts +1 -1
  142. package/dist/pc/conditions.constants.d.ts +0 -1
  143. package/dist/pc/conditions.constants.js +1 -3
  144. package/dist/pc/decision-recognizer.js +1 -1
  145. package/dist/pc/pc.additional-spells.d.ts +47 -0
  146. package/dist/pc/pc.additional-spells.js +23 -0
  147. package/dist/pc/pc.asi-flatten.d.ts +18 -0
  148. package/dist/pc/pc.decision-engine.d.ts +105 -17
  149. package/dist/pc/pc.decision-engine.js +28 -12
  150. package/dist/pc/pc.defense-normalize.d.ts +11 -0
  151. package/dist/pc/pc.defense-normalize.js +6 -0
  152. package/dist/pc/pc.equipment.d.ts +30 -1
  153. package/dist/pc/pc.equipment.js +12 -8
  154. package/dist/pc/pc.feature-effects.d.ts +225 -11
  155. package/dist/pc/pc.feature-effects.js +21 -5
  156. package/dist/pc/pc.parser.js +2 -2
  157. package/dist/pc/pc.pools.d.ts +11 -3
  158. package/dist/pc/pc.pools.js +9 -13
  159. package/dist/pc/pc.proficiencies.d.ts +54 -29
  160. package/dist/pc/pc.proficiencies.js +74 -95
  161. package/dist/pc/pc.proficiency-grants.d.ts +58 -0
  162. package/dist/pc/pc.proficiency-normalize.d.ts +24 -0
  163. package/dist/pc/pc.proficiency-normalize.js +12 -0
  164. package/dist/pc/pc.proficiency-query.d.ts +13 -0
  165. package/dist/pc/pc.proficiency-query.js +1 -1
  166. package/dist/pc/pc.recalc.d.ts +69 -14
  167. package/dist/pc/pc.recalc.js +261 -122
  168. package/dist/pc/pc.resolver.d.ts +34 -8
  169. package/dist/pc/pc.resolver.js +27 -12
  170. package/dist/pc/pc.resource-seed.d.ts +3 -2
  171. package/dist/pc/pc.resource-seed.js +19 -17
  172. package/dist/pc/pc.resources.d.ts +87 -0
  173. package/dist/pc/pc.resources.js +21 -0
  174. package/dist/pc/pc.rest.d.ts +10 -1
  175. package/dist/pc/pc.rest.js +66 -12
  176. package/dist/pc/pc.schema.d.ts +139 -3
  177. package/dist/pc/pc.schema.js +4 -2
  178. package/dist/pc/pc.slotting.js +3 -3
  179. package/dist/pc/pc.spellcasting.d.ts +75 -6
  180. package/dist/pc/pc.spellcasting.js +16 -6
  181. package/dist/pc/pc.table-column.d.ts +23 -0
  182. package/dist/pc/pc.table-column.js +13 -3
  183. package/dist/pc/pc.types.d.ts +251 -12
  184. package/dist/pc/pool-layout.d.ts +47 -0
  185. package/dist/pc/pool-layout.js +16 -0
  186. package/dist/pc/roll-scope.d.ts +2 -0
  187. package/dist/pc/roll-scope.js +8 -0
  188. package/dist/pc/roll-tag-labels.d.ts +40 -0
  189. package/dist/pc/roll-tag-labels.js +17 -0
  190. package/dist/pc/spell-source.d.ts +21 -0
  191. package/dist/pc/spell-source.js +13 -0
  192. package/dist/race/race.codec.js +9 -7
  193. package/dist/race/race.parser.js +8 -6
  194. package/dist/race/race.schema.d.ts +51 -1
  195. package/dist/race/race.schema.js +8 -5
  196. package/dist/race/race.structural.d.ts +7 -0
  197. package/dist/race/race.structural.js +6 -0
  198. package/dist/race/race.types.d.ts +20 -0
  199. package/dist/schemas/attack-schema.d.ts +5 -0
  200. package/dist/schemas/caster-type-schema.d.ts +14 -0
  201. package/dist/schemas/caster-type-schema.js +6 -0
  202. package/dist/schemas/choice-schema.js +2 -2
  203. package/dist/schemas/entity-extras-schema.d.ts +53 -0
  204. package/dist/schemas/entity-extras-schema.js +10 -0
  205. package/dist/schemas/equipment-grant-schema.d.ts +2 -0
  206. package/dist/schemas/equipment-grant-schema.js +1 -1
  207. package/dist/schemas/feature-alias.d.ts +34 -0
  208. package/dist/schemas/feature-effect-schema.d.ts +124 -0
  209. package/dist/schemas/feature-effect-schema.js +1 -1
  210. package/dist/schemas/feature-schema.d.ts +8 -0
  211. package/dist/schemas/feature-schema.js +6 -4
  212. package/dist/schemas/resource-schema.d.ts +43 -0
  213. package/dist/schemas/resource-schema.js +1 -1
  214. package/dist/schemas/selection-pool-schema.d.ts +2 -0
  215. package/dist/schemas/selection-pool-schema.js +1 -1
  216. package/dist/spell/spell.access.js +23 -3
  217. package/dist/spell/spell.codec.js +4 -3
  218. package/dist/spell/spell.enrichment.js +4 -4
  219. package/dist/spell/spell.parser.d.ts +30 -0
  220. package/dist/spell/spell.parser.js +9 -2
  221. package/dist/spell/spell.scaling.d.ts +27 -6
  222. package/dist/spell/spell.scaling.js +25 -6
  223. package/dist/spell/spell.schema.d.ts +44 -2
  224. package/dist/spell/spell.schema.js +2 -1
  225. package/dist/spell/spell.types.d.ts +14 -0
  226. package/dist/subclass/subclass.codec.d.ts +1 -1
  227. package/dist/subclass/subclass.codec.js +11 -8
  228. package/dist/subclass/subclass.parser.js +10 -7
  229. package/dist/subclass/subclass.schema.d.ts +54 -7
  230. package/dist/subclass/subclass.schema.js +8 -6
  231. package/dist/subclass/subclass.types.d.ts +20 -2
  232. package/dist/types/choice.d.ts +53 -2
  233. package/dist/types/choice.js +13 -1
  234. package/dist/types/equipment-grant.d.ts +8 -1
  235. package/dist/types/feature-effect.d.ts +78 -23
  236. package/dist/types/feature.d.ts +70 -1
  237. package/dist/types/optional-feature.types.d.ts +28 -0
  238. package/dist/types/resource.d.ts +21 -1
  239. package/dist/types/selection-pool.d.ts +17 -2
  240. package/dist/weapon/weapon.classify.js +2 -2
  241. package/dist/weapon/weapon.codec.js +4 -3
  242. package/dist/weapon/weapon.parser.js +3 -2
  243. package/dist/weapon/weapon.schema.d.ts +4 -0
  244. package/dist/weapon/weapon.schema.js +2 -1
  245. package/dist/weapon/weapon.types.d.ts +8 -0
  246. package/package.json +2 -2
  247. package/dist/chunk-5XUXXAQJ.js +0 -30
  248. package/dist/chunk-7P65Q426.js +0 -158
  249. package/dist/chunk-7TEK5KK7.js +0 -49
  250. package/dist/chunk-AIRFC5NQ.js +0 -143
  251. package/dist/chunk-CZPMTQOY.js +0 -68
  252. package/dist/chunk-N2JE7BWL.js +0 -81
  253. package/dist/chunk-NXR3BD2V.js +0 -90
  254. package/dist/chunk-O5EYMKFH.js +0 -6
  255. package/dist/chunk-Q5K6LWBZ.js +0 -45
  256. package/dist/chunk-TNUFPIXI.js +0 -1110
  257. package/dist/chunk-TZK36BU7.js +0 -38
  258. package/dist/chunk-W7HWMMBF.js +0 -46
  259. package/dist/chunk-Y4I74YEG.js +0 -33
@@ -1,81 +0,0 @@
1
- import {
2
- spellEntitySchema
3
- } from "./chunk-Y4I74YEG.js";
4
-
5
- // src/spell/spell.parser.ts
6
- import { parseYaml, toStringSafe } from "@archivist-gg/core";
7
- var KNOWN_KEYS = /* @__PURE__ */ new Set([
8
- "name",
9
- "level",
10
- "school",
11
- "casting_time",
12
- "range",
13
- "components",
14
- "duration",
15
- "concentration",
16
- "ritual",
17
- "classes",
18
- "description",
19
- "at_higher_levels",
20
- "damage",
21
- "saving_throw",
22
- "casting_options",
23
- // Body-only metadata that's emitted to YAML but ignored at runtime — accept silently.
24
- "slug",
25
- "edition",
26
- "source"
27
- ]);
28
- function parseSpell(source) {
29
- const result = parseYaml(source, ["name"]);
30
- if (!result.success) return result;
31
- const meta = {};
32
- if (typeof result.data.source === "string") meta.source = result.data.source;
33
- if (typeof result.data.edition === "string") meta.edition = result.data.edition;
34
- const filtered = {};
35
- for (const [k, v] of Object.entries(result.data)) {
36
- if (k === "slug" || k === "edition" || k === "source") continue;
37
- if (!KNOWN_KEYS.has(k)) {
38
- return { success: false, error: `Unknown spell field: ${k}` };
39
- }
40
- filtered[k] = v;
41
- }
42
- const parsed = spellEntitySchema.safeParse(filtered);
43
- if (!parsed.success) {
44
- return { success: false, error: `spell schema validation failed: ${parsed.error.message}` };
45
- }
46
- const raw = parsed.data;
47
- const spell = { name: raw.name };
48
- if (raw.level != null) spell.level = raw.level;
49
- if (raw.school != null) spell.school = toStringSafe(raw.school);
50
- if (raw.casting_time != null) spell.casting_time = toStringSafe(raw.casting_time);
51
- if (raw.range != null) spell.range = toStringSafe(raw.range);
52
- if (raw.components != null) spell.components = toStringSafe(raw.components);
53
- if (raw.duration != null) spell.duration = toStringSafe(raw.duration);
54
- if (raw.concentration != null) spell.concentration = Boolean(raw.concentration);
55
- if (raw.ritual != null) spell.ritual = Boolean(raw.ritual);
56
- if (raw.classes) spell.classes = raw.classes.map(String);
57
- if (raw.description) spell.description = raw.description;
58
- if (raw.at_higher_levels) spell.at_higher_levels = raw.at_higher_levels.map(String);
59
- if (raw.damage) spell.damage = { types: raw.damage.types.map(String) };
60
- if (raw.saving_throw) spell.saving_throw = { ability: raw.saving_throw.ability };
61
- if (raw.casting_options) {
62
- spell.casting_options = raw.casting_options.map((opt) => {
63
- const co = { type: opt.type };
64
- if (opt.damage_roll !== void 0) co.damage_roll = opt.damage_roll;
65
- if (opt.target_count !== void 0) co.target_count = opt.target_count;
66
- if (opt.duration !== void 0) co.duration = opt.duration;
67
- if (opt.range !== void 0) co.range = opt.range;
68
- if (opt.concentration !== void 0) co.concentration = opt.concentration;
69
- if (opt.shape_size !== void 0) co.shape_size = opt.shape_size;
70
- if (opt.desc !== void 0) co.desc = opt.desc;
71
- return co;
72
- });
73
- }
74
- if (meta.source) spell.source = meta.source;
75
- if (meta.edition) spell.edition = meta.edition;
76
- return { success: true, data: spell };
77
- }
78
-
79
- export {
80
- parseSpell
81
- };
@@ -1,90 +0,0 @@
1
- // src/schemas/feature-effect-schema.ts
2
- import { z } from "zod";
3
- var featureEffectSchema = z.discriminatedUnion("kind", [
4
- z.object({ kind: z.literal("initiative-bonus"), value: z.number().int() }),
5
- z.object({ kind: z.literal("immune-condition"), condition: z.string().min(1), while: z.string().optional() }),
6
- z.object({ kind: z.literal("resistance"), damage_type: z.string().min(1) }),
7
- z.object({ kind: z.literal("hp-per-level-bonus"), value: z.number().int() }),
8
- z.object({
9
- kind: z.literal("speed-bonus"),
10
- mode: z.enum(["walk", "fly", "swim", "climb", "burrow"]),
11
- value: z.number().int(),
12
- // when true, value is an absolute floor (Math.max), not additive; currently
13
- // only surfaced for mode:"walk" — other modes have no derived speed yet.
14
- set: z.boolean().optional()
15
- }),
16
- z.object({
17
- kind: z.literal("sense"),
18
- type: z.enum(["darkvision", "blindsight", "tremorsense", "truesight"]),
19
- range: z.number().int().nonnegative()
20
- }),
21
- z.object({
22
- kind: z.literal("apply-condition"),
23
- condition: z.string().min(1),
24
- duration: z.string().optional(),
25
- ends_on: z.array(z.string()).optional(),
26
- save_repeat: z.object({
27
- ability: z.string().min(1),
28
- timing: z.string().min(1)
29
- }).optional()
30
- }),
31
- z.object({
32
- kind: z.literal("damage-bonus"),
33
- // intentionally an open string, NOT a damage-type enum: must accept the
34
- // literal "chosen" (player-selected damage type at action time) alongside
35
- // canonical damage types. Do not tighten to an enum.
36
- damage_type: z.string().min(1),
37
- amount: z.string().min(1),
38
- applies_to: z.enum(["weapon", "spell", "all"]).optional(),
39
- condition: z.string().optional()
40
- }),
41
- z.object({
42
- kind: z.literal("proficiency"),
43
- proficiency_type: z.enum(["skill", "tool", "language", "saving-throw", "armor", "weapon"]),
44
- value: z.string().min(1)
45
- }),
46
- z.object({
47
- kind: z.literal("ac-bonus"),
48
- value: z.number().int(),
49
- requires_armor: z.boolean().optional()
50
- }),
51
- z.object({
52
- kind: z.literal("unarmored-ac"),
53
- abilities: z.array(z.enum(["str", "dex", "con", "int", "wis", "cha"])),
54
- base: z.number().int().optional(),
55
- allow_shield: z.boolean().optional()
56
- }),
57
- z.object({
58
- kind: z.literal("weapon-ability"),
59
- ability: z.union([z.enum(["str", "dex", "con", "int", "wis", "cha"]), z.literal("spellcasting")]),
60
- weapons: z.union([z.literal("chosen"), z.string(), z.array(z.string())]).optional()
61
- }),
62
- z.object({
63
- kind: z.literal("roll-modifier"),
64
- mode: z.enum(["advantage", "disadvantage"]),
65
- roll: z.enum(["ability-check", "saving-throw", "attack"]),
66
- scope: z.string().optional(),
67
- condition: z.string().optional()
68
- }),
69
- z.object({ kind: z.literal("extra-attack"), count: z.number().int().positive() }),
70
- z.object({
71
- kind: z.literal("crit-range"),
72
- min_roll: z.number().int().min(2).max(20),
73
- applies_to: z.enum(["weapon", "spell", "all"]).optional(),
74
- condition: z.string().optional()
75
- }),
76
- z.object({
77
- kind: z.literal("reroll-damage"),
78
- max_reroll: z.number().int().positive(),
79
- applies_to: z.enum(["weapon", "spell", "all"]).optional(),
80
- once_per_die: z.boolean().optional()
81
- }),
82
- z.object({
83
- kind: z.literal("attack-rule"),
84
- flag: z.enum(["no-ranged-in-melee-disadvantage"])
85
- })
86
- ]);
87
-
88
- export {
89
- featureEffectSchema
90
- };
@@ -1,6 +0,0 @@
1
- // src/pc/pc.proficiency-normalize.ts
2
- var normKey = (s) => s.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim().split(/\s+/).filter(Boolean).map((w) => w.endsWith("s") ? w.slice(0, -1) : w).sort().join(" ");
3
-
4
- export {
5
- normKey
6
- };
@@ -1,45 +0,0 @@
1
- import {
2
- choiceSchema
3
- } from "./chunk-NXSWH3AE.js";
4
- import {
5
- featureEffectSchema
6
- } from "./chunk-NXR3BD2V.js";
7
-
8
- // src/feat/feat.schema.ts
9
- import { z } from "zod";
10
- var abilityEnum = z.enum(["str", "dex", "con", "int", "wis", "cha"]);
11
- var editionEnum = z.enum(["2014", "2024"]);
12
- var categoryEnum = z.enum(["origin", "general", "fighting-style", "epic-boon"]);
13
- var prerequisiteSchema = z.discriminatedUnion("kind", [
14
- z.object({ kind: z.literal("ability"), ability: abilityEnum, min: z.number().int().positive() }),
15
- z.object({ kind: z.literal("level"), min: z.number().int().positive() }),
16
- z.object({ kind: z.literal("spellcaster") }),
17
- z.object({
18
- kind: z.literal("proficiency"),
19
- proficiency_type: z.enum(["armor", "weapon", "tool", "skill", "saving-throw"]),
20
- value: z.string().min(1)
21
- }),
22
- z.object({ kind: z.literal("race"), slug: z.string().min(1) }),
23
- z.object({ kind: z.literal("class"), slug: z.string().min(1) })
24
- ]);
25
- var featEntitySchema = z.object({
26
- slug: z.string().min(1),
27
- name: z.string().min(1),
28
- edition: editionEnum,
29
- source: z.string().min(1),
30
- category: categoryEnum,
31
- description: z.string(),
32
- prerequisites: z.array(prerequisiteSchema),
33
- benefits: z.array(z.string()),
34
- effects: z.array(featureEffectSchema),
35
- grants_asi: z.object({
36
- amount: z.number().int().positive(),
37
- pool: z.array(abilityEnum).optional()
38
- }).nullable(),
39
- repeatable: z.boolean(),
40
- choices: z.array(choiceSchema)
41
- });
42
-
43
- export {
44
- featEntitySchema
45
- };