@elite-dangerous-almanac/core 0.2.7 → 0.2.9

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 (266) hide show
  1. package/PROVENANCE/astro/SOURCES.md +13 -12
  2. package/PROVENANCE/commodities/SOURCES.md +50 -6
  3. package/PROVENANCE/equipment/SOURCES.md +229 -29
  4. package/PROVENANCE/i18n/SOURCES.md +328 -73
  5. package/PROVENANCE/ships/SOURCES.md +352 -216
  6. package/README.md +30 -7
  7. package/THIRD_PARTY_NOTICES.md +12 -1
  8. package/dist/astro/body-rings.d.ts +2 -2
  9. package/dist/astro/codex-region-lookup.d.ts +1 -1
  10. package/dist/astro/codex-region-lookup.js +1 -1
  11. package/dist/astro/hand-authored-regions.d.ts +1 -1
  12. package/dist/astro/index.d.ts +1 -1
  13. package/dist/astro/index.js +1 -1
  14. package/dist/astro/naming-region-origins.d.ts +1 -1
  15. package/dist/astro/naming-region-origins.js +1 -1
  16. package/dist/astro/nebulae-all.d.ts +4 -6
  17. package/dist/astro/nebulae-all.js +1 -1
  18. package/dist/astro/nebulae-all.js.map +1 -1
  19. package/dist/astro/nebulae-planetary.d.ts +4 -5
  20. package/dist/astro/nebulae-planetary.js +1 -1
  21. package/dist/astro/nebulae-procgen.d.ts +3 -3
  22. package/dist/astro/nebulae-real.d.ts +3 -3
  23. package/dist/astro/nebulae.d.ts +8 -8
  24. package/dist/astro/permit-locked-regions.d.ts +2 -2
  25. package/dist/astro/permit-locked-systems.d.ts +1 -1
  26. package/dist/astro/permit-locks.d.ts +2 -2
  27. package/dist/astro/procedural-system.d.ts +3 -3
  28. package/dist/astro/procedural-system.js +1 -1
  29. package/dist/astro/system-address.d.ts +1 -1
  30. package/dist/astro/system-address.js +1 -1
  31. package/dist/astro/system-name.js +1 -1
  32. package/dist/{chunk-XSLPWM5N.js → chunk-2J6NNI3Y.js} +1 -1
  33. package/dist/{chunk-DWRNXUAX.js → chunk-2KIZN3BY.js} +1 -1
  34. package/dist/{chunk-J7BM5NGK.js → chunk-2TY42PTF.js} +1 -1
  35. package/dist/{chunk-MVBVXK3G.js → chunk-3GNYPM6J.js} +1 -1
  36. package/dist/{chunk-MVBVXK3G.js.map → chunk-3GNYPM6J.js.map} +1 -1
  37. package/dist/{chunk-773VO2GK.js → chunk-4T3TTYUT.js} +1 -1
  38. package/dist/{chunk-773VO2GK.js.map → chunk-4T3TTYUT.js.map} +1 -1
  39. package/dist/chunk-7C7NJWCF.js +1 -0
  40. package/dist/chunk-7C7NJWCF.js.map +1 -0
  41. package/dist/{chunk-FMA36V6A.js → chunk-7Y5EK2VO.js} +1 -1
  42. package/dist/{chunk-FMA36V6A.js.map → chunk-7Y5EK2VO.js.map} +1 -1
  43. package/dist/chunk-AC3U7LRK.js +1 -0
  44. package/dist/{chunk-MGRDB2BZ.js.map → chunk-AC3U7LRK.js.map} +1 -1
  45. package/dist/{chunk-BJU27V6C.js → chunk-AUBV6S7V.js} +1 -1
  46. package/dist/{chunk-BJU27V6C.js.map → chunk-AUBV6S7V.js.map} +1 -1
  47. package/dist/{chunk-DI5RXSJR.js → chunk-BVLBS2QY.js} +1 -1
  48. package/dist/{chunk-DI5RXSJR.js.map → chunk-BVLBS2QY.js.map} +1 -1
  49. package/dist/chunk-C3YZ5KTA.js +1 -0
  50. package/dist/chunk-C3YZ5KTA.js.map +1 -0
  51. package/dist/{chunk-6UNAD74Z.js → chunk-C4FUV6GF.js} +1 -1
  52. package/dist/{chunk-6UNAD74Z.js.map → chunk-C4FUV6GF.js.map} +1 -1
  53. package/dist/chunk-CEF7SMB2.js +1 -0
  54. package/dist/chunk-CEF7SMB2.js.map +1 -0
  55. package/dist/chunk-E2HDF6PJ.js +1 -0
  56. package/dist/chunk-E2HDF6PJ.js.map +1 -0
  57. package/dist/{chunk-OFZGNWBT.js → chunk-ETREYN5U.js} +1 -1
  58. package/dist/{chunk-OFZGNWBT.js.map → chunk-ETREYN5U.js.map} +1 -1
  59. package/dist/{chunk-KBCA4GEZ.js → chunk-FP2TQJZP.js} +1 -1
  60. package/dist/{chunk-F7VWRDSL.js → chunk-G7WARJ3X.js} +1 -1
  61. package/dist/chunk-G7WARJ3X.js.map +1 -0
  62. package/dist/{chunk-Z4OUB4SJ.js → chunk-GLTCCDN5.js} +1 -1
  63. package/dist/{chunk-Z4OUB4SJ.js.map → chunk-GLTCCDN5.js.map} +1 -1
  64. package/dist/chunk-GVNTKCVF.js +1 -0
  65. package/dist/chunk-GVNTKCVF.js.map +1 -0
  66. package/dist/{chunk-Q6YDPREF.js → chunk-GZLD7RTK.js} +1 -1
  67. package/dist/{chunk-Q6YDPREF.js.map → chunk-GZLD7RTK.js.map} +1 -1
  68. package/dist/chunk-HIJR7DOC.js +1 -0
  69. package/dist/chunk-HIJR7DOC.js.map +1 -0
  70. package/dist/{chunk-ETWMPMZP.js → chunk-K5JK3XQB.js} +1 -1
  71. package/dist/{chunk-GRIK3EDH.js → chunk-KY7KSPU6.js} +1 -1
  72. package/dist/{chunk-GRIK3EDH.js.map → chunk-KY7KSPU6.js.map} +1 -1
  73. package/dist/{chunk-EHFHRQEP.js → chunk-M4STXLXO.js} +1 -1
  74. package/dist/{chunk-EHFHRQEP.js.map → chunk-M4STXLXO.js.map} +1 -1
  75. package/dist/{chunk-NZXSIHAW.js → chunk-OSMBAFRW.js} +1 -1
  76. package/dist/{chunk-NZXSIHAW.js.map → chunk-OSMBAFRW.js.map} +1 -1
  77. package/dist/chunk-PIU24HRN.js +1 -0
  78. package/dist/chunk-PIU24HRN.js.map +1 -0
  79. package/dist/{chunk-ELT3FEA4.js → chunk-PKKBYBL4.js} +1 -1
  80. package/dist/{chunk-ELT3FEA4.js.map → chunk-PKKBYBL4.js.map} +1 -1
  81. package/dist/{chunk-6HMIF2RJ.js → chunk-Q647OXON.js} +1 -1
  82. package/dist/{chunk-6HMIF2RJ.js.map → chunk-Q647OXON.js.map} +1 -1
  83. package/dist/{chunk-BMQM4JBL.js → chunk-QPT2WJYN.js} +1 -1
  84. package/dist/{chunk-BMQM4JBL.js.map → chunk-QPT2WJYN.js.map} +1 -1
  85. package/dist/{chunk-A6OINYNP.js → chunk-R2AEZYX7.js} +1 -1
  86. package/dist/chunk-RA4YJBU5.js +1 -0
  87. package/dist/chunk-RA4YJBU5.js.map +1 -0
  88. package/dist/{chunk-MRLUWHGI.js → chunk-RJ3ZLQRB.js} +1 -1
  89. package/dist/{chunk-MRLUWHGI.js.map → chunk-RJ3ZLQRB.js.map} +1 -1
  90. package/dist/chunk-SFEQXUIA.js +1 -0
  91. package/dist/chunk-SIL356HB.js +1 -0
  92. package/dist/chunk-SIL356HB.js.map +1 -0
  93. package/dist/chunk-SS7HVNP5.js +1 -0
  94. package/dist/chunk-SS7HVNP5.js.map +1 -0
  95. package/dist/chunk-TRGHPX2O.js +1 -0
  96. package/dist/chunk-TRGHPX2O.js.map +1 -0
  97. package/dist/{chunk-GMTAFUAG.js → chunk-TYRH73MO.js} +1 -1
  98. package/dist/{chunk-GMTAFUAG.js.map → chunk-TYRH73MO.js.map} +1 -1
  99. package/dist/{chunk-7TVFV3VO.js → chunk-U3IRMXMR.js} +1 -1
  100. package/dist/{chunk-A7IVMYNF.js → chunk-U73MBQ45.js} +1 -1
  101. package/dist/{chunk-A7IVMYNF.js.map → chunk-U73MBQ45.js.map} +1 -1
  102. package/dist/{chunk-IZIIGK3W.js → chunk-UE22QU7A.js} +1 -1
  103. package/dist/{chunk-IZIIGK3W.js.map → chunk-UE22QU7A.js.map} +1 -1
  104. package/dist/{chunk-DBDCOHI4.js → chunk-UI5RROGI.js} +1 -1
  105. package/dist/{chunk-DBDCOHI4.js.map → chunk-UI5RROGI.js.map} +1 -1
  106. package/dist/chunk-URRPEUIK.js +1 -0
  107. package/dist/{chunk-QJECDMQQ.js.map → chunk-URRPEUIK.js.map} +1 -1
  108. package/dist/chunk-UTWZZOSA.js +1 -0
  109. package/dist/chunk-UTWZZOSA.js.map +1 -0
  110. package/dist/{chunk-ZEN5K3GE.js → chunk-UVX7RCMP.js} +1 -1
  111. package/dist/{chunk-ZEN5K3GE.js.map → chunk-UVX7RCMP.js.map} +1 -1
  112. package/dist/{chunk-7ATBEOVC.js → chunk-WG4DPXJI.js} +1 -1
  113. package/dist/{chunk-XFDMCPDW.js → chunk-WZIBBJHA.js} +1 -1
  114. package/dist/{chunk-XFDMCPDW.js.map → chunk-WZIBBJHA.js.map} +1 -1
  115. package/dist/{chunk-7S7ZTZZY.js → chunk-X3MXPE7G.js} +1 -1
  116. package/dist/{chunk-7S7ZTZZY.js.map → chunk-X3MXPE7G.js.map} +1 -1
  117. package/dist/{chunk-SD6GNFDX.js → chunk-YBE5M27G.js} +1 -1
  118. package/dist/{chunk-SD6GNFDX.js.map → chunk-YBE5M27G.js.map} +1 -1
  119. package/dist/chunk-ZBUTGTZ3.js +1 -0
  120. package/dist/chunk-ZBUTGTZ3.js.map +1 -0
  121. package/dist/commodities/commodities-all.d.ts +2 -2
  122. package/dist/commodities/commodities-all.js +1 -1
  123. package/dist/commodities/commodities-rare.d.ts +3 -4
  124. package/dist/commodities/commodities-rare.js +1 -1
  125. package/dist/commodities/commodities-standard.d.ts +7 -7
  126. package/dist/commodities/commodities-standard.js +1 -1
  127. package/dist/commodities/commodities.d.ts +12 -12
  128. package/dist/commodities/commodities.js +1 -1
  129. package/dist/commodities/index.js +1 -1
  130. package/dist/equipment/engineering.d.ts +58 -1
  131. package/dist/equipment/engineering.js +1 -1
  132. package/dist/equipment/index.d.ts +14 -3
  133. package/dist/equipment/index.js +1 -1
  134. package/dist/equipment/modification-journal.js +1 -1
  135. package/dist/equipment/modifications.d.ts +43 -11
  136. package/dist/equipment/modifications.js +1 -1
  137. package/dist/equipment/suits.d.ts +2 -115
  138. package/dist/equipment/suits.js +1 -1
  139. package/dist/equipment/tools.d.ts +102 -0
  140. package/dist/equipment/tools.js +1 -0
  141. package/dist/equipment/tools.js.map +1 -0
  142. package/dist/equipment/upgrade-costs.d.ts +2 -3
  143. package/dist/equipment/upgrade-costs.js +1 -1
  144. package/dist/equipment/weapons.d.ts +2 -121
  145. package/dist/equipment/weapons.js +1 -1
  146. package/dist/i18n/blueprints.d.ts +2 -3
  147. package/dist/i18n/blueprints.js +1 -1
  148. package/dist/i18n/commodities.d.ts +36 -0
  149. package/dist/i18n/commodities.js +1 -0
  150. package/dist/i18n/commodities.js.map +1 -0
  151. package/dist/i18n/experimental-effect-descriptions.d.ts +5 -6
  152. package/dist/i18n/experimental-effect-descriptions.js +1 -1
  153. package/dist/i18n/experimental-effects.d.ts +2 -3
  154. package/dist/i18n/experimental-effects.js +1 -1
  155. package/dist/i18n/index.d.ts +87 -1
  156. package/dist/i18n/index.js +1 -1
  157. package/dist/i18n/materials.d.ts +2 -4
  158. package/dist/i18n/materials.js +1 -1
  159. package/dist/i18n/micro-resources.d.ts +2 -4
  160. package/dist/i18n/micro-resources.js +1 -1
  161. package/dist/i18n/module-families.d.ts +3 -5
  162. package/dist/i18n/module-families.js +1 -1
  163. package/dist/i18n/modules.d.ts +3 -6
  164. package/dist/i18n/modules.js +1 -1
  165. package/dist/i18n/personal-modifications.d.ts +66 -0
  166. package/dist/i18n/personal-modifications.js +1 -0
  167. package/dist/i18n/personal-modifications.js.map +1 -0
  168. package/dist/i18n/personal-tools.d.ts +33 -0
  169. package/dist/i18n/personal-tools.js +1 -0
  170. package/dist/i18n/personal-tools.js.map +1 -0
  171. package/dist/i18n/personal-weapons.d.ts +32 -0
  172. package/dist/i18n/personal-weapons.js +1 -0
  173. package/dist/i18n/personal-weapons.js.map +1 -0
  174. package/dist/i18n/pre-engineered.d.ts +1 -1
  175. package/dist/i18n/slots.d.ts +2 -2
  176. package/dist/i18n/suits.d.ts +89 -0
  177. package/dist/i18n/suits.js +1 -0
  178. package/dist/i18n/suits.js.map +1 -0
  179. package/dist/materials/index.d.ts +4 -3
  180. package/dist/materials/index.js +1 -1
  181. package/dist/materials/materials-all.d.ts +2 -2
  182. package/dist/materials/materials-all.js +1 -1
  183. package/dist/materials/materials-raw.d.ts +3 -4
  184. package/dist/materials/materials-raw.js +1 -1
  185. package/dist/materials/materials.d.ts +18 -15
  186. package/dist/materials/materials.js +1 -1
  187. package/dist/materials/micro-resources-all.d.ts +2 -2
  188. package/dist/materials/micro-resources-all.js +1 -1
  189. package/dist/materials/micro-resources-component.d.ts +2 -2
  190. package/dist/materials/micro-resources-consumable.d.ts +2 -2
  191. package/dist/materials/micro-resources-data.d.ts +2 -2
  192. package/dist/materials/micro-resources-item.d.ts +2 -2
  193. package/dist/materials/micro-resources.d.ts +17 -14
  194. package/dist/materials/micro-resources.js +1 -1
  195. package/dist/ships/ammunition.d.ts +4 -4
  196. package/dist/ships/blueprint-costs.d.ts +13 -13
  197. package/dist/ships/blueprint-costs.js +1 -1
  198. package/dist/ships/blueprint-journal.d.ts +3 -3
  199. package/dist/ships/blueprint-journal.js +1 -1
  200. package/dist/ships/blueprints.d.ts +3 -3
  201. package/dist/ships/build-metrics.d.ts +2 -1
  202. package/dist/ships/build-metrics.js +1 -1
  203. package/dist/ships/default-loadouts.d.ts +2 -3
  204. package/dist/ships/default-loadouts.js +1 -1
  205. package/dist/ships/engineering-options.d.ts +29 -32
  206. package/dist/ships/engineering-options.js +1 -1
  207. package/dist/ships/engineering.d.ts +1 -2
  208. package/dist/ships/engineering.js +1 -1
  209. package/dist/ships/experimental-effect-costs.d.ts +1 -1
  210. package/dist/ships/gunsights.d.ts +3 -3
  211. package/dist/ships/heat.d.ts +1 -1
  212. package/dist/ships/index.d.ts +4 -5
  213. package/dist/ships/index.js +1 -1
  214. package/dist/ships/loadout-validation.d.ts +8 -3
  215. package/dist/ships/loadout-validation.js +1 -1
  216. package/dist/ships/module-families.d.ts +1 -1
  217. package/dist/ships/modules-all.d.ts +2 -3
  218. package/dist/ships/modules-all.js +1 -1
  219. package/dist/ships/modules-core.d.ts +3 -3
  220. package/dist/ships/modules-hardpoint.d.ts +4 -5
  221. package/dist/ships/modules-hardpoint.js +1 -1
  222. package/dist/ships/modules-internal.d.ts +19 -9
  223. package/dist/ships/modules-internal.js +1 -1
  224. package/dist/ships/modules-utility.d.ts +3 -4
  225. package/dist/ships/modules-utility.js +1 -1
  226. package/dist/ships/modules.d.ts +31 -25
  227. package/dist/ships/modules.js +1 -1
  228. package/dist/ships/pre-engineered-stats.d.ts +1 -1
  229. package/dist/ships/pre-engineered-stats.js +1 -1
  230. package/dist/ships/pre-engineered.d.ts +9 -10
  231. package/dist/ships/pre-engineered.js +1 -1
  232. package/dist/ships/ship-loadout.d.ts +13 -7
  233. package/dist/ships/ship-loadout.js +1 -1
  234. package/dist/ships/ships.d.ts +1 -2
  235. package/dist/ships/ships.js +1 -1
  236. package/dist/ships/slots.d.ts +5 -5
  237. package/dist/suits-B37rAORs.d.ts +414 -0
  238. package/dist/{system-address-cyJaeZIS.d.ts → system-address-DmzXRD48.d.ts} +6 -4
  239. package/package.json +25 -1
  240. package/dist/chunk-4U7KYQGK.js +0 -1
  241. package/dist/chunk-4U7KYQGK.js.map +0 -1
  242. package/dist/chunk-6GJHUWMO.js +0 -1
  243. package/dist/chunk-6GJHUWMO.js.map +0 -1
  244. package/dist/chunk-77TT4K53.js +0 -1
  245. package/dist/chunk-B7EYTZRK.js +0 -1
  246. package/dist/chunk-B7EYTZRK.js.map +0 -1
  247. package/dist/chunk-C5HG4GJI.js +0 -1
  248. package/dist/chunk-C5HG4GJI.js.map +0 -1
  249. package/dist/chunk-F7VWRDSL.js.map +0 -1
  250. package/dist/chunk-KLC5XT6F.js +0 -1
  251. package/dist/chunk-KLC5XT6F.js.map +0 -1
  252. package/dist/chunk-MGRDB2BZ.js +0 -1
  253. package/dist/chunk-QJECDMQQ.js +0 -1
  254. package/dist/chunk-TSEDU73T.js +0 -1
  255. package/dist/chunk-TSEDU73T.js.map +0 -1
  256. package/dist/chunk-XRGECU7S.js +0 -1
  257. package/dist/chunk-XRGECU7S.js.map +0 -1
  258. /package/dist/{chunk-XSLPWM5N.js.map → chunk-2J6NNI3Y.js.map} +0 -0
  259. /package/dist/{chunk-DWRNXUAX.js.map → chunk-2KIZN3BY.js.map} +0 -0
  260. /package/dist/{chunk-J7BM5NGK.js.map → chunk-2TY42PTF.js.map} +0 -0
  261. /package/dist/{chunk-KBCA4GEZ.js.map → chunk-FP2TQJZP.js.map} +0 -0
  262. /package/dist/{chunk-ETWMPMZP.js.map → chunk-K5JK3XQB.js.map} +0 -0
  263. /package/dist/{chunk-A6OINYNP.js.map → chunk-R2AEZYX7.js.map} +0 -0
  264. /package/dist/{chunk-77TT4K53.js.map → chunk-SFEQXUIA.js.map} +0 -0
  265. /package/dist/{chunk-7TVFV3VO.js.map → chunk-U3IRMXMR.js.map} +0 -0
  266. /package/dist/{chunk-7ATBEOVC.js.map → chunk-WG4DPXJI.js.map} +0 -0
@@ -99,7 +99,7 @@ declare function getPreEngineeredJournalModifiers(variant: PreEngineeredVariant)
99
99
  * The module symbol and blueprint therefore identify the purchase at grade 1 and after
100
100
  * upgrading it through grades 2–5. The fitted grade and experimental effect remain the
101
101
  * loadout's current engineering state; the returned variant carries the original purchase
102
- * grade, Merc Coin price and on the ten rows sold with one the effect the shop bakes
102
+ * grade, Merc Coin price and, on the rows sold with one, the effect the shop bakes
103
103
  * in. So a capture that states a different effect, or none, still identifies the article
104
104
  * it was bought as: read the capture for what is fitted now, the variant for what was
105
105
  * bought.
@@ -1 +1 @@
1
- export{getPreEngineeredJournalModifiers,getPreEngineeredModifiers,getPreEngineeredStats,identifyPreEngineeredVariant,unresolvedModifiers}from"../chunk-4U7KYQGK.js"; //# sourceMappingURL=pre-engineered-stats.js.map
1
+ export{getPreEngineeredJournalModifiers,getPreEngineeredModifiers,getPreEngineeredStats,identifyPreEngineeredVariant,unresolvedModifiers}from"../chunk-C3YZ5KTA.js"; //# sourceMappingURL=pre-engineered-stats.js.map
@@ -18,16 +18,16 @@
18
18
  * grade already applied. Most blueprint ids join to `BLUEPRINTS`; the festive
19
19
  * `Decorative_*` ids instead identify fixed grade-5 reward articles with no craftable
20
20
  * recipe or material cost.
21
- * The 22 Mercenary entries are bought at grade 1 and their bespoke recipes start at
21
+ * Mercenary entries are bought at grade 1 and their bespoke recipes start at
22
22
  * grade 2 — price the remaining upgrade with `getBlueprintCost(blueprint, target,
23
23
  * grade)` from `ships/blueprint-costs`, which answers with the materials and the Merc
24
24
  * Coin the climb costs.
25
25
  * Community-goal and tech-broker entries instead identify fixed reward articles; their
26
26
  * blueprint ids do not grant a recipe to the stock module.
27
27
  *
28
- * Note that one base module can appear more than once: the medium Seeker Missile Rack is
29
- * sold or awarded in six different pre-engineered flavours, so
30
- * `Hpt_BasicMissileRack_Fixed_Medium` has six entries. Look variants up with
28
+ * One base module can appear more than once: the medium Seeker Missile Rack is sold or
29
+ * awarded in several pre-engineered flavours, so `Hpt_BasicMissileRack_Fixed_Medium` has
30
+ * one entry per flavour. Look variants up with
31
31
  * {@link getPreEngineeredVariants} (plural) rather than assuming one.
32
32
  *
33
33
  * Most variants carry a `modifiers` block — the hand-set stat
@@ -35,19 +35,19 @@
35
35
  * computed. Resolve them against the base module with `getPreEngineeredStats` from
36
36
  * `./pre-engineered-stats.js`; it lives in its own module so that consumers who only
37
37
  * want the catalogue do not bundle the module and engineering tables.
38
- * Final articles carry {@link PreEngineeredVariant.engineeringLocked}. These are the seven
38
+ * Final articles carry {@link PreEngineeredVariant.engineeringLocked}. These are the
39
39
  * pre-engineered Guardian weapons, whose stock counterparts can take Anti-Guardian Zone
40
- * Resistance, and five fixed Enzyme/AX rewards whose stock modules have no engineering menu.
40
+ * Resistance, and the fixed Enzyme/AX rewards whose stock modules have no engineering menu.
41
41
  *
42
42
  * @packageDocumentation
43
43
  */
44
44
  /**
45
45
  * Where a pre-engineered variant is obtained.
46
46
  *
47
- * - `mercenary` — bought from the Merc-Coin shop; always arrives at grade 1, ten of them
47
+ * - `mercenary` — bought from the Merc-Coin shop; always arrives at grade 1, some of them
48
48
  * with an experimental effect already applied beside that grade-1 blueprint.
49
- * - `communityGoal` — awarded for taking part in a community goal; mostly grade 5, 8 of
50
- * the 30 carrying an experimental effect.
49
+ * - `communityGoal` — awarded for taking part in a community goal; mostly grade 5, a
50
+ * minority carrying an experimental effect.
51
51
  * - `techBroker` — unlocked at a tech broker. Records the route stated by the source.
52
52
  * - `eventReward` — awarded already transformed by an event; the festive articles are grade 5.
53
53
  */
@@ -150,7 +150,6 @@ interface PreEngineeredVariant {
150
150
  * ```ts
151
151
  * import { PRE_ENGINEERED_MODULES } from '@elite-dangerous-almanac/core/ships/pre-engineered';
152
152
  *
153
- * PRE_ENGINEERED_MODULES.length; // -> 76
154
153
  * PRE_ENGINEERED_MODULES[0];
155
154
  * // -> { symbol: 'Hpt_Mining_AbrBlstr_Fixed_Small', name: 'Abrasion Blaster',
156
155
  * // blueprintSymbol: 'AbrasionBlaster_FarReaching', grade: 1,
@@ -1 +1 @@
1
- export{PRE_ENGINEERED_MODULES,getPreEngineeredVariants,isPreEngineered}from"../chunk-BJU27V6C.js"; //# sourceMappingURL=pre-engineered.js.map
1
+ export{PRE_ENGINEERED_MODULES,getPreEngineeredVariants,isPreEngineered}from"../chunk-AUBV6S7V.js"; //# sourceMappingURL=pre-engineered.js.map
@@ -314,8 +314,8 @@ type LoadoutEditErrorCode = 'immutableSlot' | 'requiredSlot' | 'incompatibleModu
314
314
  * An editor request that the current hull or build constraints cannot accept.
315
315
  *
316
316
  * @remarks
317
- * This remains a `TypeError`, so existing `instanceof TypeError` handling continues to
318
- * work. Localized editors should switch on {@link code}, then use {@link constraint}
317
+ * It is a `TypeError`, so `instanceof TypeError` handling catches it. Localized editors
318
+ * should switch on {@link code}, then use {@link constraint}
319
319
  * and {@link params} instead of parsing the English fallback in `message`.
320
320
  *
321
321
  * @example
@@ -990,12 +990,18 @@ declare class ShipLoadout {
990
990
  * omitted.
991
991
  *
992
992
  * @remarks
993
- * This is the outfitting *offer*, so the fifteen {@link ships!OutfittingModule.grantOnly | grantOnly}
993
+ * This is the outfitting *offer*, so the {@link ships!OutfittingModule.grantOnly | grantOnly}
994
994
  * articles are never in it: each is a second identity for a module the game already
995
995
  * sells — `Int_Engine_Size2_Class1_free` is the 2E Thrusters — and listing both puts
996
996
  * the same article on the screen twice, once with no price. A build that already
997
997
  * carries one keeps it; only the choices are filtered.
998
998
  *
999
+ * The Cargo Hatch is absent for the same reason it cannot be removed: it is part of
1000
+ * the hull. The source registry files it under the `internal` category — which is
1001
+ * why {@link ships/modules-internal!INTERNAL_MODULES | INTERNAL_MODULES} carries it
1002
+ * — but the hull is built with one and the fixed `CargoHatch` mount is the only
1003
+ * place it goes, so no mount this method describes accepts it.
1004
+ *
999
1005
  * @param slotKey - The slot key to fit, matched case-insensitively (journal spelling).
1000
1006
  * @returns The fitting modules, in complete-catalogue order.
1001
1007
  * @throws {RangeError} If the hull has no slot with that key.
@@ -1156,7 +1162,7 @@ declare class ShipLoadout {
1156
1162
  * leave the build unchanged and return stable structured data.
1157
1163
  *
1158
1164
  * A Mercenary article is recomputed rather than composed, and that limits what can be
1159
- * done to the effect ten of those rows are sold carrying. At its purchase grade there
1165
+ * done to the effect some of those rows are sold carrying. At its purchase grade there
1160
1166
  * is no recipe to recompute from — the bespoke recipe starts at grade 2 — so every
1161
1167
  * edit is refused with `unsupportedEngineering`. Once engineered to grade 2 or above
1162
1168
  * an edit recomputes normally, but only to an effect the module's own menu offers:
@@ -1292,9 +1298,9 @@ declare class ShipLoadout {
1292
1298
  * Set a fitted module's power-priority group.
1293
1299
  *
1294
1300
  * @param slotKey - The slot's journal key, matched case-insensitively.
1295
- * @param priority - The journal's **zero-based** group, `0`–`4`. Note that the
1296
- * outfitting panel and {@link ships!BuildMetrics.powerBudget | BuildMetrics.powerBudget}'s `bands[].priority` — number the same
1297
- * five groups `1`–`5`.
1301
+ * @param priority - The journal's **zero-based** group, `0`–`4`. The outfitting
1302
+ * panel, and {@link ships!BuildMetrics.powerBudget | BuildMetrics.powerBudget}'s
1303
+ * `bands[].priority`, number the same five groups `1`–`5`.
1298
1304
  * @returns `this`, for chaining.
1299
1305
  * @throws {RangeError} If the slot is empty, or `priority` is not an integer in `[0, 4]`.
1300
1306
  * @throws {TypeError} If `slotKey` is not a string.
@@ -1 +1 @@
1
- export{LoadoutEditError,ShipLoadout}from"../chunk-TSEDU73T.js"; //# sourceMappingURL=ship-loadout.js.map
1
+ export{LoadoutEditError,ShipLoadout}from"../chunk-HIJR7DOC.js"; //# sourceMappingURL=ship-loadout.js.map
@@ -5,7 +5,7 @@ import { CoreSlots, HardpointSlotSpec, OptionalSlotSpec, ShipSlots } from './slo
5
5
  * stats, and its slot layout in one record**, with the lookups an app needs to turn
6
6
  * an internal symbol or a display name into a {@link Ship}.
7
7
  *
8
- * There is only one list of ships and it is tiny (48 records), so the lookups here
8
+ * There is only one list of ships and it is small, so the lookups here
9
9
  * take no catalogue argument at all — they always search {@link SHIPS}. Importing one
10
10
  * bundles the whole ship list, which is what you wanted anyway. Stock module identities
11
11
  * live in `./default-loadouts`, keeping this small hull catalogue independent of them.
@@ -143,7 +143,6 @@ interface Ship {
143
143
  * ```ts
144
144
  * import { SHIPS } from '@elite-dangerous-almanac/core/ships/ships';
145
145
  *
146
- * SHIPS.length; // -> 48
147
146
  * SHIPS.find((s) => s.symbol === 'Anaconda')?.name; // -> 'Anaconda'
148
147
  * ```
149
148
  */
@@ -1 +1 @@
1
- export{SHIPS,getShipByName,getShipBySymbol,getShipSlots}from"../chunk-6UNAD74Z.js"; //# sourceMappingURL=ships.js.map
1
+ export{SHIPS,getShipByName,getShipBySymbol,getShipSlots}from"../chunk-C4FUV6GF.js"; //# sourceMappingURL=ships.js.map
@@ -5,7 +5,7 @@
5
5
  * A hull offers a fixed set of mounts: seven core internals, a handful of weapon
6
6
  * hardpoints, some tiny utility mounts, and a column of optional internals. Some of
7
7
  * those mounts are **restricted** to one family of modules — military and
8
- * planetary-approach optionals on most hulls, and, on three hulls, cargo-only,
8
+ * planetary-approach optionals on most hulls, and, on a few hulls, cargo-only,
9
9
  * limpet-controller-only, vessel-hangar-only and passenger-cabin-only optionals and
10
10
  * mining-only hardpoints (see {@link SlotRestriction}). This module gives
11
11
  * each mount a stable **slot key** and a {@link BuildSlot} descriptor, and
@@ -15,7 +15,7 @@
15
15
  *
16
16
  * It holds no data; {@link enumerateSlots} takes a {@link ShipSlots} layout (from a
17
17
  * hull's `Ship` record via `getShipSlots` in `./ships`) and expands it into keyed
18
- * {@link BuildSlot}s. Most hulls number their mounts by rule; on ten the game does
18
+ * {@link BuildSlot}s. Most hulls number their mounts by rule; on some the game does
19
19
  * not, and a mount there carries its own `name` — see {@link enumerateSlots}.
20
20
  *
21
21
  * @packageDocumentation
@@ -149,7 +149,7 @@ interface BuildSlotBase {
149
149
  * `core` function name is a *different* string (`thrusters` vs the key
150
150
  * `MainEngines`); see {@link CoreSlotType}.
151
151
  *
152
- * **Do not compute one.** The numbering looks regular and on ten hulls is
152
+ * **Do not compute one.** The numbering looks regular and on some hulls is
153
153
  * not: the Anaconda's smallest optionals are `Slot13_Size2` and `Slot14_Size1`
154
154
  * with no slots 11 or 12, the Type-9 Heavy starts at `Slot00_Size8`, the Type-7
155
155
  * Transporter uses the number `09` twice, and the Keelback's `Slot03_Size3` sits
@@ -341,7 +341,7 @@ interface ParsedSlot {
341
341
  * @returns Every mount the hull offers, as {@link BuildSlot}s.
342
342
  * @remarks
343
343
  * Unrestricted optionals are numbered `Slot01_SizeN`, `Slot02_SizeN`, … with no gaps,
344
- * and hardpoints `1, 2, 3` within each size class. **Ten hulls disagree**, and no
344
+ * and hardpoints `1, 2, 3` within each size class. **Some hulls disagree**, and no
345
345
  * rule derives what they do instead, so a mount on one of them carries its own
346
346
  * {@link OptionalSlotSpec.name} / {@link HardpointSlotSpec.name} and that wins:
347
347
  *
@@ -394,7 +394,7 @@ declare function enumerateSlots(layout: ShipSlots): BuildSlot[];
394
394
  * mount. The returned `core` and `restriction` values keep this library's own
395
395
  * camelCase spelling whatever the input looked like.
396
396
  *
397
- * **A `_SizeN` suffix is what the name says, not what the mount is.** On three hulls
397
+ * **A `_SizeN` suffix is what the name says, not what the mount is.** On some hulls
398
398
  * the game's own key disagrees with the mount it names — the Keelback's
399
399
  * `Slot03_Size3` is a size-4 mount, the Asp Scout's `Slot01_Size4` a size-5 one, and
400
400
  * five of the Type-7 Transporter's ten are off. To size a mount, find it in the hull's
@@ -0,0 +1,414 @@
1
+ import { PersonalModifier } from './equipment/engineering.js';
2
+
3
+ /**
4
+ * Odyssey handheld weapons: their journal identifiers, combat stats, sight
5
+ * magnification, reload time, grade-dependent damage, and the damage per second those
6
+ * stats resolve to.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+
11
+ /** A weapon manufacturer's shared Pioneer grade-upgrade recipe. */
12
+ type WeaponUpgradeGroup = 'karma' | 'takada' | 'manticore';
13
+ /** Technology suffix used to disambiguate personal-weapon modification recipes. */
14
+ type PersonalWeaponEngineeringType = 'kinetic' | 'laser' | 'plasma';
15
+ /** A handheld weapon's form factor. */
16
+ type PersonalWeaponClass = 'pistol' | 'carbine' | 'rifle' | 'shotgun' | 'sniper' | 'launcher';
17
+ /** Which suit weapon slot accepts the weapon. */
18
+ type PersonalWeaponSlot = 'primary' | 'secondary';
19
+ /** The damage family relevant to resistances and some modification recipes. */
20
+ type PersonalDamageType = 'kinetic' | 'thermal' | 'plasma' | 'explosive';
21
+ /** A handheld weapon firing cycle. */
22
+ type PersonalFireMode = 'automatic' | 'semi-automatic' | 'burst';
23
+ /** A weapon's aim-down-sights magnification, before and after the Scope modification. */
24
+ interface ScopeMagnification {
25
+ /** Magnification of the sight the weapon ships with, e.g. `1.12` for 1.12x. */
26
+ readonly default: number;
27
+ /** Magnification of the sight the Scope modification fits, e.g. `1.41` for 1.41x. */
28
+ readonly upgraded: number;
29
+ }
30
+ /** A weapon's magazine reload time, before and after the Reload Speed modification. */
31
+ interface ReloadTime {
32
+ /** Seconds to reload the weapon as it ships, e.g. `2.7` for 2.7 s. */
33
+ readonly default: number;
34
+ /** Seconds to reload with the Reload Speed modification fitted, e.g. `2.16` for 2.16 s. */
35
+ readonly upgraded: number;
36
+ }
37
+ /** Grade-dependent stats for one handheld weapon. */
38
+ interface PersonalWeaponGrade {
39
+ /** Damage per projectile or pellet. */
40
+ readonly damage: number;
41
+ /** Permanent engineering-modification slots available, from `0` through `4`. */
42
+ readonly modificationSlots: number;
43
+ }
44
+ /** One handheld weapon sold by Pioneer Supplies. */
45
+ interface PersonalWeapon {
46
+ /** Frontier item id reported by journal loadout events. */
47
+ readonly symbol: string;
48
+ /** English display name. */
49
+ readonly name: string;
50
+ /** Manufacturer recipe family used for grade upgrades. */
51
+ readonly upgradeGroup: WeaponUpgradeGroup;
52
+ /** Recipe suffix used when the journal omits a modification's weapon technology. */
53
+ readonly engineeringType: PersonalWeaponEngineeringType;
54
+ /** Weapon form factor. */
55
+ readonly class: PersonalWeaponClass;
56
+ /** Suit slot this weapon occupies. */
57
+ readonly slot: PersonalWeaponSlot;
58
+ /** Base damage family. */
59
+ readonly damageType: PersonalDamageType;
60
+ /** Firing cycle. */
61
+ readonly fireMode: PersonalFireMode;
62
+ /** Trigger pulls per second, so bursts per second on a burst weapon. */
63
+ readonly rateOfFire: number;
64
+ /**
65
+ * Projectiles one round fires, each doing the full
66
+ * {@link PersonalWeaponGrade.damage}. Absent on every weapon that fires a single
67
+ * projectile — only the Manticore Intimidator, a shotgun, carries it.
68
+ */
69
+ readonly projectiles?: number;
70
+ /**
71
+ * Rounds one trigger pull fires, spent from the magazine. Present only when
72
+ * {@link PersonalWeapon.fireMode} is `"burst"`, together with
73
+ * {@link PersonalWeapon.burstRateOfFire}.
74
+ */
75
+ readonly burstRounds?: number;
76
+ /** Rounds per second within one burst. Absent whenever `burstRounds` is. */
77
+ readonly burstRateOfFire?: number;
78
+ /**
79
+ * Rounds loaded in one magazine. A burst weapon spends
80
+ * {@link PersonalWeapon.burstRounds} of them per trigger pull.
81
+ */
82
+ readonly magazineSize: number;
83
+ /** Spare rounds carried before suit-capacity changes. */
84
+ readonly reserveAmmo: number;
85
+ /** Headshot damage multiplier (`2` means 200%). */
86
+ readonly headshotMultiplier: number;
87
+ /** Nominal effective range in metres. */
88
+ readonly effectiveRange: number;
89
+ /**
90
+ * Aim-down-sights magnification with the stock sight and with the one the Scope
91
+ * modification fits. Scope carries no modifier of its own: this pair is its whole
92
+ * numeric effect, and it differs per weapon.
93
+ */
94
+ readonly scopeMagnification: ScopeMagnification;
95
+ /**
96
+ * Seconds to reload the magazine with the stock weapon and with the Reload Speed
97
+ * modification fitted. Reload Speed carries no modifier of its own: this pair is its
98
+ * whole numeric effect, and it differs per weapon.
99
+ */
100
+ readonly reloadTime: ReloadTime;
101
+ /**
102
+ * Grade records keyed by `"1"` through `"5"` — every weapon carries all five,
103
+ * unlike {@link Suit.grades}. Read one through
104
+ * {@link getPersonalWeaponGrade} to get the same nullable answer suits give.
105
+ */
106
+ readonly grades: Readonly<Record<`${EquipmentGrade}`, PersonalWeaponGrade>>;
107
+ }
108
+ /**
109
+ * Every handheld weapon, in catalogue order.
110
+ *
111
+ * @example
112
+ * ```ts
113
+ * import { PERSONAL_WEAPONS } from '@elite-dangerous-almanac/core/equipment/weapons';
114
+ * PERSONAL_WEAPONS[0]?.symbol; // -> 'wpn_s_pistol_kinetic_sauto'
115
+ * ```
116
+ */
117
+ declare const PERSONAL_WEAPONS: readonly PersonalWeapon[];
118
+ /**
119
+ * Look up a handheld weapon by its Frontier journal symbol, case-insensitively.
120
+ *
121
+ * @param symbol - Journal item id such as `"wpn_m_assaultrifle_kinetic_fauto"`,
122
+ * matched case-insensitively after trimming surrounding whitespace.
123
+ * @returns The frozen weapon record, or `null` when unknown.
124
+ * @throws {TypeError} If `symbol` is present and not a string. A nullish symbol is a
125
+ * miss, answered like an unrecognised one.
126
+ * @example
127
+ * ```ts
128
+ * import { getPersonalWeaponBySymbol } from '@elite-dangerous-almanac/core/equipment/weapons';
129
+ * getPersonalWeaponBySymbol('wpn_m_assaultrifle_kinetic_fauto')?.name; // -> 'Karma AR-50'
130
+ * ```
131
+ */
132
+ declare function getPersonalWeaponBySymbol(symbol: string): PersonalWeapon | null;
133
+ /**
134
+ * Look up a handheld weapon by display name, case-insensitively.
135
+ *
136
+ * @param name - English display name such as `"Karma AR-50"`; surrounding
137
+ * whitespace is ignored.
138
+ * @returns The frozen weapon record, or `null` when unknown.
139
+ * @throws {TypeError} If `name` is present and not a string. A nullish name is a miss,
140
+ * answered like an unrecognised one.
141
+ * @example
142
+ * ```ts
143
+ * import { getPersonalWeaponByName } from '@elite-dangerous-almanac/core/equipment/weapons';
144
+ * getPersonalWeaponByName('Karma AR-50')?.symbol; // -> 'wpn_m_assaultrifle_kinetic_fauto'
145
+ * ```
146
+ */
147
+ declare function getPersonalWeaponByName(name: string): PersonalWeapon | null;
148
+ /**
149
+ * Read one handheld weapon's stats at a grade.
150
+ *
151
+ * @param weapon - A catalogue weapon record.
152
+ * @param grade - Integer grade `1`–`5`.
153
+ * @returns The frozen grade record, or `null` when the record carries no such grade.
154
+ * Every catalogued weapon carries all five, so the `null` is the same promise
155
+ * {@link getSuitGrade} makes rather than an outcome the shipped catalogue produces —
156
+ * write the two the same way and neither can surprise you.
157
+ * @throws {RangeError} If `grade` is not an integer from 1 through 5.
158
+ * @example
159
+ * ```ts
160
+ * import { PERSONAL_WEAPONS, getPersonalWeaponGrade } from '@elite-dangerous-almanac/core/equipment/weapons';
161
+ * getPersonalWeaponGrade(PERSONAL_WEAPONS[0]!, 5)?.modificationSlots; // -> 4
162
+ * ```
163
+ */
164
+ declare function getPersonalWeaponGrade(weapon: PersonalWeapon, grade: number): PersonalWeaponGrade | null;
165
+ /**
166
+ * What one handheld weapon does per second at a grade, sustained and unsustained.
167
+ *
168
+ * @remarks
169
+ * Frozen, so a result can be held and shared without a defensive copy.
170
+ */
171
+ interface PersonalWeaponMetrics {
172
+ /** Damage of one trigger pull — every projectile of every round in it. */
173
+ readonly damagePerShot: number;
174
+ /** {@link PersonalWeaponMetrics.damagePerShot} with every projectile hitting the head. */
175
+ readonly headshotDamagePerShot: number;
176
+ /** Trigger pulls per second. */
177
+ readonly rateOfFire: number;
178
+ /** Trigger pulls per second averaged over reloads. */
179
+ readonly sustainedRateOfFire: number;
180
+ /** Damage per second while firing, reloads ignored. */
181
+ readonly damagePerSecond: number;
182
+ /** Damage per second averaged over reloads — the figure a long fight sees. */
183
+ readonly sustainedDamagePerSecond: number;
184
+ }
185
+ /**
186
+ * Everything the on-foot damage arithmetic gives you for one weapon: damage per trigger
187
+ * pull, per second, and per second once reloads are counted.
188
+ *
189
+ * A grade record states damage **per projectile**, so a shot is that damage times the
190
+ * projectiles a round carries times the rounds one trigger pull fires. The sustained
191
+ * figures then average in the reload: a magazine's worth of fire takes the shots after
192
+ * the first, plus the tail of the last burst, plus the reload.
193
+ *
194
+ * ```text
195
+ * damagePerShot = damage × projectiles × burstRounds
196
+ * DPS = damagePerShot × rateOfFire
197
+ * SDPS = damagePerShot × (magazine's shots / one magazine-and-reload cycle)
198
+ * ```
199
+ *
200
+ * @param weapon - A catalogue weapon record.
201
+ * @param grade - Integer grade `1`–`5`.
202
+ * @param modifiers - Fitted modification modifiers, folded per stat the way
203
+ * {@link applyPersonalModifiers} does. `magazineSize` and `headshotMultiplier` are the
204
+ * two this arithmetic reads; modifiers naming other stats are ignored. A Reload Speed
205
+ * modification carries no modifier at all, so it arrives through `options` instead. A
206
+ * fractional magazine is held to whole rounds, rounding **up**, as `ships/weapons` does.
207
+ * @param options - `reloadSpeed` takes the reload from
208
+ * {@link PersonalWeapon.reloadTime | reloadTime.upgraded} rather than `.default`,
209
+ * because Reload Speed carries its magnitude as that pair rather than as a modifier.
210
+ * @returns The frozen {@link PersonalWeaponMetrics}, or `null` when the record carries
211
+ * no such grade — the same nullable answer {@link getPersonalWeaponGrade} gives. A
212
+ * magazine that modifiers empty to zero rounds or fewer reports no sustained fire.
213
+ * @throws {RangeError} If `grade` is not an integer from 1 through 5.
214
+ * @example
215
+ * ```ts
216
+ * import {
217
+ * getPersonalWeaponByName,
218
+ * personalWeaponMetrics,
219
+ * } from '@elite-dangerous-almanac/core/equipment/weapons';
220
+ *
221
+ * const shotgun = getPersonalWeaponByName('Manticore Intimidator')!;
222
+ * personalWeaponMetrics(shotgun, 5)?.damagePerShot; // -> 52.15 (ten pellets of 5.215)
223
+ * personalWeaponMetrics(shotgun, 5)?.damagePerSecond; // -> 65.19
224
+ * personalWeaponMetrics(shotgun, 5)?.sustainedDamagePerSecond; // -> 31.6 (with the 2.5 s reload)
225
+ * ```
226
+ */
227
+ declare function personalWeaponMetrics(weapon: PersonalWeapon, grade: number, modifiers?: readonly PersonalModifier[], options?: {
228
+ readonly reloadSpeed?: boolean;
229
+ }): PersonalWeaponMetrics | null;
230
+
231
+ /**
232
+ * Odyssey personal suits: their journal identifiers, the suit-wide component stats every
233
+ * grade shares, and the grade-dependent defensive stats.
234
+ *
235
+ * @packageDocumentation
236
+ */
237
+
238
+ /** A Pioneer Supplies equipment grade, from the stock grade 1 through grade 5. */
239
+ type EquipmentGrade = 1 | 2 | 3 | 4 | 5;
240
+ /**
241
+ * Frontier's own `SlotName` for a suit weapon mount, exactly as the journal spells it.
242
+ *
243
+ * @remarks
244
+ * The `SuitLoadout`, `CreateSuitLoadout`, `SwitchSuitLoadout`, `LoadoutEquipModule` and
245
+ * `LoadoutRemoveModule` events all write one of these three strings. The secondary mount
246
+ * carries no number, because the game gives it none. Compare a key with `===`; it is
247
+ * case-sensitive, like every other journal key.
248
+ */
249
+ type PersonalMountKey = 'PrimaryWeapon1' | 'PrimaryWeapon2' | 'SecondaryWeapon';
250
+ /**
251
+ * One weapon mount on a suit.
252
+ *
253
+ * @remarks
254
+ * {@link PersonalMount.key} is Frontier's journal `SlotName`, so a `SuitLoadout`
255
+ * module joins straight onto a mount without a positional index.
256
+ * @example
257
+ * ```ts
258
+ * import { getSuitByFamily } from '@elite-dangerous-almanac/core/equipment/suits';
259
+ *
260
+ * const suit = getSuitByFamily('tacticalsuit')!;
261
+ * suit.mounts.map((mount) => mount.key);
262
+ * // -> ['PrimaryWeapon1', 'PrimaryWeapon2', 'SecondaryWeapon']
263
+ * suit.mounts.filter((mount) => mount.kind === 'primary').map((mount) => mount.key);
264
+ * // -> ['PrimaryWeapon1', 'PrimaryWeapon2']
265
+ * ```
266
+ */
267
+ interface PersonalMount {
268
+ /** Frontier journal `SlotName`, e.g. `"PrimaryWeapon1"`. */
269
+ readonly key: PersonalMountKey;
270
+ /** Which weapons the mount takes; a weapon whose `slot` equals it fits here. */
271
+ readonly kind: PersonalWeaponSlot;
272
+ }
273
+ /** The stats of one suit at one equipment grade. */
274
+ interface SuitGrade {
275
+ /** Frontier item symbol for this exact suit and grade. */
276
+ readonly symbol: string;
277
+ /** Permanent engineering-modification slots available, from `0` through `4`. */
278
+ readonly modificationSlots: number;
279
+ /** Base shield strength in shield points. */
280
+ readonly shieldStrength: number;
281
+ /** Shield points regenerated per second. */
282
+ readonly shieldRegeneration: number;
283
+ /** Kinetic damage resistance as a fraction; negative values increase damage. */
284
+ readonly kineticResistance: number;
285
+ /** Thermal damage resistance as a fraction. */
286
+ readonly thermalResistance: number;
287
+ /** Plasma damage resistance as a fraction; negative values increase damage. */
288
+ readonly plasmaResistance: number;
289
+ /** Explosive damage resistance as a fraction. */
290
+ readonly explosiveResistance: number;
291
+ }
292
+ /** One personal suit model sold by Pioneer Supplies. */
293
+ interface Suit {
294
+ /** Suit family without a grade suffix, e.g. `"utilitysuit"`. */
295
+ readonly family: string;
296
+ /** English display name, e.g. `"Maverick Suit"`. */
297
+ readonly name: string;
298
+ /**
299
+ * Every weapon mount the suit carries, in the order the game lists them: the
300
+ * primary mounts by their number, then the secondary mount.
301
+ *
302
+ * @remarks
303
+ * Count a kind by filtering:
304
+ * `suit.mounts.filter((mount) => mount.kind === 'primary').length`.
305
+ */
306
+ readonly mounts: readonly PersonalMount[];
307
+ /** Suit health in health points, the pool the shield protects. */
308
+ readonly health: number;
309
+ /** Suit mass in kilograms. */
310
+ readonly mass: number;
311
+ /** Battery capacity in energy units, the pool the suit's tools draw from. */
312
+ readonly batteryCapacity: number;
313
+ /** Emergency air, in seconds of life support. */
314
+ readonly oxygenTime: number;
315
+ /** Jump-assist boost acceleration, the bare figure the panel shows, which has no unit. */
316
+ readonly boostAcceleration: number;
317
+ /** Backpack goods capacity in items. */
318
+ readonly goodsCapacity: number;
319
+ /** Backpack assets capacity in components. */
320
+ readonly assetsCapacity: number;
321
+ /** Backpack data capacity in items. */
322
+ readonly dataCapacity: number;
323
+ /** How far footsteps carry, as a multiplier of the base audible range. */
324
+ readonly footstepAudibleRange: number;
325
+ /** Line-of-sight analysis range in metres. */
326
+ readonly losAnalysisRange: number;
327
+ /** Seconds of line of sight the suit needs to complete an analysis. */
328
+ readonly losAnalysisTime: number;
329
+ /**
330
+ * Available grade records, keyed by `"1"` through `"5"`.
331
+ *
332
+ * @remarks
333
+ * A grade changes exactly what {@link SuitGrade} carries — the four resistances,
334
+ * shield strength, shield regeneration, the modification slots and the item symbol.
335
+ * Every stat above is a property of the suit family and is the same at all five.
336
+ */
337
+ readonly grades: Readonly<Partial<Record<`${EquipmentGrade}`, SuitGrade>>>;
338
+ }
339
+ /**
340
+ * Every personal suit, including the non-upgradeable Flight Suit.
341
+ *
342
+ * @example
343
+ * ```ts
344
+ * import { SUITS } from '@elite-dangerous-almanac/core/equipment/suits';
345
+ * SUITS.find((suit) => suit.family === 'utilitysuit')?.name; // -> 'Maverick Suit'
346
+ * ```
347
+ */
348
+ declare const SUITS: readonly Suit[];
349
+ /**
350
+ * Look up a suit model by its grade-independent family, case-insensitively.
351
+ *
352
+ * @param family - Family such as `"utilitysuit"`, matched case-insensitively after
353
+ * trimming surrounding whitespace.
354
+ * @returns The frozen suit record, or `null` when unknown.
355
+ * @throws {TypeError} If `family` is present and not a string. A nullish family is a
356
+ * miss, answered like an unrecognised one.
357
+ * @example
358
+ * ```ts
359
+ * import { getSuitByFamily } from '@elite-dangerous-almanac/core/equipment/suits';
360
+ * getSuitByFamily('utilitysuit')?.name; // -> 'Maverick Suit'
361
+ * ```
362
+ */
363
+ declare function getSuitByFamily(family: string): Suit | null;
364
+ /**
365
+ * Look up a suit by its display name, case-insensitively.
366
+ *
367
+ * @param name - Display name such as `"Maverick Suit"`, matched case-insensitively
368
+ * after trimming surrounding whitespace.
369
+ * @returns The frozen suit record, or `null` when unknown.
370
+ * @throws {TypeError} If `name` is present and not a string. A nullish name is a miss,
371
+ * answered like an unrecognised one.
372
+ * @example
373
+ * ```ts
374
+ * import { getSuitByName } from '@elite-dangerous-almanac/core/equipment/suits';
375
+ * getSuitByName('Maverick Suit')?.family; // -> 'utilitysuit'
376
+ * ```
377
+ */
378
+ declare function getSuitByName(name: string): Suit | null;
379
+ /**
380
+ * Resolve the grade-specific Frontier item symbol reported by journal suit events.
381
+ *
382
+ * @param symbol - Item symbol such as `"utilitysuit_class3"`, matched
383
+ * case-insensitively after trimming surrounding whitespace.
384
+ * @returns The owning suit and its numeric grade, or `null` when unknown.
385
+ * @throws {TypeError} If `symbol` is present and not a string. A nullish symbol is a
386
+ * miss, answered like an unrecognised one.
387
+ * @example
388
+ * ```ts
389
+ * import { getSuitBySymbol } from '@elite-dangerous-almanac/core/equipment/suits';
390
+ * getSuitBySymbol('utilitysuit_class3')?.grade; // -> 3
391
+ * ```
392
+ */
393
+ declare function getSuitBySymbol(symbol: string): Readonly<{
394
+ suit: Suit;
395
+ grade: EquipmentGrade;
396
+ }> | null;
397
+ /**
398
+ * Read a suit's stats at one grade.
399
+ *
400
+ * @param suit - A catalogue suit record.
401
+ * @param grade - Integer grade `1`–`5`.
402
+ * @returns The frozen grade record, or `null` when that suit has no such grade.
403
+ * @throws {RangeError} If `grade` is not an integer from 1 through 5.
404
+ * @example
405
+ * ```ts
406
+ * import { getSuitByFamily, getSuitGrade } from '@elite-dangerous-almanac/core/equipment/suits';
407
+ * const suit = getSuitByFamily('utilitysuit');
408
+ * if (!suit) throw new Error('Maverick Suit is missing');
409
+ * getSuitGrade(suit, 5)?.modificationSlots; // -> 4
410
+ * ```
411
+ */
412
+ declare function getSuitGrade(suit: Suit, grade: number): SuitGrade | null;
413
+
414
+ export { type EquipmentGrade as E, PERSONAL_WEAPONS as P, type ReloadTime as R, SUITS as S, type WeaponUpgradeGroup as W, type PersonalDamageType as a, type PersonalFireMode as b, type PersonalMount as c, type PersonalMountKey as d, type PersonalWeapon as e, type PersonalWeaponClass as f, type PersonalWeaponEngineeringType as g, type PersonalWeaponGrade as h, type PersonalWeaponMetrics as i, type PersonalWeaponSlot as j, type ScopeMagnification as k, type Suit as l, type SuitGrade as m, getPersonalWeaponByName as n, getPersonalWeaponBySymbol as o, getPersonalWeaponGrade as p, getSuitByFamily as q, getSuitByName as r, getSuitBySymbol as s, getSuitGrade as t, personalWeaponMetrics as u };
@@ -271,8 +271,9 @@ declare function decodeModSystemAddress(id64: SystemAddressInput): DecodedAddres
271
271
  * `resolveNamingRegionOrigin` in `./naming-region-origins`.
272
272
  * @returns The 64-bit system address.
273
273
  * @throws {RangeError} If the mass code is outside 0–7, a letter is outside 0–25, `n1`
274
- * is not one the boxel packer accepts, the origin has a negative coordinate, the name's boxel code or sector falls outside the
275
- * address layout, or the sequence does not fit its size-class-dependent field.
274
+ * is not one the boxel packer accepts, the origin has a negative coordinate, the name's
275
+ * boxel code or sector falls outside the address layout, or the sequence does not fit
276
+ * its size-class-dependent field.
276
277
  * @example
277
278
  * ```ts
278
279
  * import { resolveNamingRegionOrigin } from '@elite-dangerous-almanac/core/astro/naming-region-origins';
@@ -297,8 +298,9 @@ declare function encodeSystemAddress(parts: SystemNameParts, origin: NamingRegio
297
298
  * @returns The 64-bit modulated system address. These routinely exceed `2^53`, so
298
299
  * keep them as `bigint` (or a decimal string) rather than a JS `number`.
299
300
  * @throws {RangeError} If the mass code is outside 0–7, a letter is outside 0–25, `n1`
300
- * is not one the boxel packer accepts, the origin has a negative coordinate, the name's boxel code or sector falls outside the
301
- * address layout, or the sequence does not fit the 15-bit modulated field.
301
+ * is not one the boxel packer accepts, the origin has a negative coordinate, the name's
302
+ * boxel code or sector falls outside the address layout, or the sequence does not fit
303
+ * the 15-bit modulated field.
302
304
  * @example
303
305
  * ```ts
304
306
  * import { resolveNamingRegionOrigin } from '@elite-dangerous-almanac/core/astro/naming-region-origins';