@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
@@ -1,8 +1,8 @@
1
1
  import { Commodity } from './commodities.js';
2
2
 
3
3
  /**
4
- * The catalogue of **rare** market commodities — the 142 location-specific luxury
5
- * goods, each produced at a single station and worth more the further it is carried.
4
+ * The catalogue of **rare** market commodities — the location-specific luxury goods,
5
+ * each produced at a single station and worth more the further it is carried.
6
6
  *
7
7
  * Every record here is a rare commodity (`rare: true`); the standard market goods
8
8
  * live in `./commodities-standard`. Search it with the query functions in
@@ -14,7 +14,7 @@ import { Commodity } from './commodities.js';
14
14
  */
15
15
 
16
16
  /**
17
- * All 142 rare commodities, in Frontier's registry order.
17
+ * Every rare commodity, in Frontier's registry order.
18
18
  *
19
19
  * @remarks
20
20
  * Every record has `rare: true`. The array and its records are frozen. A rare's
@@ -25,7 +25,6 @@ import { Commodity } from './commodities.js';
25
25
  * ```ts
26
26
  * import { RARE_COMMODITIES } from '@elite-dangerous-almanac/core/commodities/commodities-rare';
27
27
  *
28
- * RARE_COMMODITIES.length; // -> 142
29
28
  * RARE_COMMODITIES.find((c) => c.symbol === 'LavianBrandy')?.name; // -> 'Lavian Brandy'
30
29
  * ```
31
30
  */
@@ -1 +1 @@
1
- export{RARE_COMMODITIES}from"../chunk-GMTAFUAG.js"; //# sourceMappingURL=commodities-rare.js.map
1
+ export{RARE_COMMODITIES}from"../chunk-TYRH73MO.js"; //# sourceMappingURL=commodities-rare.js.map
@@ -1,22 +1,23 @@
1
1
  import { Commodity } from './commodities.js';
2
2
 
3
3
  /**
4
- * The catalogue of **standard** market commodities — the 257 goods traded at
5
- * station commodity markets, across all sixteen market groups.
4
+ * The catalogue of **standard** market commodities — the goods traded at station
5
+ * commodity markets, across every market group.
6
6
  *
7
7
  * Every record here is a standard commodity (`rare: false`); the rare goods live in
8
8
  * `./commodities-rare`. Search it with the query functions in `./commodities`.
9
9
  *
10
- * Data from EDCD FDevIDs (`commodity.csv`), plus one record absent from the pinned
11
- * FDevIDs snapshot whose symbol and name were observed in a player journal and whose
12
- * market category was verified in-game; see
10
+ * Data from EDCD FDevIDs (`commodity.csv`), from a player-journal observation with an
11
+ * in-game category check, and from two readings of the running game's own commodity
12
+ * registry, whose difference is a batch of mineral and chemical goods the FDevIDs
13
+ * snapshot does not carry; see
13
14
  * [`data/commodities/SOURCES.md`](https://github.com/DarkSession/Elite-Dangerous-Almanac/blob/main/data/commodities/SOURCES.md).
14
15
  *
15
16
  * @packageDocumentation
16
17
  */
17
18
 
18
19
  /**
19
- * All 257 standard commodities, in Frontier's registry order.
20
+ * Every standard commodity, in Frontier's registry order.
20
21
  *
21
22
  * @remarks
22
23
  * Every record has `rare: false`. The array and its records are frozen.
@@ -25,7 +26,6 @@ import { Commodity } from './commodities.js';
25
26
  * ```ts
26
27
  * import { COMMODITIES } from '@elite-dangerous-almanac/core/commodities/commodities-standard';
27
28
  *
28
- * COMMODITIES.length; // -> 257
29
29
  * COMMODITIES.find((c) => c.symbol === 'Gold')?.category; // -> 'Metals'
30
30
  * ```
31
31
  */
@@ -1 +1 @@
1
- export{COMMODITIES}from"../chunk-6HMIF2RJ.js"; //# sourceMappingURL=commodities-standard.js.map
1
+ export{COMMODITIES}from"../chunk-Q647OXON.js"; //# sourceMappingURL=commodities-standard.js.map
@@ -2,13 +2,13 @@
2
2
  * Market-commodity types and lookups.
3
3
  *
4
4
  * Elite Dangerous trades goods at station commodity markets. Frontier splits them
5
- * into two registries: the ~257 **standard** commodities on every market, and the
6
- * ~142 **rare** commodities each produced at a single station. This module holds the
5
+ * into two registries: the **standard** commodities on every market, and the
6
+ * **rare** commodities each produced at a single station. This module holds the
7
7
  * {@link Commodity} record shape and the functions that find one
8
8
  * ({@link getCommodityBySymbol}, {@link getCommodityByName},
9
9
  * {@link commoditiesInCategory}).
10
10
  *
11
- * **Every lookup searches all 399 commodities by default** — standard and rare — so
11
+ * **Every lookup searches every commodity by default** — standard and rare — so
12
12
  * you do not have to know which registry a good belongs to before you can find it:
13
13
  *
14
14
  * ```ts
@@ -18,20 +18,20 @@
18
18
  * The two **by-key** lookups take an optional second argument to **narrow** the search
19
19
  * to a subset — one registry's catalogue, or any array you have filtered yourself:
20
20
  *
21
- * | Module | Export | Entries |
21
+ * | Module | Export | Holds |
22
22
  * | --- | --- | --- |
23
- * | `./commodities-standard` | `COMMODITIES` | 257 |
24
- * | `./commodities-rare` | `RARE_COMMODITIES` | 142 |
25
- * | `./commodities-all` | `ALL_COMMODITIES` | 399 (the default) |
23
+ * | `./commodities-standard` | `COMMODITIES` | standard only |
24
+ * | `./commodities-rare` | `RARE_COMMODITIES` | rares only |
25
+ * | `./commodities-all` | `ALL_COMMODITIES` | both (the default) |
26
26
  *
27
27
  * It narrows *results*, not bundle size: importing a lookup pulls both catalogues,
28
- * since that is what it falls back to — ~30 KiB minified for all 399. Every record
28
+ * since that is what it falls back to — ~30 KiB minified for the pair. Every record
29
29
  * carries a {@link Commodity.rare} flag, so a subset is one `.filter()` away.
30
30
  *
31
31
  * **Only `ALL_COMMODITIES` itself is indexed.** A by-key lookup answers from an O(1)
32
32
  * index when the catalogue you pass *is* `ALL_COMMODITIES` — the same object, not a
33
33
  * copy — and scans linearly otherwise, including for `[...ALL_COMMODITIES]`, which
34
- * holds the same 399 records. Omitting the argument always takes the indexed path, so
34
+ * holds the same records. Omitting the argument always takes the indexed path, so
35
35
  * pass one only when you mean to exclude the other registry.
36
36
  *
37
37
  * {@link commoditiesInCategory} takes no catalogue: it returns an array, so narrowing
@@ -53,8 +53,8 @@
53
53
  * These are Frontier's own category strings (spelled with spaces where the game
54
54
  * spells them so, e.g. `"Consumer Items"`). Both standard and rare commodities draw
55
55
  * from the same set; the rare registry uses only a subset of these groups.
56
- * `"NonMarketable"` is Frontier's group for goods that are not freely traded (its one
57
- * member is Limpets).
56
+ * `"NonMarketable"` is Frontier's group for goods that are not freely traded, such as
57
+ * Limpets.
58
58
  */
59
59
  type CommodityCategory = 'Chemicals' | 'Consumer Items' | 'Foods' | 'Industrial Materials' | 'Legal Drugs' | 'Machinery' | 'Medicines' | 'Metals' | 'Minerals' | 'NonMarketable' | 'Salvage' | 'Slavery' | 'Technology' | 'Textiles' | 'Waste' | 'Weapons';
60
60
  /**
@@ -95,7 +95,7 @@ interface Commodity {
95
95
  *
96
96
  * @param symbol - The internal symbol, e.g. `"Platinum"`, or the lower-cased form the
97
97
  * market/journal reports (`"platinum"`). Leading/trailing whitespace is ignored.
98
- * @param commodities - Optional subset to search instead of all 399 commodities
98
+ * @param commodities - Optional subset to search instead of every commodity
99
99
  * `COMMODITIES` (standard only), `RARE_COMMODITIES`, or any array you have filtered
100
100
  * yourself. Omit it unless you specifically want to exclude the other registry: the
101
101
  * indexed O(1) path is taken only when the argument is omitted or is `ALL_COMMODITIES`
@@ -1 +1 @@
1
- export{commoditiesInCategory,getCommodityByName,getCommodityBySymbol}from"../chunk-J7BM5NGK.js"; //# sourceMappingURL=commodities.js.map
1
+ export{commoditiesInCategory,getCommodityByName,getCommodityBySymbol}from"../chunk-2TY42PTF.js"; //# sourceMappingURL=commodities.js.map
@@ -1 +1 @@
1
- export{commoditiesInCategory,getCommodityByName,getCommodityBySymbol}from"../chunk-J7BM5NGK.js";export{ALL_COMMODITIES}from"../chunk-77TT4K53.js";export{RARE_COMMODITIES}from"../chunk-GMTAFUAG.js";export{COMMODITIES}from"../chunk-6HMIF2RJ.js"; //# sourceMappingURL=index.js.map
1
+ export{commoditiesInCategory,getCommodityByName,getCommodityBySymbol}from"../chunk-2TY42PTF.js";export{ALL_COMMODITIES}from"../chunk-SFEQXUIA.js";export{RARE_COMMODITIES}from"../chunk-TYRH73MO.js";export{COMMODITIES}from"../chunk-Q647OXON.js"; //# sourceMappingURL=index.js.map
@@ -25,5 +25,62 @@ interface PersonalEngineeringIngredient {
25
25
  * ```
26
26
  */
27
27
  declare function sumPersonalEngineeringIngredients(...recipes: readonly (readonly PersonalEngineeringIngredient[])[]): PersonalEngineeringIngredient[];
28
+ /**
29
+ * One stat multiplier an engineer-applied modification puts on a suit, a handheld
30
+ * weapon or a suit tool.
31
+ *
32
+ * @remarks
33
+ * A personal modification is applied in one step: it has no grade and no quality roll,
34
+ * so a modifier is a single factor rather than the `[min, max]` band a ship blueprint
35
+ * feature carries. `1` is the no-op value and is never stored — a recipe lists only the
36
+ * stats it actually moves.
37
+ */
38
+ interface PersonalModifier {
39
+ /**
40
+ * The stat the factor multiplies, named as the equipment catalogues name it —
41
+ * `"magazineSize"`, `"effectiveRange"`, `"batteryCapacity"`, `"goodsCapacity"`.
42
+ *
43
+ * @remarks
44
+ * Some stats the game shows on foot have no catalogue field, because the panel
45
+ * shows no base for them. They are named for what they are: `"meleeDamage"`,
46
+ * `"sprintDuration"`, and the pressurised and unpressurised firing audible ranges.
47
+ *
48
+ * `"toolEnergyDrain"` names no field either, but its bases are catalogued: it is a
49
+ * tool's `powerUsage` and the Energylink's `overloadPowerUsage` in
50
+ * `equipment/tools`. The Energylink's `dischargeRate` carries its own name because
51
+ * the game leaves it alone, so hand `applyPersonalModifiers` the base the factor
52
+ * applies to.
53
+ */
54
+ readonly stat: string;
55
+ /** The factor the stat is multiplied by, e.g. `1.5` for a 50% increase. */
56
+ readonly multiplier: number;
57
+ /** Whether the game rounds the result up to a whole number, as it does a magazine. */
58
+ readonly roundUp?: boolean;
59
+ }
60
+ /**
61
+ * Apply every modifier for one stat to its base value.
62
+ *
63
+ * A **resistance** is the exception, exactly as it is for ship engineering: the factor
64
+ * multiplies the *damage taken*, so a resistance compounds on `1 − r`. Damage Resistance
65
+ * is `×0.9` on damage taken, which turns a `0.5` resistance into `0.55` rather than
66
+ * `0.45`. Any stat whose name ends in `Resistance` is treated this way.
67
+ *
68
+ * @param stat - Stat to apply, e.g. `"magazineSize"`. Modifiers naming another stat are
69
+ * skipped, so a whole suit's or weapon's modifier list can be passed for each stat.
70
+ * @param base - The catalogue value before engineering.
71
+ * @param modifiers - Modifiers to fold in, in order.
72
+ * @returns The modified value, rounded to six decimals to keep binary floating-point
73
+ * noise out of a displayed stat.
74
+ * @throws {TypeError} If `stat` is not a string or `base` is not a finite number.
75
+ * @example
76
+ * ```ts
77
+ * import { applyPersonalModifiers } from '@elite-dangerous-almanac/core/equipment/engineering';
78
+ * import { getPersonalModification } from '@elite-dangerous-almanac/core/equipment/modifications';
79
+ *
80
+ * const clipSize = getPersonalModification('weapon_clipsize')?.modifiers ?? [];
81
+ * applyPersonalModifiers('magazineSize', 45, clipSize); // -> 68
82
+ * ```
83
+ */
84
+ declare function applyPersonalModifiers(stat: string, base: number, modifiers: readonly PersonalModifier[]): number;
28
85
 
29
- export { type PersonalEngineeringIngredient, sumPersonalEngineeringIngredients };
86
+ export { type PersonalEngineeringIngredient, type PersonalModifier, applyPersonalModifiers, sumPersonalEngineeringIngredients };
@@ -1 +1 @@
1
- export{sumPersonalEngineeringIngredients}from"../chunk-C5HG4GJI.js";//# sourceMappingURL=engineering.js.map
1
+ export{applyPersonalModifiers,sumPersonalEngineeringIngredients}from"../chunk-SIL356HB.js"; //# sourceMappingURL=engineering.js.map
@@ -1,5 +1,16 @@
1
- export { EquipmentGrade, SUITS, Suit, SuitGrade, getSuitByFamily, getSuitByName, getSuitBySymbol, getSuitGrade } from './suits.js';
2
- export { PERSONAL_WEAPONS, PersonalDamageType, PersonalFireMode, PersonalWeapon, PersonalWeaponClass, PersonalWeaponEngineeringType, PersonalWeaponGrade, PersonalWeaponSlot, WeaponUpgradeGroup, getPersonalWeaponByName, getPersonalWeaponBySymbol, getPersonalWeaponGrade } from './weapons.js';
3
- export { PersonalEngineeringIngredient, sumPersonalEngineeringIngredients } from './engineering.js';
1
+ /**
2
+ * Elite Dangerous personal equipment: Odyssey suits, handheld weapons, suit tools,
3
+ * Pioneer Supplies grade progression and engineer-applied modifications.
4
+ *
5
+ * Material shopping lists are deliberately leaf-only: import grade-upgrade costs from
6
+ * `equipment/upgrade-costs` and modification costs from
7
+ * `equipment/modification-costs`. Keeping them off this barrel lets identity and stat
8
+ * lookups avoid bundling recipe ingredients.
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ export { E as EquipmentGrade, P as PERSONAL_WEAPONS, a as PersonalDamageType, b as PersonalFireMode, c as PersonalMount, d as PersonalMountKey, e as PersonalWeapon, f as PersonalWeaponClass, g as PersonalWeaponEngineeringType, h as PersonalWeaponGrade, i as PersonalWeaponMetrics, j as PersonalWeaponSlot, R as ReloadTime, S as SUITS, k as ScopeMagnification, l as Suit, m as SuitGrade, W as WeaponUpgradeGroup, n as getPersonalWeaponByName, o as getPersonalWeaponBySymbol, p as getPersonalWeaponGrade, q as getSuitByFamily, r as getSuitByName, s as getSuitBySymbol, t as getSuitGrade, u as personalWeaponMetrics } from '../suits-B37rAORs.js';
13
+ export { PERSONAL_TOOLS, PersonalTool, getPersonalToolById } from './tools.js';
14
+ export { PersonalEngineeringIngredient, PersonalModifier, applyPersonalModifiers, sumPersonalEngineeringIngredients } from './engineering.js';
4
15
  export { PERSONAL_MODIFICATIONS, PersonalModification, PersonalModificationTarget, getPersonalModification } from './modifications.js';
5
16
  export { resolvePersonalModificationForWeapon } from './modification-journal.js';
@@ -1 +1 @@
1
- export{resolvePersonalModificationForWeapon}from"../chunk-A6OINYNP.js";export{PERSONAL_MODIFICATIONS,getPersonalModification}from"../chunk-MGRDB2BZ.js";export{SUITS,getSuitByFamily,getSuitByName,getSuitBySymbol,getSuitGrade}from"../chunk-B7EYTZRK.js";export{PERSONAL_WEAPONS,getPersonalWeaponByName,getPersonalWeaponBySymbol,getPersonalWeaponGrade}from"../chunk-6GJHUWMO.js"; export{sumPersonalEngineeringIngredients}from"../chunk-C5HG4GJI.js"; //# sourceMappingURL=index.js.map
1
+ export{resolvePersonalModificationForWeapon}from"../chunk-R2AEZYX7.js";export{PERSONAL_MODIFICATIONS,getPersonalModification}from"../chunk-AC3U7LRK.js";export{PERSONAL_TOOLS,getPersonalToolById}from"../chunk-CEF7SMB2.js";export{SUITS,getSuitByFamily,getSuitByName,getSuitBySymbol,getSuitGrade}from"../chunk-UTWZZOSA.js";export{PERSONAL_WEAPONS,getPersonalWeaponByName,getPersonalWeaponBySymbol,getPersonalWeaponGrade,personalWeaponMetrics}from"../chunk-PIU24HRN.js"; export{applyPersonalModifiers,sumPersonalEngineeringIngredients}from"../chunk-SIL356HB.js"; //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- export{resolvePersonalModificationForWeapon}from"../chunk-A6OINYNP.js"; //# sourceMappingURL=modification-journal.js.map
1
+ export{resolvePersonalModificationForWeapon}from"../chunk-R2AEZYX7.js"; //# sourceMappingURL=modification-journal.js.map
@@ -1,18 +1,27 @@
1
+ import { PersonalModifier } from './engineering.js';
2
+
1
3
  /**
2
4
  * Engineer-applied modification recipes for Odyssey suits and handheld weapons.
3
5
  *
4
6
  * The catalogue is keyed by recipe symbol, following the same pattern as ship
5
7
  * blueprints and experimental effects. Most keys are the exact symbol written by a
6
- * journal loadout. Greater Range, Headshot Damage and Higher Accuracy each have three
7
- * technology-specific recipes; use `equipment/modification-journal` to resolve those
8
- * journal symbols against a weapon.
8
+ * journal loadout. Greater Range, Headshot Damage and Improved Hip Fire Accuracy
9
+ * each have three technology-specific recipes; use `equipment/modification-journal`
10
+ * to resolve those journal symbols against a weapon.
9
11
  *
10
12
  * Material shopping lists live separately in `equipment/modification-costs`, so reading
11
13
  * names and engineer availability does not bundle every recipe ingredient.
12
14
  *
13
15
  * @packageDocumentation
14
16
  */
15
- /** Equipment kind a personal modification can be installed on. */
17
+
18
+ /**
19
+ * Equipment kind a personal modification can be installed on.
20
+ *
21
+ * @remarks
22
+ * A suit tool is not one of them. The one recipe that changes a tool, Reduced Tool
23
+ * Battery Consumption, is installed on the suit and carries `"suit"`.
24
+ */
16
25
  type PersonalModificationTarget = 'suit' | 'weapon';
17
26
  /** One permanent personal-equipment engineering recipe. */
18
27
  interface PersonalModification {
@@ -22,21 +31,44 @@ interface PersonalModification {
22
31
  readonly target: PersonalModificationTarget;
23
32
  /** English names of the on-foot engineers who offer the modification. */
24
33
  readonly engineers: readonly string[];
34
+ /**
35
+ * The stat multipliers the modification applies, in the order the game applies
36
+ * them. Fold one onto a base value with `applyPersonalModifiers` from
37
+ * `equipment/engineering`.
38
+ *
39
+ * A modifier names a stat of whatever it modifies, which is usually the equipment
40
+ * the recipe is installed on. Two suit modifications move something else, and a
41
+ * consumer has to know about both: Extra Ammo Capacity multiplies a *weapon's*
42
+ * `reserveAmmo`, and Reduced Tool Battery Consumption halves a *tool's*
43
+ * `powerUsage` and the Energylink's `overloadPowerUsage` under the name
44
+ * `toolEnergyDrain`.
45
+ *
46
+ * @remarks
47
+ * **Empty** where the recipe changes nothing this catalogue names. Night Vision,
48
+ * Scope, Reload Speed, Stowed reloading and Combat Movement Speed have no numeric
49
+ * magnitude at all — Scope swaps the sight, and each weapon's two magnifications
50
+ * are on its own `scopeMagnification`; Reload Speed shortens the reload, and each
51
+ * weapon's two reload times are on its own `reloadTime`. Faster Handling, Improved
52
+ * Hip Fire Accuracy, Stability and Improved Jump Assist do change stats, ones the
53
+ * personal stats panel does not put a number on; see
54
+ * [`data/equipment/SOURCES.md`](https://github.com/DarkSession/Elite-Dangerous-Almanac/blob/main/data/equipment/SOURCES.md).
55
+ */
56
+ readonly modifiers: readonly PersonalModifier[];
25
57
  }
26
58
  /**
27
- * All 31 suit and weapon engineering recipes, keyed by recipe symbol.
59
+ * Every suit and weapon engineering recipe, keyed by recipe symbol.
28
60
  *
29
61
  * @remarks
30
- * There are 25 distinct display names. Greater Range, Headshot Damage and Higher
31
- * Accuracy each have separate Kinetic, Laser and Plasma recipes because their material
32
- * costs differ. Their keys end in `_kinetic`, `_laser` or `_plasma`; the journal omits
33
- * that suffix, so resolve its value with `resolvePersonalModificationForWeapon` from
34
- * `equipment/modification-journal`.
62
+ * A recipe symbol is finer-grained than a display name: Greater Range, Headshot Damage
63
+ * and Improved Hip Fire Accuracy each have separate Kinetic, Laser and Plasma recipes
64
+ * because their material costs differ. Their keys end in `_kinetic`, `_laser` or
65
+ * `_plasma`; the journal omits that suffix, so resolve its value with
66
+ * `resolvePersonalModificationForWeapon` from `equipment/modification-journal`.
35
67
  *
36
68
  * @example
37
69
  * ```ts
38
70
  * import { PERSONAL_MODIFICATIONS } from '@elite-dangerous-almanac/core/equipment/modifications';
39
- * PERSONAL_MODIFICATIONS['suit_nightvision']?.name; // -> 'Night Vision'
71
+ * PERSONAL_MODIFICATIONS['suit_increasedo2capacity']?.modifiers[0]?.multiplier; // -> 5
40
72
  * ```
41
73
  */
42
74
  declare const PERSONAL_MODIFICATIONS: Readonly<Record<string, PersonalModification>>;
@@ -1 +1 @@
1
- export{PERSONAL_MODIFICATIONS,getPersonalModification}from"../chunk-MGRDB2BZ.js"; //# sourceMappingURL=modifications.js.map
1
+ export{PERSONAL_MODIFICATIONS,getPersonalModification}from"../chunk-AC3U7LRK.js"; //# sourceMappingURL=modifications.js.map
@@ -1,115 +1,2 @@
1
- /**
2
- * Odyssey personal suits, their journal identifiers and grade-dependent defensive stats.
3
- *
4
- * @packageDocumentation
5
- */
6
- /** A Pioneer Supplies equipment grade, from the stock grade 1 through grade 5. */
7
- type EquipmentGrade = 1 | 2 | 3 | 4 | 5;
8
- /** The stats of one suit at one equipment grade. */
9
- interface SuitGrade {
10
- /** Frontier item symbol for this exact suit and grade. */
11
- readonly symbol: string;
12
- /** Permanent engineering-modification slots available, from `0` through `4`. */
13
- readonly modificationSlots: number;
14
- /** Base shield strength in shield points. */
15
- readonly shieldStrength: number;
16
- /** Shield points regenerated per second. */
17
- readonly shieldRegeneration: number;
18
- /** Kinetic damage resistance as a fraction; negative values increase damage. */
19
- readonly kineticResistance: number;
20
- /** Thermal damage resistance as a fraction. */
21
- readonly thermalResistance: number;
22
- /** Plasma damage resistance as a fraction; negative values increase damage. */
23
- readonly plasmaResistance: number;
24
- /** Explosive damage resistance as a fraction. */
25
- readonly explosiveResistance: number;
26
- }
27
- /** One personal suit model sold by Pioneer Supplies. */
28
- interface Suit {
29
- /** Suit family without a grade suffix, e.g. `"utilitysuit"`. */
30
- readonly family: string;
31
- /** English display name, e.g. `"Maverick Suit"`. */
32
- readonly name: string;
33
- /** Number of primary-weapon slots. */
34
- readonly primarySlots: number;
35
- /** Number of secondary-weapon slots. */
36
- readonly secondarySlots: number;
37
- /** Available grade records, keyed by `"1"` through `"5"`. */
38
- readonly grades: Readonly<Partial<Record<`${EquipmentGrade}`, SuitGrade>>>;
39
- }
40
- /**
41
- * All four personal suits, including the non-upgradeable Flight Suit.
42
- *
43
- * @example
44
- * ```ts
45
- * import { SUITS } from '@elite-dangerous-almanac/core/equipment/suits';
46
- * SUITS.length; // -> 4
47
- * ```
48
- */
49
- declare const SUITS: readonly Suit[];
50
- /**
51
- * Look up a suit model by its grade-independent family, case-insensitively.
52
- *
53
- * @param family - Family such as `"utilitysuit"`, matched case-insensitively after
54
- * trimming surrounding whitespace.
55
- * @returns The frozen suit record, or `null` when unknown.
56
- * @throws {TypeError} If `family` is present and not a string. A nullish family is a
57
- * miss, answered like an unrecognised one.
58
- * @example
59
- * ```ts
60
- * import { getSuitByFamily } from '@elite-dangerous-almanac/core/equipment/suits';
61
- * getSuitByFamily('utilitysuit')?.name; // -> 'Maverick Suit'
62
- * ```
63
- */
64
- declare function getSuitByFamily(family: string): Suit | null;
65
- /**
66
- * Look up a suit by its display name, case-insensitively.
67
- *
68
- * @param name - Display name such as `"Maverick Suit"`, matched case-insensitively
69
- * after trimming surrounding whitespace.
70
- * @returns The frozen suit record, or `null` when unknown.
71
- * @throws {TypeError} If `name` is present and not a string. A nullish name is a miss,
72
- * answered like an unrecognised one.
73
- * @example
74
- * ```ts
75
- * import { getSuitByName } from '@elite-dangerous-almanac/core/equipment/suits';
76
- * getSuitByName('Maverick Suit')?.family; // -> 'utilitysuit'
77
- * ```
78
- */
79
- declare function getSuitByName(name: string): Suit | null;
80
- /**
81
- * Resolve the grade-specific Frontier item symbol reported by journal suit events.
82
- *
83
- * @param symbol - Item symbol such as `"utilitysuit_class3"`, matched
84
- * case-insensitively after trimming surrounding whitespace.
85
- * @returns The owning suit and its numeric grade, or `null` when unknown.
86
- * @throws {TypeError} If `symbol` is present and not a string. A nullish symbol is a
87
- * miss, answered like an unrecognised one.
88
- * @example
89
- * ```ts
90
- * import { getSuitBySymbol } from '@elite-dangerous-almanac/core/equipment/suits';
91
- * getSuitBySymbol('utilitysuit_class3')?.grade; // -> 3
92
- * ```
93
- */
94
- declare function getSuitBySymbol(symbol: string): Readonly<{
95
- suit: Suit;
96
- grade: EquipmentGrade;
97
- }> | null;
98
- /**
99
- * Read a suit's stats at one grade.
100
- *
101
- * @param suit - A catalogue suit record.
102
- * @param grade - Integer grade `1`–`5`.
103
- * @returns The frozen grade record, or `null` when that suit has no such grade.
104
- * @throws {RangeError} If `grade` is not an integer from 1 through 5.
105
- * @example
106
- * ```ts
107
- * import { getSuitByFamily, getSuitGrade } from '@elite-dangerous-almanac/core/equipment/suits';
108
- * const suit = getSuitByFamily('utilitysuit');
109
- * if (!suit) throw new Error('Maverick Suit is missing');
110
- * getSuitGrade(suit, 5)?.modificationSlots; // -> 4
111
- * ```
112
- */
113
- declare function getSuitGrade(suit: Suit, grade: number): SuitGrade | null;
114
-
115
- export { type EquipmentGrade, SUITS, type Suit, type SuitGrade, getSuitByFamily, getSuitByName, getSuitBySymbol, getSuitGrade };
1
+ export { E as EquipmentGrade, c as PersonalMount, d as PersonalMountKey, S as SUITS, l as Suit, m as SuitGrade, q as getSuitByFamily, r as getSuitByName, s as getSuitBySymbol, t as getSuitGrade } from '../suits-B37rAORs.js';
2
+ import './engineering.js';
@@ -1 +1 @@
1
- export{SUITS,getSuitByFamily,getSuitByName,getSuitBySymbol,getSuitGrade}from"../chunk-B7EYTZRK.js"; //# sourceMappingURL=suits.js.map
1
+ export{SUITS,getSuitByFamily,getSuitByName,getSuitBySymbol,getSuitGrade}from"../chunk-UTWZZOSA.js"; //# sourceMappingURL=suits.js.map
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Odyssey suit tools: the Energylink, Profile Analyser, Arc Cutter and Genetic Sampler,
3
+ * the suits that carry each one, and their battery and timing stats.
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ /**
8
+ * One tool a Commander carries on foot.
9
+ *
10
+ * @remarks
11
+ * A stat a tool does not have is absent rather than zero: only the Energylink
12
+ * discharges and overloads, and only the Profile Analyser scans and clones.
13
+ *
14
+ * Every power figure is in the same unit as {@link Suit.batteryCapacity}, so a suit's
15
+ * battery divided by a tool's per-second drain is the seconds of use it holds.
16
+ */
17
+ interface PersonalTool {
18
+ /**
19
+ * This library's own id, e.g. `"arc-cutter"`.
20
+ *
21
+ * @remarks
22
+ * Frontier publishes no item symbol for a tool: a journal `SuitLoadout` names the
23
+ * suit and its weapon mounts only. The id is therefore a library key, and joins to
24
+ * no journal field.
25
+ */
26
+ readonly id: string;
27
+ /**
28
+ * English display name, e.g. `"Arc Cutter"`.
29
+ *
30
+ * @remarks
31
+ * This is the canonical English. `getPersonalToolName` in `i18n/personal-tools`
32
+ * takes the same `id` and answers in all six stored locales.
33
+ */
34
+ readonly name: string;
35
+ /** Families of the suits that carry the tool, as {@link Suit.family} spells them. */
36
+ readonly suitFamilies: readonly string[];
37
+ /** Energylink: battery charge delivered to a target, in MW per second. */
38
+ readonly rechargeRate?: number;
39
+ /** Energylink: battery charge drawn from a target, in MW per second. */
40
+ readonly dischargeRate?: number;
41
+ /** Energylink: seconds one discharge lasts. */
42
+ readonly dischargeDuration?: number;
43
+ /**
44
+ * Energylink: battery charge one overload costs, in MW. The Reduced Tool Battery
45
+ * Consumption factor, named `toolEnergyDrain`, applies to this.
46
+ */
47
+ readonly overloadPowerUsage?: number;
48
+ /**
49
+ * Battery charge the tool draws while it works, in MW per second. The Reduced Tool
50
+ * Battery Consumption factor, named `toolEnergyDrain`, applies to this.
51
+ */
52
+ readonly powerUsage?: number;
53
+ /** Profile Analyser: seconds one profile scan takes. */
54
+ readonly scanDuration?: number;
55
+ /** Profile Analyser: seconds one profile clone takes. */
56
+ readonly cloneDuration?: number;
57
+ }
58
+ /**
59
+ * Every suit tool, in catalogue order.
60
+ *
61
+ * @remarks
62
+ * The Reduced Tool Battery Consumption suit modification halves the `toolEnergyDrain`
63
+ * stat, which is this catalogue's `powerUsage` and the Energylink's
64
+ * `overloadPowerUsage`. It leaves `dischargeRate` alone, which is why the two carry
65
+ * separate names: pass the base a factor applies to, and the discharge rate can never
66
+ * pick one up.
67
+ *
68
+ * @example
69
+ * ```ts
70
+ * import { PERSONAL_TOOLS } from '@elite-dangerous-almanac/core/equipment/tools';
71
+ * PERSONAL_TOOLS[0]?.name; // -> 'Energylink'
72
+ * ```
73
+ * @example
74
+ * ```ts
75
+ * import { applyPersonalModifiers } from '@elite-dangerous-almanac/core/equipment/engineering';
76
+ * import { getPersonalModification } from '@elite-dangerous-almanac/core/equipment/modifications';
77
+ * import { getPersonalToolById } from '@elite-dangerous-almanac/core/equipment/tools';
78
+ *
79
+ * const recipe = getPersonalModification('suit_reducedtoolbatteryconsumption');
80
+ * const cutter = getPersonalToolById('arc-cutter');
81
+ * applyPersonalModifiers('toolEnergyDrain', cutter?.powerUsage ?? 0, recipe?.modifiers ?? []);
82
+ * // -> 0.075
83
+ * ```
84
+ */
85
+ declare const PERSONAL_TOOLS: readonly PersonalTool[];
86
+ /**
87
+ * Look up a suit tool by its library id, case-insensitively.
88
+ *
89
+ * @param id - Library id such as `"energylink"`, matched case-insensitively after
90
+ * trimming surrounding whitespace.
91
+ * @returns The frozen tool record, or `null` when unknown.
92
+ * @throws {TypeError} If `id` is present and not a string. A nullish id is a miss,
93
+ * answered like an unrecognised one.
94
+ * @example
95
+ * ```ts
96
+ * import { getPersonalToolById } from '@elite-dangerous-almanac/core/equipment/tools';
97
+ * getPersonalToolById('arc-cutter')?.suitFamilies; // -> ['utilitysuit']
98
+ * ```
99
+ */
100
+ declare function getPersonalToolById(id: string): PersonalTool | null;
101
+
102
+ export { PERSONAL_TOOLS, type PersonalTool, getPersonalToolById };
@@ -0,0 +1 @@
1
+ export{PERSONAL_TOOLS,getPersonalToolById}from"../chunk-CEF7SMB2.js"; //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"O"}
@@ -1,6 +1,5 @@
1
- import { WeaponUpgradeGroup } from './weapons.js';
1
+ import { W as WeaponUpgradeGroup } from '../suits-B37rAORs.js';
2
2
  import { PersonalEngineeringIngredient } from './engineering.js';
3
- import './suits.js';
4
3
 
5
4
  /**
6
5
  * Material costs for Pioneer Supplies suit and handheld-weapon grade upgrades.
@@ -40,7 +39,7 @@ type PersonalUpgradeGradeCosts = Readonly<Record<'2' | '3' | '4' | '5', readonly
40
39
  * } from '@elite-dangerous-almanac/core/equipment/upgrade-costs';
41
40
  *
42
41
  * const costs: PersonalUpgradeCosts = PERSONAL_UPGRADE_COSTS;
43
- * Object.keys(costs.suits).length; // -> 3
42
+ * costs.suits['utilitysuit']?.['2']?.[0]?.symbol; // -> 'suitschematic'
44
43
  * ```
45
44
  */
46
45
  interface PersonalUpgradeCosts {
@@ -1 +1 @@
1
- import{getSuitByFamily}from"../chunk-B7EYTZRK.js";import{getPersonalWeaponBySymbol}from"../chunk-6GJHUWMO.js"; import{sumPersonalEngineeringIngredients}from"../chunk-C5HG4GJI.js"; import{deepFreeze}from"../chunk-DURKO7JU.js";var upgrade_costs_default={suits:{utilitysuit:{2:[{symbol:"suitschematic",count:1},{symbol:"healthmonitor",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"carbonfibreplating",count:2},{symbol:"graphene",count:2}],3:[{symbol:"suitschematic",count:2},{symbol:"healthmonitor",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"carbonfibreplating",count:5},{symbol:"graphene",count:5}],4:[{symbol:"suitschematic",count:4},{symbol:"healthmonitor",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"carbonfibreplating",count:9},{symbol:"graphene",count:9}],5:[{symbol:"suitschematic",count:5},{symbol:"healthmonitor",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"carbonfibreplating",count:12},{symbol:"graphene",count:12}]},tacticalsuit:{2:[{symbol:"suitschematic",count:1},{symbol:"healthmonitor",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"titaniumplating",count:2},{symbol:"graphene",count:2}],3:[{symbol:"suitschematic",count:2},{symbol:"healthmonitor",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"titaniumplating",count:5},{symbol:"graphene",count:5}],4:[{symbol:"suitschematic",count:4},{symbol:"healthmonitor",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"titaniumplating",count:9},{symbol:"graphene",count:9}],5:[{symbol:"suitschematic",count:5},{symbol:"healthmonitor",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"titaniumplating",count:12},{symbol:"graphene",count:12}]},explorationsuit:{2:[{symbol:"suitschematic",count:1},{symbol:"healthmonitor",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"aerogel",count:2},{symbol:"graphene",count:2}],3:[{symbol:"suitschematic",count:2},{symbol:"healthmonitor",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"aerogel",count:5},{symbol:"graphene",count:5}],4:[{symbol:"suitschematic",count:4},{symbol:"healthmonitor",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"aerogel",count:9},{symbol:"graphene",count:9}],5:[{symbol:"suitschematic",count:5},{symbol:"healthmonitor",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"aerogel",count:12},{symbol:"graphene",count:12}]}},weaponGroups:{takada:{2:[{symbol:"weaponschematic",count:1},{symbol:"ionisedgas",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"microelectrode",count:2},{symbol:"opticalfibre",count:2}],3:[{symbol:"weaponschematic",count:2},{symbol:"ionisedgas",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"microelectrode",count:5},{symbol:"opticalfibre",count:5}],4:[{symbol:"weaponschematic",count:4},{symbol:"ionisedgas",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"microelectrode",count:9},{symbol:"opticalfibre",count:9}],5:[{symbol:"weaponschematic",count:5},{symbol:"ionisedgas",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"microelectrode",count:12},{symbol:"opticalfibre",count:12}]},manticore:{2:[{symbol:"weaponschematic",count:1},{symbol:"ionisedgas",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"microelectrode",count:2},{symbol:"chemicalsuperbase",count:2}],3:[{symbol:"weaponschematic",count:2},{symbol:"ionisedgas",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"microelectrode",count:5},{symbol:"chemicalsuperbase",count:5}],4:[{symbol:"weaponschematic",count:4},{symbol:"ionisedgas",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"microelectrode",count:9},{symbol:"chemicalsuperbase",count:9}],5:[{symbol:"weaponschematic",count:5},{symbol:"ionisedgas",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"microelectrode",count:12},{symbol:"chemicalsuperbase",count:12}]},karma:{2:[{symbol:"weaponschematic",count:1},{symbol:"compressionliquefiedgas",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"weaponcomponent",count:2},{symbol:"tungstencarbide",count:2}],3:[{symbol:"weaponschematic",count:2},{symbol:"compressionliquefiedgas",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"weaponcomponent",count:5},{symbol:"tungstencarbide",count:5}],4:[{symbol:"weaponschematic",count:4},{symbol:"compressionliquefiedgas",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"weaponcomponent",count:9},{symbol:"tungstencarbide",count:9}],5:[{symbol:"weaponschematic",count:5},{symbol:"compressionliquefiedgas",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"weaponcomponent",count:12},{symbol:"tungstencarbide",count:12}]}}};var PERSONAL_UPGRADE_COSTS=deepFreeze(upgrade_costs_default);function getSuitUpgradeStepCost(family,targetGrade){assertTargetGrade(targetGrade,"getSuitUpgradeStepCost");const costs=getSuitUpgradeCosts(family);return costs?.[String(targetGrade)]??null}function getSuitUpgradeCost(family,targetGrade,currentGrade=1){assertGrade(targetGrade,"getSuitUpgradeCost: targetGrade");assertGrade(currentGrade,"getSuitUpgradeCost: currentGrade");const costs=getSuitUpgradeCosts(family);if(!costs)return null;return totalCosts(costs,targetGrade,currentGrade)}function getPersonalWeaponUpgradeStepCost(symbol,targetGrade){assertTargetGrade(targetGrade,"getPersonalWeaponUpgradeStepCost");const weapon=getPersonalWeaponBySymbol(symbol);if(!weapon)return null;return PERSONAL_UPGRADE_COSTS.weaponGroups[weapon.upgradeGroup][String(targetGrade)]??null}function getPersonalWeaponUpgradeCost(symbol,targetGrade,currentGrade=1){assertGrade(targetGrade,"getPersonalWeaponUpgradeCost: targetGrade");assertGrade(currentGrade,"getPersonalWeaponUpgradeCost: currentGrade");const weapon=getPersonalWeaponBySymbol(symbol);if(!weapon)return null;return totalCosts(PERSONAL_UPGRADE_COSTS.weaponGroups[weapon.upgradeGroup],targetGrade,currentGrade)}function totalCosts(costs,targetGrade,currentGrade){const steps=[];for(let grade=currentGrade+1;grade<=targetGrade;grade++){steps.push(costs[String(grade)])}return sumPersonalEngineeringIngredients(...steps)}function getSuitUpgradeCosts(family){const suit=getSuitByFamily(family);if(!suit||!Object.hasOwn(PERSONAL_UPGRADE_COSTS.suits,suit.family))return null;return PERSONAL_UPGRADE_COSTS.suits[suit.family]}function assertTargetGrade(grade,functionName){if(!Number.isInteger(grade)||grade<2||grade>5){throw new RangeError(`${functionName}: targetGrade must be an integer in [2, 5]`)}}function assertGrade(grade,label){if(!Number.isInteger(grade)||grade<1||grade>5){throw new RangeError(`${label} must be an integer in [1, 5]`)}}export{PERSONAL_UPGRADE_COSTS,getPersonalWeaponUpgradeCost,getPersonalWeaponUpgradeStepCost,getSuitUpgradeCost,getSuitUpgradeStepCost};//# sourceMappingURL=upgrade-costs.js.map
1
+ import{getSuitByFamily}from"../chunk-UTWZZOSA.js";import{getPersonalWeaponBySymbol}from"../chunk-PIU24HRN.js"; import{sumPersonalEngineeringIngredients}from"../chunk-SIL356HB.js"; import{deepFreeze}from"../chunk-DURKO7JU.js";var upgrade_costs_default={suits:{utilitysuit:{2:[{symbol:"suitschematic",count:1},{symbol:"healthmonitor",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"carbonfibreplating",count:2},{symbol:"graphene",count:2}],3:[{symbol:"suitschematic",count:2},{symbol:"healthmonitor",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"carbonfibreplating",count:5},{symbol:"graphene",count:5}],4:[{symbol:"suitschematic",count:4},{symbol:"healthmonitor",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"carbonfibreplating",count:9},{symbol:"graphene",count:9}],5:[{symbol:"suitschematic",count:5},{symbol:"healthmonitor",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"carbonfibreplating",count:12},{symbol:"graphene",count:12}]},tacticalsuit:{2:[{symbol:"suitschematic",count:1},{symbol:"healthmonitor",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"titaniumplating",count:2},{symbol:"graphene",count:2}],3:[{symbol:"suitschematic",count:2},{symbol:"healthmonitor",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"titaniumplating",count:5},{symbol:"graphene",count:5}],4:[{symbol:"suitschematic",count:4},{symbol:"healthmonitor",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"titaniumplating",count:9},{symbol:"graphene",count:9}],5:[{symbol:"suitschematic",count:5},{symbol:"healthmonitor",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"titaniumplating",count:12},{symbol:"graphene",count:12}]},explorationsuit:{2:[{symbol:"suitschematic",count:1},{symbol:"healthmonitor",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"aerogel",count:2},{symbol:"graphene",count:2}],3:[{symbol:"suitschematic",count:2},{symbol:"healthmonitor",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"aerogel",count:5},{symbol:"graphene",count:5}],4:[{symbol:"suitschematic",count:4},{symbol:"healthmonitor",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"aerogel",count:9},{symbol:"graphene",count:9}],5:[{symbol:"suitschematic",count:5},{symbol:"healthmonitor",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"aerogel",count:12},{symbol:"graphene",count:12}]}},weaponGroups:{takada:{2:[{symbol:"weaponschematic",count:1},{symbol:"ionisedgas",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"microelectrode",count:2},{symbol:"opticalfibre",count:2}],3:[{symbol:"weaponschematic",count:2},{symbol:"ionisedgas",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"microelectrode",count:5},{symbol:"opticalfibre",count:5}],4:[{symbol:"weaponschematic",count:4},{symbol:"ionisedgas",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"microelectrode",count:9},{symbol:"opticalfibre",count:9}],5:[{symbol:"weaponschematic",count:5},{symbol:"ionisedgas",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"microelectrode",count:12},{symbol:"opticalfibre",count:12}]},manticore:{2:[{symbol:"weaponschematic",count:1},{symbol:"ionisedgas",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"microelectrode",count:2},{symbol:"chemicalsuperbase",count:2}],3:[{symbol:"weaponschematic",count:2},{symbol:"ionisedgas",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"microelectrode",count:5},{symbol:"chemicalsuperbase",count:5}],4:[{symbol:"weaponschematic",count:4},{symbol:"ionisedgas",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"microelectrode",count:9},{symbol:"chemicalsuperbase",count:9}],5:[{symbol:"weaponschematic",count:5},{symbol:"ionisedgas",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"microelectrode",count:12},{symbol:"chemicalsuperbase",count:12}]},karma:{2:[{symbol:"weaponschematic",count:1},{symbol:"compressionliquefiedgas",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"weaponcomponent",count:2},{symbol:"tungstencarbide",count:2}],3:[{symbol:"weaponschematic",count:2},{symbol:"compressionliquefiedgas",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"weaponcomponent",count:5},{symbol:"tungstencarbide",count:5}],4:[{symbol:"weaponschematic",count:4},{symbol:"compressionliquefiedgas",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"weaponcomponent",count:9},{symbol:"tungstencarbide",count:9}],5:[{symbol:"weaponschematic",count:5},{symbol:"compressionliquefiedgas",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"weaponcomponent",count:12},{symbol:"tungstencarbide",count:12}]}}};var PERSONAL_UPGRADE_COSTS=deepFreeze(upgrade_costs_default);function getSuitUpgradeStepCost(family,targetGrade){assertTargetGrade(targetGrade,"getSuitUpgradeStepCost");const costs=getSuitUpgradeCosts(family);return costs?.[String(targetGrade)]??null}function getSuitUpgradeCost(family,targetGrade,currentGrade=1){assertGrade(targetGrade,"getSuitUpgradeCost: targetGrade");assertGrade(currentGrade,"getSuitUpgradeCost: currentGrade");const costs=getSuitUpgradeCosts(family);if(!costs)return null;return totalCosts(costs,targetGrade,currentGrade)}function getPersonalWeaponUpgradeStepCost(symbol,targetGrade){assertTargetGrade(targetGrade,"getPersonalWeaponUpgradeStepCost");const weapon=getPersonalWeaponBySymbol(symbol);if(!weapon)return null;return PERSONAL_UPGRADE_COSTS.weaponGroups[weapon.upgradeGroup][String(targetGrade)]??null}function getPersonalWeaponUpgradeCost(symbol,targetGrade,currentGrade=1){assertGrade(targetGrade,"getPersonalWeaponUpgradeCost: targetGrade");assertGrade(currentGrade,"getPersonalWeaponUpgradeCost: currentGrade");const weapon=getPersonalWeaponBySymbol(symbol);if(!weapon)return null;return totalCosts(PERSONAL_UPGRADE_COSTS.weaponGroups[weapon.upgradeGroup],targetGrade,currentGrade)}function totalCosts(costs,targetGrade,currentGrade){const steps=[];for(let grade=currentGrade+1;grade<=targetGrade;grade++){steps.push(costs[String(grade)])}return sumPersonalEngineeringIngredients(...steps)}function getSuitUpgradeCosts(family){const suit=getSuitByFamily(family);if(!suit||!Object.hasOwn(PERSONAL_UPGRADE_COSTS.suits,suit.family))return null;return PERSONAL_UPGRADE_COSTS.suits[suit.family]}function assertTargetGrade(grade,functionName){if(!Number.isInteger(grade)||grade<2||grade>5){throw new RangeError(`${functionName}: targetGrade must be an integer in [2, 5]`)}}function assertGrade(grade,label){if(!Number.isInteger(grade)||grade<1||grade>5){throw new RangeError(`${label} must be an integer in [1, 5]`)}}export{PERSONAL_UPGRADE_COSTS,getPersonalWeaponUpgradeCost,getPersonalWeaponUpgradeStepCost,getSuitUpgradeCost,getSuitUpgradeStepCost};//# sourceMappingURL=upgrade-costs.js.map