@elite-dangerous-almanac/core 0.1.8 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (261) hide show
  1. package/PROVENANCE/i18n/SOURCES.md +2 -2
  2. package/PROVENANCE/ships/SOURCES.md +11 -9
  3. package/README.md +54 -40
  4. package/dist/astro/galaxy-grid.js +1 -1
  5. package/dist/astro/index.d.ts +1 -1
  6. package/dist/astro/index.js +1 -1
  7. package/dist/astro/naming-region-origins.d.ts +1 -1
  8. package/dist/astro/naming-region-origins.js +1 -1
  9. package/dist/astro/nebulae.d.ts +2 -2
  10. package/dist/astro/permit-locks.d.ts +2 -1
  11. package/dist/astro/permit-locks.js +1 -1
  12. package/dist/astro/procedural-system.d.ts +2 -1
  13. package/dist/astro/procedural-system.js +1 -1
  14. package/dist/astro/sector-name.d.ts +2 -1
  15. package/dist/astro/sector-name.js +1 -1
  16. package/dist/astro/system-address.d.ts +1 -1
  17. package/dist/astro/system-name.d.ts +14 -9
  18. package/dist/astro/system-name.js +1 -1
  19. package/dist/chunk-2W5MW376.js +1 -0
  20. package/dist/chunk-2W5MW376.js.map +1 -0
  21. package/dist/{chunk-VZZUNSDF.js → chunk-4KJ7CR74.js} +1 -1
  22. package/dist/{chunk-VZZUNSDF.js.map → chunk-4KJ7CR74.js.map} +1 -1
  23. package/dist/{chunk-6EUVIZAS.js → chunk-4QYTVSNR.js} +1 -1
  24. package/dist/{chunk-EKQCVCMK.js → chunk-5ZVYRX6Z.js} +1 -1
  25. package/dist/{chunk-EKQCVCMK.js.map → chunk-5ZVYRX6Z.js.map} +1 -1
  26. package/dist/chunk-6GJHUWMO.js +1 -0
  27. package/dist/chunk-6GJHUWMO.js.map +1 -0
  28. package/dist/chunk-6L56LWTT.js +1 -0
  29. package/dist/chunk-6L56LWTT.js.map +1 -0
  30. package/dist/{chunk-GQ5GX5TB.js → chunk-6O4NRRSB.js} +1 -1
  31. package/dist/chunk-6O4NRRSB.js.map +1 -0
  32. package/dist/{chunk-WNGQ3IAM.js → chunk-6UNAD74Z.js} +1 -1
  33. package/dist/{chunk-WNGQ3IAM.js.map → chunk-6UNAD74Z.js.map} +1 -1
  34. package/dist/{chunk-JPBMRJFC.js → chunk-77I24V6B.js} +1 -1
  35. package/dist/chunk-77I24V6B.js.map +1 -0
  36. package/dist/chunk-7ATBEOVC.js +1 -0
  37. package/dist/chunk-7ATBEOVC.js.map +1 -0
  38. package/dist/chunk-7TQ2X6Q3.js +1 -0
  39. package/dist/chunk-7TQ2X6Q3.js.map +1 -0
  40. package/dist/{chunk-6EPYVBAX.js → chunk-A6OINYNP.js} +1 -1
  41. package/dist/{chunk-Q3QCLNVG.js → chunk-AYAKU4YA.js} +1 -1
  42. package/dist/chunk-AYAKU4YA.js.map +1 -0
  43. package/dist/chunk-B7EYTZRK.js +1 -0
  44. package/dist/chunk-B7EYTZRK.js.map +1 -0
  45. package/dist/{chunk-EBAHNZ36.js → chunk-CIULJH3G.js} +1 -1
  46. package/dist/{chunk-EBAHNZ36.js.map → chunk-CIULJH3G.js.map} +1 -1
  47. package/dist/{chunk-SNADUQSJ.js → chunk-CJK2IBI2.js} +1 -1
  48. package/dist/{chunk-SNADUQSJ.js.map → chunk-CJK2IBI2.js.map} +1 -1
  49. package/dist/{chunk-DYPOL3CI.js → chunk-CJQ37JII.js} +1 -1
  50. package/dist/chunk-CJQ37JII.js.map +1 -0
  51. package/dist/chunk-D6YEHR5S.js +1 -0
  52. package/dist/chunk-D6YEHR5S.js.map +1 -0
  53. package/dist/{chunk-Z6XMXMVI.js → chunk-DBDCOHI4.js} +1 -1
  54. package/dist/chunk-DBDCOHI4.js.map +1 -0
  55. package/dist/{chunk-AFVYCQWL.js → chunk-DCB4COCL.js} +1 -1
  56. package/dist/{chunk-AFVYCQWL.js.map → chunk-DCB4COCL.js.map} +1 -1
  57. package/dist/{chunk-CJWFY6OX.js → chunk-DSMLYA2M.js} +1 -1
  58. package/dist/{chunk-CJWFY6OX.js.map → chunk-DSMLYA2M.js.map} +1 -1
  59. package/dist/{chunk-UXBCLFGU.js → chunk-DWRNXUAX.js} +1 -1
  60. package/dist/{chunk-UXBCLFGU.js.map → chunk-DWRNXUAX.js.map} +1 -1
  61. package/dist/chunk-EVW4Z4CB.js +1 -0
  62. package/dist/chunk-EVW4Z4CB.js.map +1 -0
  63. package/dist/{chunk-4S6WB7QR.js → chunk-FF2X4K5P.js} +1 -1
  64. package/dist/chunk-FF2X4K5P.js.map +1 -0
  65. package/dist/chunk-FYVPZBXN.js +1 -0
  66. package/dist/chunk-FYVPZBXN.js.map +1 -0
  67. package/dist/{chunk-QTZPA2FR.js → chunk-GLWPSVFV.js} +1 -1
  68. package/dist/chunk-GLWPSVFV.js.map +1 -0
  69. package/dist/chunk-GZYPQIO2.js +1 -0
  70. package/dist/chunk-GZYPQIO2.js.map +1 -0
  71. package/dist/chunk-H47K3UWG.js +1 -0
  72. package/dist/chunk-H47K3UWG.js.map +1 -0
  73. package/dist/chunk-JGOAQLYW.js +1 -0
  74. package/dist/chunk-JGOAQLYW.js.map +1 -0
  75. package/dist/{chunk-JWWYAMGD.js → chunk-MGRDB2BZ.js} +1 -1
  76. package/dist/{chunk-JWWYAMGD.js.map → chunk-MGRDB2BZ.js.map} +1 -1
  77. package/dist/{chunk-MKGJPVPS.js → chunk-MRTTQYT5.js} +1 -1
  78. package/dist/{chunk-MKGJPVPS.js.map → chunk-MRTTQYT5.js.map} +1 -1
  79. package/dist/chunk-MTJ4MS7W.js +1 -0
  80. package/dist/chunk-MTJ4MS7W.js.map +1 -0
  81. package/dist/chunk-NIURLW2F.js +1 -0
  82. package/dist/chunk-NIURLW2F.js.map +1 -0
  83. package/dist/chunk-OLKNYGGT.js +1 -0
  84. package/dist/chunk-OLKNYGGT.js.map +1 -0
  85. package/dist/chunk-OYFMHDYT.js +1 -0
  86. package/dist/chunk-OYFMHDYT.js.map +1 -0
  87. package/dist/chunk-OYR5HUQZ.js +1 -0
  88. package/dist/chunk-OYR5HUQZ.js.map +1 -0
  89. package/dist/chunk-PL75RTA2.js +1 -0
  90. package/dist/{chunk-2VPVZELZ.js.map → chunk-PL75RTA2.js.map} +1 -1
  91. package/dist/chunk-PY5L6WC5.js +1 -0
  92. package/dist/chunk-PY5L6WC5.js.map +1 -0
  93. package/dist/{chunk-W6EPHHTS.js → chunk-Q2L75GSI.js} +1 -1
  94. package/dist/chunk-Q2L75GSI.js.map +1 -0
  95. package/dist/chunk-QJ7GB6FF.js +1 -0
  96. package/dist/chunk-QJ7GB6FF.js.map +1 -0
  97. package/dist/chunk-QTAMQ6ME.js +1 -0
  98. package/dist/chunk-QTAMQ6ME.js.map +1 -0
  99. package/dist/{chunk-FMPRCYKY.js → chunk-RRYBSAPX.js} +1 -1
  100. package/dist/chunk-RRYBSAPX.js.map +1 -0
  101. package/dist/{chunk-J42ZXLBL.js → chunk-T62GO4AA.js} +1 -1
  102. package/dist/chunk-T62GO4AA.js.map +1 -0
  103. package/dist/{chunk-E3BRVGJJ.js → chunk-TBZJIQ5P.js} +1 -1
  104. package/dist/{chunk-E3BRVGJJ.js.map → chunk-TBZJIQ5P.js.map} +1 -1
  105. package/dist/chunk-V3AEUBHV.js +1 -0
  106. package/dist/chunk-V3AEUBHV.js.map +1 -0
  107. package/dist/chunk-VYDQHPY2.js +1 -0
  108. package/dist/chunk-VYDQHPY2.js.map +1 -0
  109. package/dist/chunk-XUHAPOM6.js +1 -0
  110. package/dist/chunk-XUHAPOM6.js.map +1 -0
  111. package/dist/chunk-Y6KJJMIM.js +1 -0
  112. package/dist/chunk-Y6KJJMIM.js.map +1 -0
  113. package/dist/chunk-YXPZ7QQB.js +1 -0
  114. package/dist/chunk-YXPZ7QQB.js.map +1 -0
  115. package/dist/{chunk-Y6UZWNP4.js → chunk-ZCEAPJDH.js} +1 -1
  116. package/dist/{chunk-Y6UZWNP4.js.map → chunk-ZCEAPJDH.js.map} +1 -1
  117. package/dist/commodities/commodities.d.ts +20 -10
  118. package/dist/commodities/commodities.js +1 -1
  119. package/dist/commodities/index.d.ts +15 -4
  120. package/dist/commodities/index.js +1 -1
  121. package/dist/equipment/index.js +1 -1
  122. package/dist/equipment/modification-costs.d.ts +2 -1
  123. package/dist/equipment/modification-costs.js.map +1 -1
  124. package/dist/equipment/modification-journal.js +1 -1
  125. package/dist/equipment/modifications.d.ts +2 -1
  126. package/dist/equipment/modifications.js +1 -1
  127. package/dist/equipment/suits.d.ts +6 -3
  128. package/dist/equipment/suits.js +1 -1
  129. package/dist/equipment/upgrade-costs.d.ts +8 -4
  130. package/dist/equipment/upgrade-costs.js +1 -1
  131. package/dist/equipment/upgrade-costs.js.map +1 -1
  132. package/dist/equipment/weapons.d.ts +13 -5
  133. package/dist/equipment/weapons.js +1 -1
  134. package/dist/i18n/blueprints.d.ts +6 -6
  135. package/dist/i18n/blueprints.js +1 -1
  136. package/dist/i18n/diagnostics.d.ts +1 -13
  137. package/dist/i18n/engineering-groups.d.ts +1 -0
  138. package/dist/i18n/engineering-groups.js +1 -1
  139. package/dist/i18n/experimental-effect-descriptions.d.ts +4 -3
  140. package/dist/i18n/experimental-effect-descriptions.js +1 -1
  141. package/dist/i18n/experimental-effects.d.ts +5 -4
  142. package/dist/i18n/experimental-effects.js +1 -1
  143. package/dist/i18n/index.d.ts +1 -13
  144. package/dist/i18n/index.js +1 -1
  145. package/dist/i18n/pre-engineered.d.ts +7 -6
  146. package/dist/i18n/pre-engineered.js +1 -1
  147. package/dist/materials/index.d.ts +16 -4
  148. package/dist/materials/index.js +1 -1
  149. package/dist/materials/materials.d.ts +36 -19
  150. package/dist/materials/materials.js +1 -1
  151. package/dist/materials/micro-resources.d.ts +18 -7
  152. package/dist/materials/micro-resources.js +1 -1
  153. package/dist/ships/armour.d.ts +20 -4
  154. package/dist/ships/armour.js +1 -1
  155. package/dist/ships/blueprint-costs.d.ts +20 -17
  156. package/dist/ships/blueprint-costs.js +1 -1
  157. package/dist/ships/blueprint-journal.d.ts +9 -8
  158. package/dist/ships/blueprint-journal.js +1 -1
  159. package/dist/ships/blueprints.d.ts +14 -12
  160. package/dist/ships/blueprints.js +1 -1
  161. package/dist/ships/build-metrics.d.ts +1061 -0
  162. package/dist/ships/build-metrics.js +1 -0
  163. package/dist/ships/build-metrics.js.map +1 -0
  164. package/dist/ships/distributor.d.ts +10 -3
  165. package/dist/ships/distributor.js +1 -1
  166. package/dist/ships/engineering-options.d.ts +8 -6
  167. package/dist/ships/engineering-options.js +1 -1
  168. package/dist/ships/engineering.d.ts +2 -16
  169. package/dist/ships/engineering.js +1 -1
  170. package/dist/ships/experimental-effect-costs.d.ts +5 -5
  171. package/dist/ships/experimental-effect-costs.js +1 -1
  172. package/dist/ships/experimental-effects.d.ts +9 -8
  173. package/dist/ships/experimental-effects.js +1 -1
  174. package/dist/ships/heat.d.ts +7 -2
  175. package/dist/ships/heat.js +1 -1
  176. package/dist/ships/index.d.ts +34 -22
  177. package/dist/ships/index.js +1 -1
  178. package/dist/ships/jump-range.d.ts +10 -3
  179. package/dist/ships/jump-range.js +1 -1
  180. package/dist/ships/loadout-calculations.d.ts +1 -1
  181. package/dist/ships/loadout-calculations.js +1 -1
  182. package/dist/ships/mobility-capacitor.d.ts +90 -0
  183. package/dist/ships/mobility-capacitor.js +1 -0
  184. package/dist/ships/mobility-capacitor.js.map +1 -0
  185. package/dist/ships/mobility.d.ts +29 -17
  186. package/dist/ships/mobility.js +1 -1
  187. package/dist/ships/power.d.ts +12 -5
  188. package/dist/ships/power.js +1 -1
  189. package/dist/ships/pre-engineered-stats.d.ts +10 -8
  190. package/dist/ships/pre-engineered-stats.js +1 -1
  191. package/dist/ships/pre-engineered.d.ts +6 -6
  192. package/dist/ships/pre-engineered.js +1 -1
  193. package/dist/ships/resistances.d.ts +2 -2
  194. package/dist/ships/resistances.js +1 -1
  195. package/dist/ships/shield-capacitor.d.ts +133 -0
  196. package/dist/ships/shield-capacitor.js +1 -0
  197. package/dist/ships/shield-capacitor.js.map +1 -0
  198. package/dist/ships/shield-recovery.d.ts +16 -2
  199. package/dist/ships/shield-recovery.js +1 -1
  200. package/dist/ships/shields.d.ts +86 -28
  201. package/dist/ships/shields.js +1 -1
  202. package/dist/ships/ship-loadout.d.ts +91 -797
  203. package/dist/ships/ship-loadout.js +1 -1
  204. package/dist/ships/ships.d.ts +7 -6
  205. package/dist/ships/ships.js +1 -1
  206. package/dist/ships/slef.d.ts +1 -1
  207. package/dist/ships/source-purchase.d.ts +2 -1
  208. package/dist/ships/source-purchase.js +1 -1
  209. package/dist/ships/weapons-capacitor.d.ts +10 -3
  210. package/dist/ships/weapons-capacitor.js +1 -1
  211. package/dist/ships/weapons.d.ts +22 -6
  212. package/dist/ships/weapons.js +1 -1
  213. package/dist/{system-address-DYsN1qOT.d.ts → system-address-cyJaeZIS.d.ts} +2 -1
  214. package/package.json +17 -2
  215. package/dist/chunk-2FHHMYDC.js +0 -1
  216. package/dist/chunk-2FHHMYDC.js.map +0 -1
  217. package/dist/chunk-2TW4ZBI3.js +0 -1
  218. package/dist/chunk-2TW4ZBI3.js.map +0 -1
  219. package/dist/chunk-2VPVZELZ.js +0 -1
  220. package/dist/chunk-3BM5BHI3.js +0 -1
  221. package/dist/chunk-3BM5BHI3.js.map +0 -1
  222. package/dist/chunk-4S6WB7QR.js.map +0 -1
  223. package/dist/chunk-6BO5JJNI.js +0 -1
  224. package/dist/chunk-6BO5JJNI.js.map +0 -1
  225. package/dist/chunk-CX7B67OI.js +0 -1
  226. package/dist/chunk-CX7B67OI.js.map +0 -1
  227. package/dist/chunk-DVL5RBKX.js +0 -1
  228. package/dist/chunk-DVL5RBKX.js.map +0 -1
  229. package/dist/chunk-DYPOL3CI.js.map +0 -1
  230. package/dist/chunk-FGXWVFN6.js +0 -1
  231. package/dist/chunk-FGXWVFN6.js.map +0 -1
  232. package/dist/chunk-FMPRCYKY.js.map +0 -1
  233. package/dist/chunk-G3265B27.js +0 -1
  234. package/dist/chunk-G3265B27.js.map +0 -1
  235. package/dist/chunk-GQ5GX5TB.js.map +0 -1
  236. package/dist/chunk-IOJXLDJN.js +0 -1
  237. package/dist/chunk-IOJXLDJN.js.map +0 -1
  238. package/dist/chunk-IYU4WLFM.js +0 -1
  239. package/dist/chunk-IYU4WLFM.js.map +0 -1
  240. package/dist/chunk-J42ZXLBL.js.map +0 -1
  241. package/dist/chunk-JPBMRJFC.js.map +0 -1
  242. package/dist/chunk-LJI7VXJD.js +0 -1
  243. package/dist/chunk-LJI7VXJD.js.map +0 -1
  244. package/dist/chunk-OCND33TO.js +0 -1
  245. package/dist/chunk-OCND33TO.js.map +0 -1
  246. package/dist/chunk-P2QOL63K.js +0 -1
  247. package/dist/chunk-P2QOL63K.js.map +0 -1
  248. package/dist/chunk-Q3QCLNVG.js.map +0 -1
  249. package/dist/chunk-QTZPA2FR.js.map +0 -1
  250. package/dist/chunk-RLUS76LZ.js +0 -1
  251. package/dist/chunk-RLUS76LZ.js.map +0 -1
  252. package/dist/chunk-TEOJCBSG.js +0 -1
  253. package/dist/chunk-TEOJCBSG.js.map +0 -1
  254. package/dist/chunk-TMMGS6TC.js +0 -1
  255. package/dist/chunk-TMMGS6TC.js.map +0 -1
  256. package/dist/chunk-W6EPHHTS.js.map +0 -1
  257. package/dist/chunk-Z6XMXMVI.js.map +0 -1
  258. package/dist/chunk-ZNCXENNB.js +0 -1
  259. package/dist/chunk-ZNCXENNB.js.map +0 -1
  260. /package/dist/{chunk-6EUVIZAS.js.map → chunk-4QYTVSNR.js.map} +0 -0
  261. /package/dist/{chunk-6EPYVBAX.js.map → chunk-A6OINYNP.js.map} +0 -0
@@ -0,0 +1 @@
1
+ export{BuildMetrics}from"../chunk-PY5L6WC5.js"; //# sourceMappingURL=build-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"O"}
@@ -5,8 +5,8 @@
5
5
  * and WEP use the same non-linear allocation curve:
6
6
  * `ratedRecharge * (pips / 4) ^ 1.1`.
7
7
  *
8
- * This module is data-free. {@link ShipLoadout.distributorMetrics}
9
- * (`./ship-loadout`) resolves the powered distributor in a build for you.
8
+ * This module is data-free. {@link BuildMetrics.distributorMetrics}
9
+ * (`./build-metrics`) resolves the powered distributor in a build for you.
10
10
  *
11
11
  * @remarks
12
12
  * The SYS and WEP curves follow EDCD/Coriolis; the ENG curve is cross-checked
@@ -54,7 +54,14 @@ interface DistributorPips {
54
54
  /** Pips assigned to WEP, in `[0, 4]`. */
55
55
  readonly weapons: number;
56
56
  }
57
- /** All three capacitor figures for one power distributor and pip allocation. */
57
+ /**
58
+ * All three capacitor figures for one power distributor and pip allocation.
59
+ *
60
+ * @remarks
61
+ * Frozen — nested records and lists included — so a result can be held, cached and
62
+ * shared without a defensive copy. Derive a changed figure with a spread rather than
63
+ * by assigning into one.
64
+ */
58
65
  interface DistributorMetrics {
59
66
  /** SYS-capacitor capacity and recharge. */
60
67
  readonly systems: DistributorCapacitorMetrics;
@@ -1 +1 @@
1
- export{distributorMetrics}from"../chunk-P2QOL63K.js"; //# sourceMappingURL=distributor.js.map
1
+ export{distributorMetrics}from"../chunk-YXPZ7QQB.js"; //# sourceMappingURL=distributor.js.map
@@ -114,6 +114,7 @@ declare const ENGINEERING_OPTION_GROUPS: Readonly<Record<EngineeringGroupId, Eng
114
114
  * Accelerator, which upstream denies every blueprint.
115
115
  *
116
116
  * @param symbol - A module symbol, e.g. `"Hpt_BeamLaser_Fixed_Small"`.
117
+ * Leading/trailing whitespace and case are ignored.
117
118
  * @returns The group id, or `null` when the module is not in the catalogue.
118
119
  *
119
120
  * @throws {TypeError} If `symbol` is present and not a string. A nullish
@@ -156,7 +157,7 @@ declare function getEngineeringGroup(symbol: string): EngineeringGroupId | null;
156
157
  * Guardian weapons as well as modules — every group here lists that id, and `BLUEPRINTS`
157
158
  * keys the recipe under it alone.
158
159
  *
159
- * @param symbol - A module symbol.
160
+ * @param symbol - A module symbol. Leading/trailing whitespace and case are ignored.
160
161
  * @returns Blueprint ids, sorted. Join to `BLUEPRINTS`.
161
162
  *
162
163
  * @throws {TypeError} If `symbol` is present and not a string. A nullish
@@ -188,7 +189,7 @@ declare function getBlueprintsForModule(symbol: string): readonly string[];
188
189
  * and every Guardian group, weapons and modules alike. An ungrouped module answers empty
189
190
  * too; {@link getEngineeringGroup} tells the two apart.
190
191
  *
191
- * @param symbol - A module symbol.
192
+ * @param symbol - A module symbol. Leading/trailing whitespace and case are ignored.
192
193
  * @returns Experimental-effect ids. Join to `EXPERIMENTAL_EFFECTS`.
193
194
  *
194
195
  * @throws {TypeError} If `symbol` is present and not a string. A nullish
@@ -229,12 +230,13 @@ declare function getExperimentalsForModule(symbol: string): readonly string[];
229
230
  * that is the exact answer rather
230
231
  * than a miss: it has no experimental slot, on any of the nine groups that offer it.
231
232
  *
232
- * @param fdname - A blueprint recipe `fdname`, e.g. `"Weapon_Efficient"`.
233
+ * @param blueprintSymbol - A blueprint recipe's Frontier symbol, e.g. `"Weapon_Efficient"`.
234
+ * Leading/trailing whitespace and case are ignored.
233
235
  * @returns Experimental-effect ids, sorted and de-duplicated; empty when no group names
234
236
  * the blueprint, or when its groups take no experimental.
235
237
  *
236
- * @throws {TypeError} If `fdname` is present and not a string. A nullish
237
- * `fdname` is a miss, answered the way an unrecognised one is.
238
+ * @throws {TypeError} If `blueprintSymbol` is present and not a string. A nullish
239
+ * `blueprintSymbol` is a miss, answered the way an unrecognised one is.
238
240
  * @example
239
241
  * ```ts
240
242
  * import { getExperimentalsForBlueprint } from '@elite-dangerous-almanac/core/ships/engineering-options';
@@ -243,6 +245,6 @@ declare function getExperimentalsForModule(symbol: string): readonly string[];
243
245
  * // -> ['special_fsd_cooled', 'special_fsd_fuelcapacity', 'special_fsd_heavy', ...]
244
246
  * ```
245
247
  */
246
- declare function getExperimentalsForBlueprint(fdname: string): readonly string[];
248
+ declare function getExperimentalsForBlueprint(blueprintSymbol: string): readonly string[];
247
249
 
248
250
  export { ENGINEERING_OPTION_GROUPS, type EngineeringGroupId, type EngineeringOptionGroup, getBlueprintsForModule, getEngineeringGroup, getExperimentalsForBlueprint, getExperimentalsForModule };
@@ -1 +1 @@
1
- export{ENGINEERING_OPTION_GROUPS,getBlueprintsForModule,getEngineeringGroup,getExperimentalsForBlueprint,getExperimentalsForModule}from"../chunk-QTZPA2FR.js"; //# sourceMappingURL=engineering-options.js.map
1
+ export{ENGINEERING_OPTION_GROUPS,getBlueprintsForModule,getEngineeringGroup,getExperimentalsForBlueprint,getExperimentalsForModule}from"../chunk-GLWPSVFV.js"; //# sourceMappingURL=engineering-options.js.map
@@ -156,7 +156,7 @@ type BlueprintGrades = Readonly<Record<string, BlueprintGrade>>;
156
156
  * One engineering blueprint — its in-game display name and its per-grade data.
157
157
  *
158
158
  * @remarks
159
- * A blueprint is keyed in {@link BLUEPRINTS} by its Frontier `fdname`; this is the record
159
+ * A blueprint is keyed in {@link BLUEPRINTS} by its Frontier symbol; this is the record
160
160
  * that key maps to. Each member of `grades` carries modifier `features` and an optional
161
161
  * converted damage distribution (a blueprint need not define every grade `1`–`5`). A
162
162
  * journal id shared by two recipes is resolved against the fitted module by
@@ -194,20 +194,6 @@ interface Blueprint {
194
194
  * @throws {RangeError} If `quality` is not a finite number in `[0, 1]`.
195
195
  */
196
196
  declare function computeModifiers(base: Readonly<Record<string, number>>, grade: BlueprintGrade | readonly BlueprintFeature[], quality?: number, experimental?: ExperimentalEffect | readonly ExperimentalContribution[]): EngineeringModifier[];
197
- /**
198
- * The number of engineering rolls to complete a single blueprint grade: grade `N` takes
199
- * `N` rolls (grade 1 → 1 roll, grade 2 → 2 rolls, … grade 5 → 5 rolls). Each roll at a
200
- * grade consumes that grade's cost, so the total to engineer a module *up to* a
201
- * grade is the running sum of `rollsForGrade(g) ·` (grade `g`'s cost) for every
202
- * grade `g` up to the target — what
203
- * {@link ships/blueprint-costs!getBlueprintCost | getBlueprintCost} computes, for the
204
- * materials and the Merc Coin alike.
205
- *
206
- * @param grade - The blueprint grade, `1`–`5`.
207
- * @returns The rolls to complete that grade (equal to the grade number).
208
- * @throws {RangeError} If `grade` is not an integer from 1 through 5.
209
- */
210
- declare function rollsForGrade(grade: number): number;
211
197
  /**
212
198
  * Combine several material lists into one, summing the counts of any material that
213
199
  * appears in more than one list (matched by `symbol`, case-insensitively). Use it to
@@ -231,4 +217,4 @@ declare function rollsForGrade(grade: number): number;
231
217
  */
232
218
  declare function sumMaterials(...lists: readonly (readonly EngineeringMaterial[])[]): EngineeringMaterial[];
233
219
 
234
- export { type Blueprint, type BlueprintFeature, type BlueprintGrade, type BlueprintGrades, type EngineeringMaterial, type ExperimentalContribution, type ExperimentalEffect, type ModifierMethod, computeModifiers, rollsForGrade, sumMaterials };
220
+ export { type Blueprint, type BlueprintFeature, type BlueprintGrade, type BlueprintGrades, type EngineeringMaterial, type ExperimentalContribution, type ExperimentalEffect, type ModifierMethod, computeModifiers, sumMaterials };
@@ -1 +1 @@
1
- export{computeModifiers,rollsForGrade,sumMaterials}from"../chunk-DYPOL3CI.js";//# sourceMappingURL=engineering.js.map
1
+ export{computeModifiers,sumMaterials}from"../chunk-CJQ37JII.js";//# sourceMappingURL=engineering.js.map
@@ -20,7 +20,7 @@ import './slots.js';
20
20
  */
21
21
 
22
22
  /**
23
- * Every experimental effect's one-application material list, keyed by Frontier `fdname`.
23
+ * Every experimental effect's one-application material list, keyed by Frontier symbol.
24
24
  *
25
25
  * @remarks
26
26
  * Its ids exactly match `EXPERIMENTAL_EFFECTS` from `ships/experimental-effects`. The
@@ -44,11 +44,11 @@ declare const EXPERIMENTAL_EFFECT_COSTS: Readonly<Record<string, readonly Engine
44
44
  * 25 blueprints whose {@link ships/blueprint-costs!getBlueprintCost | getBlueprintCost}
45
45
  * reports a non-zero `mercCoins`.
46
46
  *
47
- * @param fdname - The effect id, e.g. `"special_fsd_heavy"`, matched
47
+ * @param experimentalEffectSymbol - The effect id, e.g. `"special_fsd_heavy"`, matched
48
48
  * case-insensitively after trimming surrounding whitespace.
49
49
  * @returns The frozen material list, or `null` if the effect is unknown.
50
- * @throws {TypeError} If `fdname` is present and not a string. A nullish
51
- * `fdname` is a miss, answered the way an unrecognised one is.
50
+ * @throws {TypeError} If `experimentalEffectSymbol` is present and not a string. A nullish
51
+ * `experimentalEffectSymbol` is a miss, answered the way an unrecognised one is.
52
52
  * @example
53
53
  * ```ts
54
54
  * import { getExperimentalEffectCost } from '@elite-dangerous-almanac/core/ships/experimental-effect-costs';
@@ -57,6 +57,6 @@ declare const EXPERIMENTAL_EFFECT_COSTS: Readonly<Record<string, readonly Engine
57
57
  * // -> [{ symbol: 'DisruptedWakeEchoes', ... }, ...]
58
58
  * ```
59
59
  */
60
- declare function getExperimentalEffectCost(fdname: string): readonly EngineeringMaterial[] | null;
60
+ declare function getExperimentalEffectCost(experimentalEffectSymbol: string): readonly EngineeringMaterial[] | null;
61
61
 
62
62
  export { EXPERIMENTAL_EFFECT_COSTS, getExperimentalEffectCost };
@@ -1 +1 @@
1
- export{EXPERIMENTAL_EFFECT_COSTS,getExperimentalEffectCost}from"../chunk-SNADUQSJ.js"; //# sourceMappingURL=experimental-effect-costs.js.map
1
+ export{EXPERIMENTAL_EFFECT_COSTS,getExperimentalEffectCost}from"../chunk-CJK2IBI2.js"; //# sourceMappingURL=experimental-effect-costs.js.map
@@ -7,7 +7,7 @@ import './slots.js';
7
7
 
8
8
  /**
9
9
  * The **experimental-effect mechanics catalogue** — each engineering special effect's
10
- * stat modifiers and qualitative behavior, keyed by the effect's Frontier `fdname` (as it
10
+ * stat modifiers and qualitative behavior, keyed by the effect's Frontier symbol (as it
11
11
  * appears in a journal `Loadout` event's `Engineering.ExperimentalEffect`).
12
12
  *
13
13
  * Its own module (and data file) so consumers who never engineer a build do not bundle
@@ -18,7 +18,7 @@ import './slots.js';
18
18
  * `ships/experimental-effect-costs`, so applying an effect does not bundle what it costs —
19
19
  * though `ShipLoadout` carries both, since it prices a build as well as engineering one.
20
20
  *
21
- * Keys are Frontier `fdname`s — the exact strings a journal `Loadout` event carries in
21
+ * Keys are Frontier symbols — the exact strings a journal `Loadout` event carries in
22
22
  * `Engineering.ExperimentalEffect` (e.g. `"special_fsd_heavy"`), not the in-game
23
23
  * display names. Enumerate the available effects with `Object.keys(EXPERIMENTAL_EFFECTS)`.
24
24
  *
@@ -29,7 +29,7 @@ import './slots.js';
29
29
  */
30
30
 
31
31
  /**
32
- * Every experimental effect, keyed by Frontier `fdname` (e.g. `"special_fsd_heavy"`).
32
+ * Every experimental effect, keyed by Frontier symbol (e.g. `"special_fsd_heavy"`).
33
33
  * Each carries its `modifiers` (stat contributions), optional damage conversion, and
34
34
  * optional qualitative description.
35
35
  *
@@ -43,13 +43,14 @@ import './slots.js';
43
43
  */
44
44
  declare const EXPERIMENTAL_EFFECTS: Readonly<Record<string, ExperimentalEffect>>;
45
45
  /**
46
- * Look up an experimental effect by its Frontier `fdname`, case-insensitively.
46
+ * Look up an experimental effect by its Frontier symbol, case-insensitively.
47
47
  *
48
- * @param fdname - The effect id, e.g. `"special_fsd_heavy"`.
48
+ * @param experimentalEffectSymbol - The effect id, e.g. `"special_fsd_heavy"`. Leading/trailing
49
+ * whitespace and case are ignored.
49
50
  * @returns The effect record — its display `name`, modifier contributions, optional
50
51
  * `damageDistribution`, and optional qualitative description — or `null` if unknown.
51
- * @throws {TypeError} If `fdname` is present and not a string. A nullish
52
- * `fdname` is a miss, answered the way an unrecognised one is.
52
+ * @throws {TypeError} If `experimentalEffectSymbol` is present and not a string. A nullish
53
+ * `experimentalEffectSymbol` is a miss, answered the way an unrecognised one is.
53
54
  * @example
54
55
  * ```ts
55
56
  * import { getExperimentalEffect } from '@elite-dangerous-almanac/core/ships/experimental-effects';
@@ -59,6 +60,6 @@ declare const EXPERIMENTAL_EFFECTS: Readonly<Record<string, ExperimentalEffect>>
59
60
  * effect?.modifiers; // -> [{ label: 'Integrity', ... }, ...]
60
61
  * ```
61
62
  */
62
- declare function getExperimentalEffect(fdname: string): ExperimentalEffect | null;
63
+ declare function getExperimentalEffect(experimentalEffectSymbol: string): ExperimentalEffect | null;
63
64
 
64
65
  export { EXPERIMENTAL_EFFECTS, getExperimentalEffect };
@@ -1 +1 @@
1
- export{EXPERIMENTAL_EFFECTS,getExperimentalEffect}from"../chunk-JPBMRJFC.js"; //# sourceMappingURL=experimental-effects.js.map
1
+ export{EXPERIMENTAL_EFFECTS,getExperimentalEffect}from"../chunk-77I24V6B.js"; //# sourceMappingURL=experimental-effects.js.map
@@ -21,8 +21,8 @@
21
21
  * else: it is thermal inertia, not a budget.
22
22
  *
23
23
  * This module is data-free — hand {@link heatMetrics} a hull's two heat stats, the
24
- * plant's efficiency and the build's draw. {@link ShipLoadout.heatMetrics} (in
25
- * `./ship-loadout`) reads all of that off a build, post-engineering, for you.
24
+ * plant's efficiency and the build's draw. {@link BuildMetrics.heatMetrics} (in
25
+ * `./build-metrics`) reads all of that off a build, post-engineering, for you.
26
26
  *
27
27
  * Two heat sources stand outside the scenarios reported here, both of them momentary
28
28
  * rather than sustained, and they are not interchangeable with the figures above:
@@ -194,6 +194,11 @@ interface HeatState {
194
194
  /**
195
195
  * A build's heat: what the plant and the hull make of each other, and what the build
196
196
  * runs at stowed, flying, jumping and firing.
197
+ *
198
+ * @remarks
199
+ * Frozen — nested records and lists included — so a result can be held, cached and
200
+ * shared without a defensive copy. Derive a changed figure with a spread rather than
201
+ * by assigning into one.
197
202
  */
198
203
  interface HeatMetrics {
199
204
  /** The fitted plant's heat efficiency, post-engineering. */
@@ -1 +1 @@
1
- export{OVERHEAT_HEAT_LEVEL,effectiveWeaponThermalLoad,equilibriumHeatLevel,heatLevelAtTime,heatMetrics,secondsToHeatLevel}from"../chunk-W6EPHHTS.js";//# sourceMappingURL=heat.js.map
1
+ export{OVERHEAT_HEAT_LEVEL,effectiveWeaponThermalLoad,equilibriumHeatLevel,heatLevelAtTime,heatMetrics,secondsToHeatLevel}from"../chunk-Q2L75GSI.js";//# sourceMappingURL=heat.js.map
@@ -9,13 +9,15 @@
9
9
  * export ({@link ShipLoadout.fromSlef}) or a journal `Loadout` event
10
10
  * ({@link ShipLoadout.fromLoadout}), writes either back out
11
11
  * ({@link ShipLoadout.toSlefString}, {@link ShipLoadout.toLoadoutEvent}), fits modules
12
- * and applies engineering, and answers the questions apps actually ask
13
- * ({@link ShipLoadout.maxJumpRange}, {@link ShipLoadout.powerBudget},
14
- * {@link ShipLoadout.shieldMetrics}, `unladenMass`, `rebuy`) keeping what a capture
15
- * said it *paid* apart from what the build is worth at retail
16
- * ({@link ShipLoadout.sourcePurchase}). It is the batteries-included facade and pulls in
17
- * every catalogue; everything below is what it is built from, so drop to the pieces when
18
- * you need one answer rather than a whole ship.
12
+ * and applies engineering, and carries the figures a capture stated (`unladenMass`,
13
+ * `rebuy`) keeping what a capture said it *paid* apart from what the build is worth at
14
+ * retail ({@link ShipLoadout.sourcePurchase}). **{@link BuildMetrics} is the other
15
+ * half**: `BuildMetrics.of(build)` answers the questions apps actually ask
16
+ * ({@link BuildMetrics.maxJumpRange}, {@link BuildMetrics.powerBudget},
17
+ * {@link BuildMetrics.shieldMetrics}), so an editor need not import the calculations nor
18
+ * a viewer the editors. Together they are the batteries-included facade and pull in
19
+ * every catalogue; everything below is what they are built from, so drop to the pieces
20
+ * when you need one answer rather than a whole ship.
19
21
  *
20
22
  * The area has five layers:
21
23
  *
@@ -45,8 +47,11 @@
45
47
  * data-free module: {@link powerBudget}, {@link shieldMetrics} and
46
48
  * {@link armourMetrics} (with {@link stackShieldResistance} /
47
49
  * {@link stackArmourResistance} behind their resistances), {@link weaponMetrics},
48
- * {@link distributorMetrics}, {@link weaponsCapacitorMetrics},
49
- * {@link ammunitionCapacity} and {@link heatMetrics}.
50
+ * {@link mobilityMetrics}, {@link shieldRecovery}, {@link distributorMetrics},
51
+ * {@link ammunitionCapacity} and {@link heatMetrics}. A pip allocation is always a
52
+ * separate call over the bare figure, one entry point per capacitor:
53
+ * {@link shieldCapacitorMetrics} for SYS, {@link mobilityCapacitorMetrics} for ENG
54
+ * and {@link weaponsCapacitorMetrics} for WEP.
50
55
  * - **Engineering** — {@link computeModifiers} applies the primitive legs of a
51
56
  * {@link BLUEPRINTS} recipe and an {@link EXPERIMENTAL_EFFECTS} entry;
52
57
  * {@link ShipLoadout.applyBlueprint} presents that result under Frontier's journal
@@ -57,16 +62,18 @@
57
62
  * {@link ships/blueprint-costs!BLUEPRINT_COSTS | blueprint-costs} and
58
63
  * {@link ships/experimental-effect-costs!EXPERIMENTAL_EFFECT_COSTS | experimental-effect-costs}
59
64
  * subpaths, so a consumer can price one recipe without the mechanics — and the facade
60
- * carries them, since {@link ShipLoadout.buildCost} prices a whole build. A blueprint
65
+ * carries them, since {@link BuildMetrics.buildCost} prices a whole build. A blueprint
61
66
  * cost carries both halves of what a climb takes: the materials and the Merc Coin 25 of
62
67
  * the recipes charge beside them.
63
68
  *
64
69
  * The registries use two distinct Frontier identity spaces. `symbol` identifies an
65
70
  * item — a hull, module, material, micro-resource or commodity — and is what item and
66
- * journal `Item` lookups accept. Engineering catalogues instead use `fdname` to identify
67
- * a recipe, effect or fixed variant, which is what the journal writes in
68
- * `Engineering.BlueprintName` and `Engineering.ExperimentalEffect`; the few colliding
69
- * blueprint aliases are resolved for their module by {@link resolveBlueprintForModule}.
71
+ * journal `Item` lookups accept. Engineering catalogues carry ids of their own:
72
+ * `blueprintSymbol` names a recipe, a fixed variant's identity included, and
73
+ * `experimentalEffectSymbol` names an effect. Those two are what the journal writes in
74
+ * `Engineering.BlueprintName` and `Engineering.ExperimentalEffect` respectively; the few
75
+ * colliding blueprint aliases are resolved for their module by
76
+ * {@link resolveBlueprintForModule}.
70
77
  * Pre-engineered variants are found from the base module's `symbol` with
71
78
  * {@link getPreEngineeredVariants}.
72
79
  *
@@ -89,17 +96,18 @@
89
96
  * pulls in every catalogue.
90
97
  *
91
98
  * ```ts
99
+ * import { BuildMetrics } from '@elite-dangerous-almanac/core/ships/build-metrics';
92
100
  * import { ShipLoadout } from '@elite-dangerous-almanac/core/ships/ship-loadout';
93
101
  * import type { LoadoutEvent } from '@elite-dangerous-almanac/core/ships/slef';
94
102
  *
95
103
  * declare const event: LoadoutEvent;
96
104
  *
97
105
  * // Figures below are one build's — a Krait Phantom explorer.
98
- * const build = ShipLoadout.fromLoadout(event);
99
- * build.maxJumpRange(); // -> 60.5478 (ly)
100
- * build.powerBudget().withinBudget; // -> true
101
- * build.shieldMetrics()?.strength; // -> 743.12 (MJ)
102
- * build.weaponMetrics().total.damagePerSecond; // -> 34
106
+ * const metrics = BuildMetrics.of(ShipLoadout.fromLoadout(event));
107
+ * metrics.maxJumpRange(); // -> 60.5478 (ly)
108
+ * metrics.powerBudget().withinBudget; // -> true
109
+ * metrics.shieldMetrics()?.strength; // -> 743.12 (MJ)
110
+ * metrics.weaponMetrics().total.damagePerSecond; // -> 34
103
111
  * ```
104
112
  *
105
113
  * @example
@@ -122,7 +130,8 @@
122
130
  * @example
123
131
  * **The data-free layer.** Each calculation is its own module over plain constants, so
124
132
  * it costs nothing but the function — no catalogue, no build. `./power`, `./shields`,
125
- * `./armour`, `./weapons`, `./ammunition` and `./resistances` are the same shape.
133
+ * `./shield-capacitor`, `./armour`, `./weapons`, `./weapons-capacitor`, `./mobility`,
134
+ * `./mobility-capacitor`, `./ammunition` and `./resistances` are the same shape.
126
135
  *
127
136
  * ```ts
128
137
  * import { singleJumpRange } from '@elite-dangerous-almanac/core/ships/jump-range';
@@ -146,14 +155,17 @@ export { FrameShiftDriveJumpStats, MassCurveStats, PowerDistributorStats, PowerG
146
155
  export { OUTFITTING_FAMILIES, OutfittingFamilyId } from './module-families.js';
147
156
  export { BlueprintModuleEngineering, EngineeringModifier, LoadoutEvent, LoadoutModule, ModuleEngineering, Slef, SlefConstraint, SlefDiagnostic, SlefDiagnosticCode, SlefEntry, SlefHeader, SlefInspection, SlefStringifyOptions, getLoadoutModifier, inspectSlef, parseSlef, stringifySlef, toSlef } from './slef.js';
148
157
  export { FrameShiftDriveParams, TotalRangeDetails, frameShiftDriveMassFactor, fuelPerJump, singleJumpRange, totalRange } from './jump-range.js';
149
- export { ApplyBlueprintOptions, AvailableBlueprint, BuildCost, BuildCredits, BuildMass, BuildWeaponMetrics, DefenceOptions, DistributorOptions, EngineeringNormalizationCode, EngineeringNormalizationResult, EngineeringNormalizationUnchanged, EngineeringNormalizationUnsupported, EngineeringNormalized, ExperimentalEffectMutationCode, ExperimentalEffectMutationResult, ExperimentalEffectUnchanged, ExperimentalEffectUnsupported, ExperimentalEffectUpdated, FittedModule, FittedWeaponMetrics, FixedMountRepairResult, ImmovableReason, JumpOptions, JumpRangeSummary, LoadoutEditError, LoadoutEditErrorCode, LoadoutExportOptions, LoadoutImportOutcome, LoadoutSlot, MobilityOptions, ShipLoadout, SlefExportOptions, StandardLoad, StandardLoadInputs, WeaponsOptions } from './ship-loadout.js';
158
+ export { ApplyBlueprintOptions, AvailableBlueprint, EngineeringNormalizationCode, EngineeringNormalizationResult, EngineeringNormalizationUnchanged, EngineeringNormalizationUnsupported, EngineeringNormalized, ExperimentalEffectMutationCode, ExperimentalEffectMutationResult, ExperimentalEffectUnchanged, ExperimentalEffectUnsupported, ExperimentalEffectUpdated, FittedModule, FixedMountRepairResult, ImmovableReason, LoadoutEditError, LoadoutEditErrorCode, LoadoutExportOptions, LoadoutImportOutcome, LoadoutSlot, ShipLoadout, SlefExportOptions } from './ship-loadout.js';
159
+ export { BuildCost, BuildCredits, BuildMass, BuildMetrics, BuildWeaponMetrics, DistributorOptions, FittedWeaponMetrics, JumpOptions, JumpRangeSummary, MobilityCapacitorOptions, ShieldCapacitorOptions, ShieldRecoveryOptions, StandardLoad, StandardLoadInputs, WeaponsOptions } from './build-metrics.js';
150
160
  export { CalculationIssue, CalculationIssueReason, CalculationResult, FuelCapacity, LoadoutCalculationModule, calculateCargoCapacity, calculateFuelCapacity, calculateUnladenMass } from './loadout-calculations.js';
151
161
  export { LoadoutIssue, LoadoutIssueCode, LoadoutIssueParam, LoadoutIssueParams, LoadoutValidation, LoadoutValidationInput, ModuleFitConstraint, ValidationModule, validateLoadout } from './loadout-validation.js';
152
162
  export { SourceModuleValue, SourcePurchaseRecord, getSourceModuleValue, sourcePurchaseFromLoadout, sumSourceModuleValues } from './source-purchase.js';
153
163
  export { PowerBand, PowerBudget, PowerConsumer, PowerConsumerResult, powerBudget } from './power.js';
154
164
  export { DamageResistanceParams, DamageResistances, DamageType, DamageTypeValues, effectiveHitPoints, mapDamageTypes, stackArmourResistance, stackShieldResistance, systemsResistance } from './resistances.js';
155
165
  export { ShieldBoosterParams, ShieldGeneratorParams, ShieldInput, ShieldMetrics, shieldMassCurveMultiplier, shieldMetrics, shieldStrength } from './shields.js';
166
+ export { ShieldCapacitorInput, ShieldCapacitorMetrics, shieldCapacitorMetrics } from './shield-capacitor.js';
156
167
  export { MobilityInput, MobilityMetrics, ThrusterCurveParams, ThrusterParams, mobilityMetrics, thrusterMassCurveMultiplier } from './mobility.js';
168
+ export { MobilityCapacitorInput, MobilityCapacitorMetrics, mobilityCapacitorMetrics } from './mobility-capacitor.js';
157
169
  export { CellBankInput, CellBankMetrics, CellBankSummary, ShieldRecovery, ShieldRecoveryInput, cellBankSummary, shieldRecovery } from './shield-recovery.js';
158
170
  export { ArmourInput, ArmourMetrics, BulkheadParams, HullReinforcementParams, ModuleReinforcementParams, armourMetrics } from './armour.js';
159
171
  export { DamageSplit, WeaponMetrics, WeaponStats, WeaponTotals, armourPiercingFactor, combinedRateOfFire, damageFalloff, damagePerSecond, energyPerSecond, heatPerSecond, splitDamage, sumWeaponMetrics, sustainedDamagePerSecond, sustainedFireFactor, weaponMetrics } from './weapons.js';
@@ -162,7 +174,7 @@ export { WeaponsCapacitorInput, WeaponsCapacitorMetrics, weaponsCapacitorMetrics
162
174
  export { AmmunitionCapacity, AmmunitionStats, ammunitionCapacity } from './ammunition.js';
163
175
  export { HeatInput, HeatMetrics, HeatState, HeatWeapon, OVERHEAT_HEAT_LEVEL, effectiveWeaponThermalLoad, equilibriumHeatLevel, heatLevelAtTime, heatMetrics, secondsToHeatLevel } from './heat.js';
164
176
  export { BuildSlot, BuildSlotBase, CoreBuildSlot, CoreSlotType, CoreSlots, HardpointBuildSlot, HardpointRestriction, HardpointSlotSpec, ModuleSlot, OptionalBuildSlot, OptionalRestriction, OptionalSlotSpec, ParsedSlot, SLOT_RESTRICTION_LABELS, ShipSlots, SimpleBuildSlot, SlotKind, SlotRestriction, enumerateSlots, parseSlotName } from './slots.js';
165
- export { Blueprint, BlueprintFeature, BlueprintGrade, BlueprintGrades, EngineeringMaterial, ExperimentalContribution, ExperimentalEffect, ModifierMethod, computeModifiers, rollsForGrade, sumMaterials } from './engineering.js';
177
+ export { Blueprint, BlueprintFeature, BlueprintGrade, BlueprintGrades, EngineeringMaterial, ExperimentalContribution, ExperimentalEffect, ModifierMethod, computeModifiers, sumMaterials } from './engineering.js';
166
178
  export { BLUEPRINTS, getBlueprint, getBlueprintGrade } from './blueprints.js';
167
179
  export { EXPERIMENTAL_EFFECTS, getExperimentalEffect } from './experimental-effects.js';
168
180
  export { ENGINEERING_OPTION_GROUPS, EngineeringGroupId, EngineeringOptionGroup, getBlueprintsForModule, getEngineeringGroup, getExperimentalsForBlueprint, getExperimentalsForModule } from './engineering-options.js';
@@ -1 +1 @@
1
- export{LoadoutEditError,ShipLoadout}from"../chunk-3BM5BHI3.js";export{weaponsCapacitorMetrics}from"../chunk-FMPRCYKY.js";export{cellBankSummary,shieldRecovery}from"../chunk-VZZUNSDF.js";export{shieldMassCurveMultiplier,shieldMetrics,shieldStrength}from"../chunk-2FHHMYDC.js";export{SHIPS,getShipByName,getShipBySymbol,getShipSlots}from"../chunk-WNGQ3IAM.js";export{getLoadoutModifier,inspectSlef,parseSlef,stringifySlef,toSlef}from"../chunk-OVUHQEH5.js";export{getSourceModuleValue,sourcePurchaseFromLoadout,sumSourceModuleValues}from"../chunk-IYU4WLFM.js";export{powerBudget}from"../chunk-RLUS76LZ.js";export{getPreEngineeredJournalModifiers,getPreEngineeredModifiers,getPreEngineeredStats,identifyPreEngineeredVariant,unresolvedModifiers}from"../chunk-6BO5JJNI.js";export{armourPiercingFactor,combinedRateOfFire,damageFalloff,damagePerSecond,energyPerSecond,heatPerSecond,splitDamage,sumWeaponMetrics,sustainedDamagePerSecond,sustainedFireFactor,weaponMetrics}from"../chunk-LJI7VXJD.js";export{getBulkheadsForShip,getModuleBySymbol,getModulesByName}from"../chunk-PA5EITW5.js";export{PRE_ENGINEERED_MODULES,getPreEngineeredVariants,isPreEngineered}from"../chunk-2VPVZELZ.js";export{frameShiftDriveMassFactor,fuelPerJump,singleJumpRange,totalRange}from"../chunk-GQ5GX5TB.js";export{calculateCargoCapacity,calculateFuelCapacity,calculateUnladenMass}from"../chunk-AFVYCQWL.js";export{validateLoadout}from"../chunk-B4ZSTOM4.js";export{mobilityMetrics,thrusterMassCurveMultiplier}from"../chunk-CX7B67OI.js";export{hasFrameShiftDriveJumpStats,hasMassCurveStats,hasPowerDistributorStats,hasPowerGenerationStats,hasShieldRegenerationStats,hasWeaponDamageStats}from"../chunk-JTQVWIGL.js";export{OUTFITTING_FAMILIES}from"../chunk-M6G3UDTX.js";export{SHIP_MODULE_LIMITS,calculateModuleLimits}from"../chunk-KPETDYQX.js"; export{distributorMetrics}from"../chunk-P2QOL63K.js"; export{EXPERIMENTAL_EFFECTS,getExperimentalEffect}from"../chunk-JPBMRJFC.js";export{SHIP_GUNSIGHTS,getShipGunsight,projectGunsight}from"../chunk-DBGXZF7O.js";export{OVERHEAT_HEAT_LEVEL,effectiveWeaponThermalLoad,equilibriumHeatLevel,heatLevelAtTime,heatMetrics,secondsToHeatLevel}from"../chunk-W6EPHHTS.js";export{ammunitionCapacity}from"../chunk-AA3K5XUE.js";export{armourMetrics}from"../chunk-FGXWVFN6.js";export{effectiveHitPoints,mapDamageTypes,stackArmourResistance,stackShieldResistance,systemsResistance}from"../chunk-ZNCXENNB.js"; export{computeModifiers,rollsForGrade,sumMaterials}from"../chunk-DYPOL3CI.js";export{resolveBlueprintForModule}from"../chunk-2TW4ZBI3.js";export{ENGINEERING_OPTION_GROUPS,getBlueprintsForModule,getEngineeringGroup,getExperimentalsForBlueprint,getExperimentalsForModule}from"../chunk-QTZPA2FR.js";export{BLUEPRINTS,getBlueprint,getBlueprintGrade}from"../chunk-Q3QCLNVG.js"; export{SLOT_RESTRICTION_LABELS,enumerateSlots,parseSlotName}from"../chunk-RAO35XDF.js"; //# sourceMappingURL=index.js.map
1
+ export{LoadoutEditError,ShipLoadout}from"../chunk-OYFMHDYT.js";export{getSourceModuleValue,sourcePurchaseFromLoadout,sumSourceModuleValues}from"../chunk-NIURLW2F.js";export{SHIPS,getShipByName,getShipBySymbol,getShipSlots}from"../chunk-6UNAD74Z.js";export{validateLoadout}from"../chunk-B4ZSTOM4.js";export{SHIP_MODULE_LIMITS,calculateModuleLimits}from"../chunk-KPETDYQX.js";export{hasFrameShiftDriveJumpStats,hasMassCurveStats,hasPowerDistributorStats,hasPowerGenerationStats,hasShieldRegenerationStats,hasWeaponDamageStats}from"../chunk-JTQVWIGL.js";export{OUTFITTING_FAMILIES}from"../chunk-M6G3UDTX.js"; export{SHIP_GUNSIGHTS,getShipGunsight,projectGunsight}from"../chunk-DBGXZF7O.js";export{BuildMetrics}from"../chunk-PY5L6WC5.js";export{weaponsCapacitorMetrics}from"../chunk-RRYBSAPX.js";export{shieldCapacitorMetrics}from"../chunk-6L56LWTT.js";export{cellBankSummary,shieldRecovery}from"../chunk-4KJ7CR74.js"; export{getLoadoutModifier,inspectSlef,parseSlef,stringifySlef,toSlef}from"../chunk-OVUHQEH5.js";export{getPreEngineeredJournalModifiers,getPreEngineeredModifiers,getPreEngineeredStats,identifyPreEngineeredVariant,unresolvedModifiers}from"../chunk-GZYPQIO2.js";export{armourPiercingFactor,combinedRateOfFire,damageFalloff,damagePerSecond,energyPerSecond,heatPerSecond,splitDamage,sumWeaponMetrics,sustainedDamagePerSecond,sustainedFireFactor,weaponMetrics}from"../chunk-7TQ2X6Q3.js";export{PRE_ENGINEERED_MODULES,getPreEngineeredVariants,isPreEngineered}from"../chunk-PL75RTA2.js";export{shieldMassCurveMultiplier,shieldMetrics,shieldStrength}from"../chunk-QTAMQ6ME.js";export{getBulkheadsForShip,getModuleBySymbol,getModulesByName}from"../chunk-PA5EITW5.js"; export{powerBudget}from"../chunk-D6YEHR5S.js";export{frameShiftDriveMassFactor,fuelPerJump,singleJumpRange,totalRange}from"../chunk-6O4NRRSB.js";export{calculateCargoCapacity,calculateFuelCapacity,calculateUnladenMass}from"../chunk-DCB4COCL.js";export{mobilityCapacitorMetrics}from"../chunk-XUHAPOM6.js";export{mobilityMetrics,thrusterMassCurveMultiplier}from"../chunk-Y6KJJMIM.js"; export{distributorMetrics}from"../chunk-YXPZ7QQB.js"; export{EXPERIMENTAL_EFFECTS,getExperimentalEffect}from"../chunk-77I24V6B.js";export{OVERHEAT_HEAT_LEVEL,effectiveWeaponThermalLoad,equilibriumHeatLevel,heatLevelAtTime,heatMetrics,secondsToHeatLevel}from"../chunk-Q2L75GSI.js";export{ammunitionCapacity}from"../chunk-AA3K5XUE.js";export{armourMetrics}from"../chunk-FYVPZBXN.js";export{effectiveHitPoints,mapDamageTypes,stackArmourResistance,stackShieldResistance,systemsResistance}from"../chunk-JGOAQLYW.js"; export{computeModifiers,sumMaterials}from"../chunk-CJQ37JII.js";export{resolveBlueprintForModule}from"../chunk-OLKNYGGT.js";export{ENGINEERING_OPTION_GROUPS,getBlueprintsForModule,getEngineeringGroup,getExperimentalsForBlueprint,getExperimentalsForModule}from"../chunk-GLWPSVFV.js";export{BLUEPRINTS,getBlueprint,getBlueprintGrade}from"../chunk-AYAKU4YA.js"; export{SLOT_RESTRICTION_LABELS,enumerateSlots,parseSlotName}from"../chunk-RAO35XDF.js"; //# sourceMappingURL=index.js.map
@@ -3,7 +3,7 @@
3
3
  * the ship-build maths.
4
4
  *
5
5
  * These are the pure functions; they take the drive's constants and the ship's
6
- * mass and hand back light-years and tonnes. {@link ShipLoadout} (`./ship-loadout`)
6
+ * mass and hand back light-years and tonnes. {@link BuildMetrics} (`./build-metrics`)
7
7
  * is the convenient front end that pulls the constants out of a SLEF build for you.
8
8
  *
9
9
  * The model is the community-standard one used by EDSY and Coriolis, itself derived
@@ -43,7 +43,14 @@ interface FrameShiftDriveParams {
43
43
  */
44
44
  readonly jumpBoost?: number;
45
45
  }
46
- /** A multi-jump tank-range result and the number of jumps that produce it. */
46
+ /**
47
+ * A multi-jump tank-range result and the number of jumps that produce it.
48
+ *
49
+ * @remarks
50
+ * Frozen — nested records and lists included — so a result can be held, cached and
51
+ * shared without a defensive copy. Derive a changed figure with a spread rather than
52
+ * by assigning into one.
53
+ */
47
54
  interface TotalRangeDetails {
48
55
  /** Sum of the successive jumps as the tank drains, in light-years. */
49
56
  readonly range: number;
@@ -89,7 +96,7 @@ declare function frameShiftDriveMassFactor(mass: number, fuel: number, fsd: Pick
89
96
  * drive cannot jump (`maxFuel` or `fuel` = 0).
90
97
  * @remarks
91
98
  * Lighter ships and larger `optMass` jump farther; carrying more fuel than one jump
92
- * needs only weighs you down, which is why {@link ShipLoadout.maxJumpRange} loads
99
+ * needs only weighs you down, which is why {@link BuildMetrics.maxJumpRange} loads
93
100
  * exactly one jump's worth.
94
101
  * @throws {RangeError} If a quantity is negative or non-finite, or a required drive
95
102
  * constant is not positive.
@@ -1 +1 @@
1
- export{frameShiftDriveMassFactor,fuelPerJump,singleJumpRange,totalRange}from"../chunk-GQ5GX5TB.js";//# sourceMappingURL=jump-range.js.map
1
+ export{frameShiftDriveMassFactor,fuelPerJump,singleJumpRange,totalRange}from"../chunk-6O4NRRSB.js";//# sourceMappingURL=jump-range.js.map
@@ -21,7 +21,7 @@ type CalculationIssueReason = 'missing' | 'unresolved' | 'disabled' | 'shed' | '
21
21
  /** An input or fitted-module state that prevented a complete build metric. */
22
22
  interface CalculationIssue {
23
23
  /** Calculation input that is missing or unavailable. */
24
- readonly field: 'mass' | 'fuelCapacity' | 'frameShiftDrive' | 'powerCapacity' | 'powerDraw' | 'thrusters' | 'shieldGenerator';
24
+ readonly field: 'mass' | 'fuelCapacity' | 'frameShiftDrive' | 'powerCapacity' | 'powerDraw' | 'heatEfficiency' | 'thrusters' | 'shieldGenerator' | 'powerDistributor';
25
25
  /** Machine-readable unavailable-state discriminator. */
26
26
  readonly reason: CalculationIssueReason;
27
27
  /** Slot containing the incomplete module, when the dependency belongs to a module. */
@@ -1 +1 @@
1
- export{calculateCargoCapacity,calculateFuelCapacity,calculateUnladenMass}from"../chunk-AFVYCQWL.js";//# sourceMappingURL=loadout-calculations.js.map
1
+ export{calculateCargoCapacity,calculateFuelCapacity,calculateUnladenMass}from"../chunk-DCB4COCL.js";//# sourceMappingURL=loadout-calculations.js.map
@@ -0,0 +1,90 @@
1
+ import { MobilityInput, ThrusterParams } from './mobility.js';
2
+
3
+ /**
4
+ * **The ENG capacitor** — speed and handling at a chosen ENG-pip allocation.
5
+ *
6
+ * A hull publishes two endpoints for each of speed, pitch, roll and yaw: the figure at
7
+ * **no** ENG pips (`minimumSpeed`, `minPitch`, `minRoll`, `minYaw`) and the figure at
8
+ * **four** (`maximumSpeed`, `pitch`, `roll`, `yaw`). The allocation interpolates
9
+ * linearly between them, and the fitted thruster's mass curves are applied to the
10
+ * result:
11
+ *
12
+ * ```text
13
+ * speed = (minimumSpeed + (maximumSpeed − minimumSpeed) × pips / 4) × speedCurve(mass)
14
+ * ```
15
+ *
16
+ * Boost does **not** move with the pips, so it is not reported here — it is on
17
+ * {@link MobilityMetrics.boost}, along with the loaded mass and the two curve
18
+ * multipliers these figures share.
19
+ *
20
+ * This module is data-free. {@link BuildMetrics.mobilityCapacitorMetrics} (in
21
+ * `./build-metrics`) reads the hull, the loaded mass and the powered thrusters out of a
22
+ * build and calls {@link mobilityCapacitorMetrics} for you.
23
+ *
24
+ * @remarks
25
+ * Reference implementations: EDCD/Coriolis and EDSY; the algorithm is ported as fact,
26
+ * not code, and credit and licence terms are in
27
+ * [ATTRIBUTIONS.md](https://github.com/DarkSession/Elite-Dangerous-Almanac/blob/main/ATTRIBUTIONS.md).
28
+ *
29
+ * @packageDocumentation
30
+ */
31
+
32
+ /** Everything {@link mobilityCapacitorMetrics} needs about one loaded ship. */
33
+ interface MobilityCapacitorInput extends MobilityInput {
34
+ /** Finite pips assigned to ENG, in `[0, 4]`. Fractional pips are accepted; defaults to `4`. */
35
+ readonly enginesPips?: number;
36
+ }
37
+ /**
38
+ * Speed and rotation rates at one ENG-pip allocation.
39
+ *
40
+ * @remarks
41
+ * Frozen — nested records and lists included — so a result can be held, cached and
42
+ * shared without a defensive copy. Derive a changed figure with a spread rather than
43
+ * by assigning into one.
44
+ */
45
+ interface MobilityCapacitorMetrics {
46
+ /** Pips assigned to ENG for this result, in `[0, 4]`. */
47
+ readonly enginesPips: number;
48
+ /** Top speed at this mass and allocation, in metres per second. */
49
+ readonly speed: number;
50
+ /** Pitch rate at this mass and allocation, in degrees per second. */
51
+ readonly pitch: number;
52
+ /** Roll rate at this mass and allocation, in degrees per second. */
53
+ readonly roll: number;
54
+ /** Yaw rate at this mass and allocation, in degrees per second. */
55
+ readonly yaw: number;
56
+ }
57
+ /**
58
+ * Calculate a loaded ship's speed and rotation rates at one ENG-pip allocation.
59
+ *
60
+ * @param input - The same hull figures, loaded mass and fitted thrusters
61
+ * {@link mobilityMetrics} takes, plus the allocation to model.
62
+ * @returns The {@link MobilityCapacitorMetrics}, or `null` without thrusters. A mass
63
+ * above the thrusters' maximum returns zero performance rather than a fabricated curve
64
+ * value. At four pips every figure equals its {@link MobilityMetrics} counterpart.
65
+ * @throws {RangeError} If `enginesPips` is outside `[0, 4]`, an input is not finite or
66
+ * is outside its documented range, or a thruster curve does not follow the ordering
67
+ * {@link ThrusterCurveParams} documents. The pips are checked before the hull figures,
68
+ * so a bad allocation is reported first.
69
+ * @example
70
+ * ```ts
71
+ * import { mobilityCapacitorMetrics } from '@elite-dangerous-almanac/core/ships/mobility-capacitor';
72
+ *
73
+ * mobilityCapacitorMetrics({
74
+ * minimumSpeed: 100, maximumSpeed: 220, boost: 320,
75
+ * minPitch: 34, pitch: 42, minRoll: 110, roll: 110, minYaw: 16, yaw: 16,
76
+ * mass: 48,
77
+ * thrusters: {
78
+ * minMass: 24, optMass: 48, maxMass: 72,
79
+ * minMultiplier: 0.83, optMultiplier: 1, maxMultiplier: 1.03,
80
+ * },
81
+ * enginesPips: 2,
82
+ * })?.speed; // -> 160
83
+ * ```
84
+ */
85
+ declare function mobilityCapacitorMetrics(input: MobilityCapacitorInput & {
86
+ readonly thrusters: ThrusterParams;
87
+ }): MobilityCapacitorMetrics;
88
+ declare function mobilityCapacitorMetrics(input: MobilityCapacitorInput): MobilityCapacitorMetrics | null;
89
+
90
+ export { type MobilityCapacitorInput, type MobilityCapacitorMetrics, mobilityCapacitorMetrics };
@@ -0,0 +1 @@
1
+ export{mobilityCapacitorMetrics}from"../chunk-XUHAPOM6.js"; //# sourceMappingURL=mobility-capacitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"O"}