@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
@@ -53,7 +53,7 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
53
53
  - **Derivation:** each of the 107 current keys and its English name comes from
54
54
  `data/ships/blueprints.jsonc`. Names remain keyed per blueprint because a single
55
55
  English phrase can have different grammatical translations for different module
56
- families. The Frontier `fdname` joins case-insensitively to the in-game modification
56
+ families. The Frontier symbol joins case-insensitively to the in-game modification
57
57
  name table, which supplies every locale for the 90 recipes it names. The remaining 17
58
58
  are ids this repository keys separately because their numbers differ, where the game
59
59
  offers only the generic recipe's menu entry and so publishes only its name: each takes
@@ -82,7 +82,7 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
82
82
  - **EDSY revision:** commit `e446fbe6e4597dea7ab0bd3105b9a36642388040`;
83
83
  database version `424009901`, last-modified marker `20260810`.
84
84
  - **Derivation:** each of the 86 current keys and its English name comes from
85
- `data/ships/experimental-effects.jsonc`. The Frontier `fdname` joins directly to
85
+ `data/ships/experimental-effects.jsonc`. The Frontier symbol joins directly to
86
86
  EDSY's `expeffect.fdname`; that record's id selects an explicit `expeffect-<id>` entry
87
87
  from each language file.
88
88
  - **Coverage:** English covers all 86 effects; EDSY covers 84 in German and 85 each in
@@ -568,7 +568,7 @@ Thirteen stored fields supply the base values referenced by engineering recipes:
568
568
  7, identical between the plain and SCO lines at every size — and the size-8 SCO drives
569
569
  are 50, so the size-8 plain drives take 50. Stated as derivation, not as a reading.
570
570
  The Mk II supercharge-optimised size-8 SCO drive is **not** among them: EDSY publishes
571
- its `fsdheat: 50` outright, spelling the fdname
571
+ its `fsdheat: 50` outright, spelling the symbol
572
572
  `Int_Hyperdrive_Overcharge_Size8_Class5_Overchargebooster_MkII` where the outfitting
573
573
  registry this catalogue is keyed on capitalises the `B`. The case-insensitive source
574
574
  join makes it a reading.
@@ -1193,7 +1193,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1193
1193
  general alias mechanism: it says "the game writes this recipe as X", nothing about
1194
1194
  equivalence, and contains exactly these three records. EDSY publishes the sensor-suite
1195
1195
  and utility-scanner recipes as separate rows with different modifiers but the same
1196
- journal fdnames; its journal importer resolves them by module type. Coriolis supplies the
1196
+ journal symbols; its journal importer resolves them by module type. Coriolis supplies the
1197
1197
  distinct stored recipe keys. The multi-cannon split is detailed under Engineering
1198
1198
  options.
1199
1199
  - **Blueprint source:** EDCD/coriolis-data,
@@ -1300,7 +1300,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1300
1300
  is absent for the same reason. That index is the whole evidence for the negative half
1301
1301
  of the claim: it is a completeness reading of one listing, not 197 pages checked one
1302
1302
  by one. Acquired 2026-08-22 UTC; the pages are live and expose no immutable revision.
1303
- - **Every row is joined to its `fdname` by its own material recipe, not by name.** Inara
1303
+ - **Every row is joined to its blueprint symbol by its own material recipe, not by name.** Inara
1304
1304
  publishes one page per recipe, keyed by its display name; each of the 18 pages' per-grade
1305
1305
  material lists was compared against `blueprint-costs.jsonc` before its Merc-Coin figures
1306
1306
  were taken, and all 25 rows agree on every grade, every material and every count. That is what
@@ -1517,12 +1517,12 @@ up straight through with no disambiguation at all. Both paths are evidence that
1517
1517
  the journal `BlueprintName` this catalogue joins on, so life support lists
1518
1518
  `LifeSupport_LightWeight`, an AFMU `AFM_Shielded`, a fuel scoop `FuelScoop_Shielded`,
1519
1519
  a refinery `Refineries_Shielded` and each limpet controller its own. **This is not
1520
- cosmetic for the scanners:** EDSY's `scan_lr` and `cs_lr` share the fdname
1520
+ cosmetic for the scanners:** EDSY's `scan_lr` and `cs_lr` share the symbol
1521
1521
  `Sensor_LongRange`, but `Scanner_LongRange` is a different recipe (power draw, not
1522
1522
  mass; a larger range roll), so the utility scanners take the `Scanner_*` ids for Long
1523
1523
  Range and Wide Angle where the sensor suites take the `Sensor_*` ones. (Their other
1524
1524
  four ids are unaffected: `Sensor_FastScan` and the generic `Misc_*` trio, exactly as
1525
- coriolis has them.) The shared fdname is not a defect in EDSY's table, and §Scanner
1525
+ coriolis has them.) The shared symbol is not a defect in EDSY's table, and §Scanner
1526
1526
  Long Range and Wide Angle below is what follows from that. Eleven groups carry a
1527
1527
  substitution; the substituted lists are then checked against coriolis's own, as are
1528
1528
  the nine further groups it carries a list for —
@@ -1646,7 +1646,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1646
1646
  `MC_Overcharged`; other weapon menus list
1647
1647
  `Weapon_Overcharged`. Coriolis `modifications/modules.json` assigns the first key to
1648
1648
  multi-cannons and the second to six other weapon groups, while
1649
- `modifications/blueprints.json` gives both the journal fdname
1649
+ `modifications/blueprints.json` gives both the journal symbol
1650
1650
  `Weapon_Overcharged`. The recipes differ only in the `AmmoClipSize` reduction carried
1651
1651
  by `MC_Overcharged` (−3% at grade 1 through −15% at grade 5).
1652
1652
  `modifications/blueprints.json` was acquired 2026-08-07 UTC and has SHA-256
@@ -1736,7 +1736,8 @@ up straight through with no disambiguation at all. Both paths are evidence that
1736
1736
  distributor, hull-reinforcement, module-reinforcement, shield-reinforcement or
1737
1737
  FSD-booster reward variants, so the absence of an `Int_Guardian*` row is deliberate. The
1738
1738
  catalogue's seven Guardian rows are all weapons (Gauss, Plasma and Shard), each with a
1739
- `blueprint` and no `experimental`. Source: maintainer confirmation recorded 2026-08-12
1739
+ `blueprintSymbol` and no `experimentalEffectSymbol`. Source: maintainer confirmation
1740
+ recorded 2026-08-12
1740
1741
  UTC; there is no immutable upstream revision.
1741
1742
  - **Records:** pair a base module `symbol` with its published pre-engineered identity:
1742
1743
  `{ symbol, name, blueprint, grade, acquisition }`, plus any sourced stat block and
@@ -1796,8 +1797,9 @@ up straight through with no disambiguation at all. Both paths are evidence that
1796
1797
  under Engineering options.
1797
1798
  - **A reward variant is not reproducible by engineering the same blueprint.** Alongside
1798
1799
  its blueprint and effect, each reward carries hand-set modifier overrides no blueprint
1799
- grants — that is what makes it a reward rather than a shortcut. The `blueprint` /
1800
- `grade` / `experimental` recorded here **identify** the variant; they are not a recipe
1800
+ grants — that is what makes it a reward rather than a shortcut. The `blueprintSymbol` /
1801
+ `grade` / `experimentalEffectSymbol` recorded here **identify** the variant; they are not
1802
+ a recipe
1801
1803
  that recreates it. The ordinary blueprint material recipe does not price the reward.
1802
1804
  - **Two community-goal rewards are not stored:** the size-5 and size-6 Corrosion
1803
1805
  Resistant Cargo Racks carry no engineering at all. They already exist as ordinary
package/README.md CHANGED
@@ -111,33 +111,40 @@ Address inputs accept `bigint`, safe integer `number` values and decimal strings
111
111
  Addresses are returned as `bigint`.
112
112
 
113
113
  ```ts
114
+ import { BuildMetrics } from '@elite-dangerous-almanac/core/ships/build-metrics';
114
115
  import { ShipLoadout } from '@elite-dangerous-almanac/core/ships/ship-loadout';
115
116
 
116
117
  declare const slefJsonString: string;
117
118
 
118
119
  const build = ShipLoadout.fromSlef(slefJsonString);
119
- build.maxJumpRange();
120
- build.powerBudget();
121
- build.shieldMetrics();
122
- build.armourMetrics();
123
- build.weaponMetrics();
124
- build.weaponsCapacitorMetrics({ weaponsPips: 2 });
120
+ const metrics = BuildMetrics.of(build);
121
+ metrics.maxJumpRange();
122
+ metrics.powerBudget();
123
+ metrics.shieldMetrics();
124
+ metrics.armourMetrics();
125
+ metrics.weaponMetrics();
126
+ metrics.weaponsCapacitorMetrics({ weaponsPips: 2 });
125
127
 
126
128
  build.toSlefString({
127
129
  header: { appName: 'MyApp', appVersion: '1.0.0' },
128
130
  });
129
131
  ```
130
132
 
131
- `ShipLoadout` imports every ship and module catalogue so it can resolve any build.
132
- When only one calculation is required, use the data-free leaf modules under
133
- `ships/jump-range`, `ships/power`, `ships/shields`, `ships/armour`, `ships/weapons`,
134
- `ships/weapons-capacitor`, `ships/ammunition`, `ships/heat` or `ships/resistances`.
133
+ `ShipLoadout` holds and edits a build; `BuildMetrics` calculates over one, so an
134
+ outfitting editor need not import the calculations. Both import every ship and module
135
+ catalogue so they can resolve any build. When only one calculation is required, use the
136
+ data-free leaf modules under `ships/jump-range`, `ships/power`, `ships/shields`,
137
+ `ships/shield-capacitor`, `ships/armour`, `ships/weapons`, `ships/weapons-capacitor`,
138
+ `ships/mobility`, `ships/mobility-capacitor`, `ships/ammunition`, `ships/heat` or
139
+ `ships/resistances`.
135
140
 
136
- `build.validation` reports validity and operational completeness. `cargoCapacity`,
141
+ `build.validation()` reports validity and operational completeness. `cargoCapacity`,
137
142
  `fuelCapacity` and `unladenMass` always have an answer, because no article the
138
- catalogue cannot weigh reaches a build; the metrics that depend on build state
139
- (`mobilityMetrics`, `shieldMetrics`, `shieldRecovery`) are nullable and have a
140
- diagnostic counterpart naming what is missing, switched off or unpowered. `parseSlef`
143
+ catalogue cannot weigh reaches a build; the eight metrics that depend on build state
144
+ (`mobilityMetrics`, `mobilityCapacitorMetrics`, `shieldMetrics`,
145
+ `shieldCapacitorMetrics`, `shieldRecovery`, `heatMetrics`, `distributorMetrics` and
146
+ `standardLoad`) are nullable and each has a `…Result` counterpart naming what is
147
+ missing, switched off, shed or unpowered. `parseSlef`
141
148
  is strict; `inspectSlef` is the tolerant importer for mixed files and returns indexed
142
149
  diagnostics instead of silently dropping entries.
143
150
 
@@ -177,44 +184,51 @@ getEngineeringGroupName('frameShiftDrives', 'de'); // -> null
177
184
 
178
185
  The functions return an explicit source value verbatim, so a source-backed spelling may
179
186
  happen to equal English; the library itself never supplies an English fallback. The
180
- catalogues carry English, French, German, Russian and Spanish, each stored under a bare
181
- language tag: a regional or script subtag is dropped (`de-DE` → `de`), and any other
182
- language returns `null`.
187
+ catalogues carry English, French, German, Portuguese, Russian and Spanish, each stored
188
+ under a bare language tag: a regional or script subtag is dropped (`de-DE` → `de`), and
189
+ any other language returns `null`.
183
190
 
184
191
  The same contract covers ship manufacturers, pre-engineered variant names, engineering
185
192
  group names, experimental-effect descriptions, loadout-slot and restriction labels, and
186
193
  structured loadout, calculation, SLEF and edit messages. A family whose accepted source
187
194
  currently supplies only English returns `null` for every non-English locale.
188
195
 
189
- Registry lookups ignore case and surrounding whitespace. Material, commodity and
190
- module lookups search their complete registry by default and accept an optional
191
- catalogue to narrow the results. Nebula queries require an explicit catalogue so the
192
- large combined dataset is never an implicit dependency.
196
+ Registry lookups ignore case and surrounding whitespace. The material, commodity and
197
+ module lookups that resolve one record by symbol or name search their complete registry
198
+ by default and accept an optional catalogue to narrow it; the filters that return a
199
+ subset (`materialsInCategory`, `commoditiesInCategory` and their siblings) take no
200
+ catalogue, since filtering their result costs nothing and passing one narrows nothing a
201
+ consumer could not narrow themselves. Nebula queries require an explicit catalogue so
202
+ the large combined dataset is never an implicit dependency.
193
203
 
194
204
  `symbol` is Frontier's item id for a hull, module, suit, handheld weapon, material,
195
- micro-resource or commodity. Ship engineering uses a separate identity space: `fdname` identifies a
196
- blueprint recipe, experimental effect or fixed variant identity. The journal
197
- normally writes that id in its `Engineering` block, but a few blueprint aliases
198
- collide across module families; `resolveBlueprintForModule` resolves those journal
199
- spellings. Recipe and effect lookups take that `fdname`. Pre-engineered variants instead
200
- form a relation from the base module: after resolving a module by type or name,
201
- `getPreEngineeredVariants` lists the fixed articles associated with its `symbol`, and the
202
- caller can inspect each variant's `blueprint` identity. Those include the grade-5
203
- `Decorative_*` launchers whose −99% damage modifier is part of the awarded article rather
204
- than a generally applicable recipe. `ShipLoadout.setPreEngineeredVariant` fits the fixed
205
- article and writes its corresponding journal block.
206
-
207
- Personal-equipment modifications are keyed by their recipe symbol, just as ship
208
- blueprints and experimental effects are keyed by `fdname`; there is no second synthetic
209
- id. The journal omits the technology suffix from three weapon modification families, so
210
- `resolvePersonalModificationForWeapon` resolves those spellings against the weapon before
211
- joining to `PERSONAL_MODIFICATIONS` or `PERSONAL_MODIFICATION_COSTS`. Material shopping
212
- lists live on the separate `equipment/modification-costs` subpath and consume the
205
+ micro-resource or commodity. Ship engineering ids live in a space of their own: a
206
+ `blueprintSymbol` names a blueprint recipe, a fixed variant's identity included, and an
207
+ `experimentalEffectSymbol` names an experimental effect. The journal normally writes
208
+ both in its `Engineering` block, but a few blueprint aliases collide across module
209
+ families; `resolveBlueprintForModule` resolves those journal spellings. Pre-engineered
210
+ variants instead form a relation from the base module: after resolving a module by type
211
+ or name, `getPreEngineeredVariants` lists the fixed articles associated with its
212
+ `symbol`, and the caller can inspect each variant's `blueprintSymbol` identity. Those
213
+ include the grade-5 `Decorative_*` launchers whose −99% damage modifier is part of the
214
+ awarded article rather than a generally applicable recipe.
215
+ `ShipLoadout.setPreEngineeredVariant` fits the fixed article and writes its corresponding
216
+ journal block.
217
+
218
+ Personal-equipment modifications are keyed by their own recipe symbol, the way ship
219
+ blueprints and experimental effects are keyed by theirs; neither place invents a second
220
+ synthetic id. The journal omits the technology suffix from three weapon modification
221
+ families, so `resolvePersonalModificationForWeapon` resolves those spellings against the
222
+ weapon before joining to `PERSONAL_MODIFICATIONS` or `PERSONAL_MODIFICATION_COSTS`.
223
+ Material shopping lists live on the separate `equipment/modification-costs` subpath and
224
+ consume the
213
225
  micro-resource symbols from the `materials` feature area.
214
226
 
215
227
  ## Important behavior
216
228
 
217
- - Exported catalogues are deeply frozen.
229
+ - Exported catalogues are deeply frozen, and so is every calculation result — nested
230
+ records and lists included — so nothing a consumer does can mutate a shared singleton
231
+ or a figure it handed back.
218
232
  - Slot keys come from the game and are not reliably derivable from position. Enumerate
219
233
  them with `ShipLoadout.slots()` or `enumerateSlots`.
220
234
  - Resistances are fractions, not percentages.
@@ -1 +1 @@
1
- export{GALAXY_ORIGIN,SECTOR_EDGE_LY,sectorGridPositionFromGalacticPosition,sectorNameFromGalacticPosition}from"../chunk-6EUVIZAS.js"; //# sourceMappingURL=galaxy-grid.js.map
1
+ export{GALAXY_ORIGIN,SECTOR_EDGE_LY,sectorGridPositionFromGalacticPosition,sectorNameFromGalacticPosition}from"../chunk-4QYTVSNR.js"; //# sourceMappingURL=galaxy-grid.js.map
@@ -125,7 +125,7 @@
125
125
  export { ProceduralSystem } from './procedural-system.js';
126
126
  export { G as GalacticPosition } from '../galactic-position-shLkm4Qg.js';
127
127
  export { BoxelLetters, IsProceduralSystemNameOptions, SystemNameParts, boxelCodeToLetters, canonicalizeSystemName, formatSystemName, isProceduralSystemName, lettersToBoxelCode, parseSystemName } from './system-name.js';
128
- export { A as AbsoluteBoxel, D as DecodedAddress, N as NamingRegionOrigin, S as SECTOR_INTERNAL_SIZE, a as absoluteBoxelToBoxelCode, b as boxelCodeToAbsoluteBoxel, c as boxelInternalSize, d as decodeModSystemAddress, e as decodeSystemAddress, f as encodeModSystemAddress, g as encodeSystemAddress, h as getHandAuthoredRegionOrigin, r as resolveNamingRegionOrigin } from '../system-address-DYsN1qOT.js';
128
+ export { A as AbsoluteBoxel, D as DecodedAddress, N as NamingRegionOrigin, S as SECTOR_INTERNAL_SIZE, a as absoluteBoxelToBoxelCode, b as boxelCodeToAbsoluteBoxel, c as boxelInternalSize, d as decodeModSystemAddress, e as decodeSystemAddress, f as encodeModSystemAddress, g as encodeSystemAddress, h as getHandAuthoredRegionOrigin, r as resolveNamingRegionOrigin } from '../system-address-cyJaeZIS.js';
129
129
  export { SystemAddressInput, toSystemAddress, tryToSystemAddress } from './system-address-input.js';
130
130
  export { SectorGridPosition, canonicalizeSectorName, sectorGridPositionFromName, sectorNameFromGridPosition } from './sector-name.js';
131
131
  export { GALAXY_ORIGIN, SECTOR_EDGE_LY, sectorGridPositionFromGalacticPosition, sectorNameFromGalacticPosition } from './galaxy-grid.js';
@@ -1 +1 @@
1
- export{getNebulaByName,nearestNebulae,nebulaeWithin}from"../chunk-L7CLUYZ6.js";export{isPermitLockedSystemName,permitLockForSystemName}from"../chunk-EBAHNZ36.js";export{PERMIT_LOCKED_SYSTEMS,permitLockedSystemForAddress,permitLockedSystemForName}from"../chunk-BMT3U46U.js";export{ProceduralSystem}from"../chunk-E3BRVGJJ.js";export{boxelCodeToLetters,canonicalizeSystemName,formatSystemName,isProceduralSystemName,lettersToBoxelCode,parseSystemName}from"../chunk-G3265B27.js";export{PERMIT_LOCKED_REGIONS,isPermitLockedRegionName,permitLockedRegionForSystemName}from"../chunk-NLBUKXNV.js";export{CODEX_REGIONS,getCodexRegion,getCodexRegionByName}from"../chunk-ADLVPKUV.js";export{GALAXY_ORIGIN,SECTOR_EDGE_LY,sectorGridPositionFromGalacticPosition,sectorNameFromGalacticPosition}from"../chunk-6EUVIZAS.js";export{HAND_AUTHORED_REGIONS,findHandAuthoredRegionAt}from"../chunk-AVZI6VKA.js";export{BASE_BOXEL_LY,MASS_CODE_COUNT,boxelEdgeLy,massCodeToSizeClass,sizeClassToMassCode}from"../chunk-POZTXBSN.js";export{getHandAuthoredRegionOrigin,resolveNamingRegionOrigin}from"../chunk-UXBCLFGU.js";export{SECTOR_INTERNAL_SIZE,absoluteBoxelToBoxelCode,boxelCodeToAbsoluteBoxel,boxelInternalSize,decodeModSystemAddress,decodeSystemAddress,encodeModSystemAddress,encodeSystemAddress}from"../chunk-DI5RXSJR.js";export{toSystemAddress,tryToSystemAddress}from"../chunk-NEEFT7WH.js";export{canonicalizeSectorName,sectorGridPositionFromName,sectorNameFromGridPosition}from"../chunk-DVL5RBKX.js"; export{PROCGEN_NEBULAE}from"../chunk-K7F6WC4T.js";export{REAL_NEBULAE}from"../chunk-HI7FCS3G.js"; //# sourceMappingURL=index.js.map
1
+ export{getNebulaByName,nearestNebulae,nebulaeWithin}from"../chunk-L7CLUYZ6.js";export{isPermitLockedSystemName,permitLockForSystemName}from"../chunk-CIULJH3G.js";export{PERMIT_LOCKED_SYSTEMS,permitLockedSystemForAddress,permitLockedSystemForName}from"../chunk-BMT3U46U.js";export{ProceduralSystem}from"../chunk-TBZJIQ5P.js";export{boxelCodeToLetters,canonicalizeSystemName,formatSystemName,isProceduralSystemName,lettersToBoxelCode,parseSystemName}from"../chunk-7ATBEOVC.js";export{PERMIT_LOCKED_REGIONS,isPermitLockedRegionName,permitLockedRegionForSystemName}from"../chunk-NLBUKXNV.js";export{CODEX_REGIONS,getCodexRegion,getCodexRegionByName}from"../chunk-ADLVPKUV.js";export{GALAXY_ORIGIN,SECTOR_EDGE_LY,sectorGridPositionFromGalacticPosition,sectorNameFromGalacticPosition}from"../chunk-4QYTVSNR.js";export{HAND_AUTHORED_REGIONS,findHandAuthoredRegionAt}from"../chunk-AVZI6VKA.js";export{BASE_BOXEL_LY,MASS_CODE_COUNT,boxelEdgeLy,massCodeToSizeClass,sizeClassToMassCode}from"../chunk-POZTXBSN.js";export{getHandAuthoredRegionOrigin,resolveNamingRegionOrigin}from"../chunk-DWRNXUAX.js";export{SECTOR_INTERNAL_SIZE,absoluteBoxelToBoxelCode,boxelCodeToAbsoluteBoxel,boxelInternalSize,decodeModSystemAddress,decodeSystemAddress,encodeModSystemAddress,encodeSystemAddress}from"../chunk-DI5RXSJR.js";export{toSystemAddress,tryToSystemAddress}from"../chunk-NEEFT7WH.js";export{canonicalizeSectorName,sectorGridPositionFromName,sectorNameFromGridPosition}from"../chunk-H47K3UWG.js"; export{PROCGEN_NEBULAE}from"../chunk-K7F6WC4T.js";export{REAL_NEBULAE}from"../chunk-HI7FCS3G.js"; //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { N as NamingRegionOrigin, S as SECTOR_INTERNAL_SIZE, h as getHandAuthoredRegionOrigin, r as resolveNamingRegionOrigin } from '../system-address-DYsN1qOT.js';
1
+ export { N as NamingRegionOrigin, S as SECTOR_INTERNAL_SIZE, h as getHandAuthoredRegionOrigin, r as resolveNamingRegionOrigin } from '../system-address-cyJaeZIS.js';
2
2
  import './system-name.js';
3
3
  import './sector-name.js';
4
4
  import './system-address-input.js';
@@ -1 +1 @@
1
- export{getHandAuthoredRegionOrigin,resolveNamingRegionOrigin}from"../chunk-UXBCLFGU.js";export{SECTOR_INTERNAL_SIZE}from"../chunk-DI5RXSJR.js"; //# sourceMappingURL=naming-region-origins.js.map
1
+ export{getHandAuthoredRegionOrigin,resolveNamingRegionOrigin}from"../chunk-DWRNXUAX.js";export{SECTOR_INTERNAL_SIZE}from"../chunk-DI5RXSJR.js"; //# sourceMappingURL=naming-region-origins.js.map
@@ -18,7 +18,7 @@ import { G as GalacticPosition } from '../galactic-position-shLkm4Qg.js';
18
18
  * | --- | --- | --- | --- | --- |
19
19
  * | `./nebulae-real` | `REAL_NEBULAE` | 180 | 16.4 KiB | 5.3 KiB |
20
20
  * | `./nebulae-procgen` | `PROCGEN_NEBULAE` | 166 | 16.4 KiB | 5.7 KiB |
21
- * | `./nebulae-planetary` | `PLANETARY_NEBULAE` | 5489 | 399.3 KiB | 116.0 KiB |
21
+ * | `./nebulae-planetary` | `PLANETARY_NEBULAE` | 5489 | 399.4 KiB | 116.0 KiB |
22
22
  * | `./nebulae-all` | `ALL_NEBULAE` | 5835 | 431.7 KiB | 126.5 KiB |
23
23
  *
24
24
  * Importing a query function from here costs nothing but the function: pass in
@@ -83,7 +83,7 @@ interface Nebula {
83
83
  *
84
84
  * @remarks
85
85
  * Resolve it to a name with `getCodexRegion` from `./codex-region` — that
86
- * costs ~9 KB of region metadata rather than the ~267 KB lookup grid
86
+ * costs ~9 KiB of region metadata rather than the ~208 KiB lookup grid
87
87
  * `findCodexRegionAt` needs.
88
88
  */
89
89
  readonly regionId: number;
@@ -112,7 +112,8 @@ declare function permitLockForSystemName(name: string): PermitLock | null;
112
112
  * the yes/no. Use that function instead when you want to tell the commander *which*
113
113
  * permit they are missing.
114
114
  *
115
- * @param name - A system name in any casing, e.g. `"vega"`.
115
+ * @param name - A system name in any casing, with optional surrounding whitespace,
116
+ * e.g. `"vega"`.
116
117
  * @returns `true` if the name matches a permit-locked system or region.
117
118
  * @throws {TypeError} If `name` is present and not a string. A nullish
118
119
  * `name` is a miss, answered the way an unrecognised one is.
@@ -1 +1 @@
1
- export{isPermitLockedSystemName,permitLockForSystemName}from"../chunk-EBAHNZ36.js";export{PERMIT_LOCKED_SYSTEMS,permitLockedSystemForAddress,permitLockedSystemForName}from"../chunk-BMT3U46U.js";export{PERMIT_LOCKED_REGIONS,isPermitLockedRegionName,permitLockedRegionForSystemName}from"../chunk-NLBUKXNV.js"; //# sourceMappingURL=permit-locks.js.map
1
+ export{isPermitLockedSystemName,permitLockForSystemName}from"../chunk-CIULJH3G.js";export{PERMIT_LOCKED_SYSTEMS,permitLockedSystemForAddress,permitLockedSystemForName}from"../chunk-BMT3U46U.js";export{PERMIT_LOCKED_REGIONS,isPermitLockedRegionName,permitLockedRegionForSystemName}from"../chunk-NLBUKXNV.js"; //# sourceMappingURL=permit-locks.js.map
@@ -87,7 +87,8 @@ declare class ProceduralSystem {
87
87
  * Unknown naming regions and out-of-range address fields are rejected here rather
88
88
  * than creating an object whose address getter fails later.
89
89
  *
90
- * @param name - A system name in any casing, e.g. `blae eock kc-c d0`.
90
+ * @param name - A system name in any casing, with optional surrounding
91
+ * whitespace, e.g. `blae eock kc-c d0`.
91
92
  * @returns The system, or `null` when `name` is not a **procedurally named**
92
93
  * system. Hand-named systems (`Sol`, `Maia`, `Shinrarta Dezhra`) have no
93
94
  * algorithmic address and so yield `null` too — that is a "not covered by the
@@ -1 +1 @@
1
- export{ProceduralSystem}from"../chunk-E3BRVGJJ.js"; //# sourceMappingURL=procedural-system.js.map
1
+ export{ProceduralSystem}from"../chunk-TBZJIQ5P.js"; //# sourceMappingURL=procedural-system.js.map
@@ -78,7 +78,8 @@ declare function sectorGridPositionFromName(name: string): SectorGridPosition |
78
78
  * Re-derive a sector name's canonical casing by round-tripping it through the
79
79
  * grid, e.g. `blae eock` → `Blae Eock`. Returns `null` for non-procedural names.
80
80
  *
81
- * @param name - A procedural sector name in any casing. A nullish one answers `null`,
81
+ * @param name - A procedural sector name in any casing, with optional surrounding
82
+ * whitespace. A nullish one answers `null`,
82
83
  * matching {@link sectorGridPositionFromName}.
83
84
  * @throws {TypeError} If `name` is present and not a string.
84
85
  */
@@ -1 +1 @@
1
- export{canonicalizeSectorName,sectorGridPositionFromName,sectorNameFromGridPosition}from"../chunk-DVL5RBKX.js"; //# sourceMappingURL=sector-name.js.map
1
+ export{canonicalizeSectorName,sectorGridPositionFromName,sectorNameFromGridPosition}from"../chunk-H47K3UWG.js"; //# sourceMappingURL=sector-name.js.map
@@ -1,4 +1,4 @@
1
1
  import './system-name.js';
2
- export { A as AbsoluteBoxel, D as DecodedAddress, S as SECTOR_INTERNAL_SIZE, a as absoluteBoxelToBoxelCode, b as boxelCodeToAbsoluteBoxel, c as boxelInternalSize, d as decodeModSystemAddress, e as decodeSystemAddress, f as encodeModSystemAddress, g as encodeSystemAddress } from '../system-address-DYsN1qOT.js';
2
+ export { A as AbsoluteBoxel, D as DecodedAddress, S as SECTOR_INTERNAL_SIZE, a as absoluteBoxelToBoxelCode, b as boxelCodeToAbsoluteBoxel, c as boxelInternalSize, d as decodeModSystemAddress, e as decodeSystemAddress, f as encodeModSystemAddress, g as encodeSystemAddress } from '../system-address-cyJaeZIS.js';
3
3
  import './sector-name.js';
4
4
  export { SystemAddressInput } from './system-address-input.js';
@@ -111,13 +111,16 @@ declare function boxelCodeToLetters(boxelCode: number): BoxelLetters;
111
111
  * well-formed procedural system name.
112
112
  *
113
113
  * @remarks
114
- * Parsing does **not** canonicalize casing: `regionName` is captured verbatim from
115
- * the input (`parseSystemName('synuefe …').regionName === 'synuefe'`). The letters
116
- * and mass code become numeric indices, so re-formatting them is always canonical,
117
- * but the region is not use {@link canonicalizeSystemName} (or build a
118
- * {@link ProceduralSystem} via `ProceduralSystem.fromName`) if you need the region re-cased too.
119
- *
120
- * @param name - A system name in any casing, e.g. `blae eock kc-c d0`.
114
+ * Surrounding whitespace is trimmed off the name before it is parsed, so it never
115
+ * reaches `regionName` either (`parseSystemName(' synuefe … ').regionName === 'synuefe'`).
116
+ * Beyond that, parsing does **not** canonicalize casing: `regionName` is captured
117
+ * verbatim from the input. The letters and mass code become numeric indices, so
118
+ * re-formatting them is always canonical, but the region is not — use
119
+ * {@link canonicalizeSystemName} (or build a {@link ProceduralSystem} via
120
+ * `ProceduralSystem.fromName`) if you need the region re-cased too.
121
+ *
122
+ * @param name - A system name in any casing, with optional surrounding whitespace,
123
+ * e.g. `blae eock kc-c d0`.
121
124
  * @returns The parsed parts, or `null` if the name is malformed. A nullish `name`
122
125
  * answers `null` too: this parser tolerates an absent name, deliberately, so a caller
123
126
  * can hand it a field that may not be there. `ProceduralSystem.fromName` is the stricter
@@ -149,7 +152,7 @@ declare function formatSystemName(parts: SystemNameParts): string;
149
152
  * Unknown region strings are left untouched so syntactic parsing remains separate
150
153
  * from address encodability.
151
154
  *
152
- * @param name - A system name in any casing.
155
+ * @param name - A system name in any casing, with optional surrounding whitespace.
153
156
  * @returns The canonically-cased name, or `null` if it is not a system name — including
154
157
  * a nullish `name`, which {@link parseSystemName} tolerates on this path too.
155
158
  * @throws {TypeError} If `name` is present and not a string.
@@ -167,7 +170,8 @@ interface IsProceduralSystemNameOptions {
167
170
  /**
168
171
  * Whether a string is a well-formed procedural system name.
169
172
  *
170
- * @param name - The candidate name.
173
+ * @param name - The candidate name, in any casing and with optional surrounding
174
+ * whitespace.
171
175
  * @param options - See {@link IsProceduralSystemNameOptions}.
172
176
  * @returns `true` when the name parses as a procedural system name. A hand-named
173
177
  * system (`Sol`, `Maia`) is `false`: it is a real system, just not a procedural name. A
@@ -178,6 +182,7 @@ interface IsProceduralSystemNameOptions {
178
182
  * import { isProceduralSystemName } from '@elite-dangerous-almanac/core/astro/system-name';
179
183
  *
180
184
  * isProceduralSystemName('Blae Eock KC-C d0'); // -> true
185
+ * isProceduralSystemName(' Blae Eock KC-C d0\n'); // -> true
181
186
  * isProceduralSystemName('Pleiades Sector HR-W d1-79'); // -> true
182
187
  * isProceduralSystemName('Pleiades Sector HR-W d1-79', { strict: true }); // -> false
183
188
  * ```
@@ -1 +1 @@
1
- export{boxelCodeToLetters,canonicalizeSystemName,formatSystemName,isProceduralSystemName,lettersToBoxelCode,parseSystemName}from"../chunk-G3265B27.js"; //# sourceMappingURL=system-name.js.map
1
+ export{boxelCodeToLetters,canonicalizeSystemName,formatSystemName,isProceduralSystemName,lettersToBoxelCode,parseSystemName}from"../chunk-7ATBEOVC.js"; //# sourceMappingURL=system-name.js.map
@@ -0,0 +1 @@
1
+ function assertEquipmentGrade(grade,functionName){if(!Number.isInteger(grade)||grade<1||grade>5){throw new RangeError(`${functionName}: grade must be an integer in [1, 5]`)}}export{assertEquipmentGrade};//# sourceMappingURL=chunk-2W5MW376.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/equipment/internal/equipment-grade.ts"],"names":["assertEquipmentGrade","grade","functionName","Number","isInteger","RangeError"],"mappings":"AAiBO,SAASA,qBACZC,MACAC,cAEA,IAAKC,OAAOC,UAAUH,QAAUA,MAAQ,GAAKA,MAAQ,EAAG,CACpD,MAAM,IAAII,WAAW,GAAGH,mDAC5B,CACJ,QAAAF"}
@@ -1 +1 @@
1
- import{capacitorRechargeAtPips}from"./chunk-JOTAOI5T.js";var phaseTime=(megajoules,rate,draw,capacity,recharge)=>{if(megajoules<=0)return 0;if(rate<=0)return Infinity;if(draw<=0)return megajoules/rate;const drain=rate*draw-recharge;if(drain<=0)return megajoules/rate;const capacitorLifetime=capacity/drain;const beforeEmpty=capacitorLifetime*rate;if(megajoules<=beforeEmpty)return megajoules/rate;if(recharge<=0)return Infinity;return capacitorLifetime+(megajoules-beforeEmpty)/(recharge/draw)};var requireFiniteNonNegative=(name,value)=>{if(!Number.isFinite(value)||value<0){throw new RangeError(`shieldRecovery: ${name} must be a finite non-negative number`)}};function shieldRecovery(input){const pips=input.systemsPips??4;if(!Number.isFinite(pips)||pips<0||pips>4){throw new RangeError("shieldRecovery: systemsPips must be a finite number from 0 to 4")}for(const field of["strength","regenRate","brokenRegenRate","distributorDraw","systemsCapacity","systemsRecharge"]){requireFiniteNonNegative(field,input[field])}const recharge=capacitorRechargeAtPips(input.systemsRecharge,pips);const half=input.strength/2;return{regenRate:input.regenRate,brokenRegenRate:input.brokenRegenRate,recoveryTime:16+phaseTime(half,input.brokenRegenRate,input.distributorDraw,input.systemsCapacity,recharge),regenTime:phaseTime(half,input.regenRate,input.distributorDraw,input.systemsCapacity,recharge)}}function cellBankSummary(banks){for(const[index,bank]of banks.entries()){if(typeof bank.powered!=="boolean"){throw new TypeError(`cellBankSummary: banks[${index}].powered must be a boolean`)}}const metrics=banks.map(bank=>Object.freeze({slot:bank.slot,symbol:bank.symbol,reinforcement:bank.reinforcementRate*bank.duration,cells:bank.cells,spinUp:bank.spinUp,duration:bank.duration,heat:bank.heat,powered:bank.powered}));return Object.freeze({banks:Object.freeze(metrics),totalRestorable:metrics.reduce((sum,bank)=>sum+(bank.powered?bank.reinforcement*bank.cells:0),0),totalCells:metrics.reduce((sum,bank)=>sum+(bank.powered?bank.cells:0),0)})}export{cellBankSummary,shieldRecovery};//# sourceMappingURL=chunk-VZZUNSDF.js.map
1
+ import{capacitorRechargeAtPips}from"./chunk-JOTAOI5T.js";var phaseTime=(megajoules,rate,draw,capacity,recharge)=>{if(megajoules<=0)return 0;if(rate<=0)return Infinity;if(draw<=0)return megajoules/rate;const drain=rate*draw-recharge;if(drain<=0)return megajoules/rate;const capacitorLifetime=capacity/drain;const beforeEmpty=capacitorLifetime*rate;if(megajoules<=beforeEmpty)return megajoules/rate;if(recharge<=0)return Infinity;return capacitorLifetime+(megajoules-beforeEmpty)/(recharge/draw)};var requireFiniteNonNegative=(name,value)=>{if(!Number.isFinite(value)||value<0){throw new RangeError(`shieldRecovery: ${name} must be a finite non-negative number`)}};function shieldRecovery(input){const pips=input.systemsPips??4;if(!Number.isFinite(pips)||pips<0||pips>4){throw new RangeError("shieldRecovery: systemsPips must be a finite number from 0 to 4")}for(const field of["strength","regenRate","brokenRegenRate","distributorDraw","systemsCapacity","systemsRecharge"]){requireFiniteNonNegative(field,input[field])}const recharge=capacitorRechargeAtPips(input.systemsRecharge,pips);const half=input.strength/2;return Object.freeze({regenRate:input.regenRate,brokenRegenRate:input.brokenRegenRate,recoveryTime:16+phaseTime(half,input.brokenRegenRate,input.distributorDraw,input.systemsCapacity,recharge),regenTime:phaseTime(half,input.regenRate,input.distributorDraw,input.systemsCapacity,recharge)})}function cellBankSummary(banks){for(const[index,bank]of banks.entries()){if(typeof bank.powered!=="boolean"){throw new TypeError(`cellBankSummary: banks[${index}].powered must be a boolean`)}}const metrics=banks.map(bank=>Object.freeze({slot:bank.slot,symbol:bank.symbol,reinforcement:bank.reinforcementRate*bank.duration,cells:bank.cells,spinUp:bank.spinUp,duration:bank.duration,heat:bank.heat,powered:bank.powered}));return Object.freeze({banks:Object.freeze(metrics),totalRestorable:metrics.reduce((sum,bank)=>sum+(bank.powered?bank.reinforcement*bank.cells:0),0),totalCells:metrics.reduce((sum,bank)=>sum+(bank.powered?bank.cells:0),0)})}export{cellBankSummary,shieldRecovery};//# sourceMappingURL=chunk-4KJ7CR74.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ships/shield-recovery.ts"],"names":["capacitorRechargeAtPips","phaseTime","megajoules","rate","draw","capacity","recharge","Infinity","drain","capacitorLifetime","beforeEmpty","requireFiniteNonNegative","name","value","Number","isFinite","RangeError","shieldRecovery","input","pips","systemsPips","field","systemsRecharge","half","strength","regenRate","brokenRegenRate","recoveryTime","distributorDraw","systemsCapacity","regenTime","cellBankSummary","banks","index","bank","entries","powered","TypeError","metrics","map","Object","freeze","slot","symbol","reinforcement","reinforcementRate","duration","cells","spinUp","heat","totalRestorable","reduce","sum","totalCells"],"mappings":"O,kDA4FA,IAAMC,UAAY,CACdC,WACAC,KACAC,KACAC,SACAC,YAEA,GAAIJ,YAAc,EAAG,OAAO,EAC5B,GAAIC,MAAQ,EAAG,OAAOI,SACtB,GAAIH,MAAQ,EAAG,OAAOF,WAAaC,KACnC,MAAMK,MAAQL,KAAOC,KAAOE,SAC5B,GAAIE,OAAS,EAAG,OAAON,WAAaC,KACpC,MAAMM,kBAAoBJ,SAAWG,MACrC,MAAME,YAAcD,kBAAoBN,KACxC,GAAID,YAAcQ,YAAa,OAAOR,WAAaC,KACnD,GAAIG,UAAY,EAAG,OAAOC,SAC1B,OAAOE,mBAAqBP,WAAaQ,cAAgBJ,SAAWF,OAGxE,IAAMO,yBAA2B,CAACC,KAAcC,SAC5C,IAAKC,OAAOC,SAASF,QAAUA,MAAQ,EAAG,CACtC,MAAM,IAAIG,WAAW,mBAAmBJ,4CAC5C,GAoBG,SAASK,eAAeC,OAC3B,MAAMC,KAAOD,MAAME,aAAe,EAClC,IAAKN,OAAOC,SAASI,OAASA,KAAO,GAAKA,KAAO,EAAG,CAChD,MAAM,IAAIH,WAAW,kEACzB,CACA,IAAA,MAAWK,QAAS,CAChB,WACA,YACA,kBACA,kBACA,kBACA,mBACQ,CACRV,yBAAyBU,MAAOH,MAAMG,OAC1C,CACA,MAAMf,SAAWN,wBAAwBkB,MAAMI,gBAAiBH,MAChE,MAAMI,KAAOL,MAAMM,SAAW,EAC9B,MAAO,CACHC,UAAWP,MAAMO,UACjBC,gBAAiBR,MAAMQ,gBACvBC,aACI,GACA1B,UACIsB,KACAL,MAAMQ,gBACNR,MAAMU,gBACNV,MAAMW,gBACNvB,UAERwB,UAAW7B,UACPsB,KACAL,MAAMO,UACNP,MAAMU,gBACNV,MAAMW,gBACNvB,UAGZ,CAmBO,SAASyB,gBAAgBC,OAC5B,IAAA,MAAYC,MAAOC,QAASF,MAAMG,UAAW,CACzC,UAAWD,KAAKE,UAAY,UAAW,CACnC,MAAM,IAAIC,UAAU,0BAA0BJ,mCAClD,CACJ,CACA,MAAMK,QAAUN,MAAMO,IAAKL,MACvBM,OAAOC,OAAO,CACVC,KAAMR,KAAKQ,KACXC,OAAQT,KAAKS,OACbC,cAAeV,KAAKW,kBAAoBX,KAAKY,SAC7CC,MAAOb,KAAKa,MACZC,OAAQd,KAAKc,OACbF,SAAUZ,KAAKY,SACfG,KAAMf,KAAKe,KACXb,QAASF,KAAKE,WAGtB,OAAOI,OAAOC,OAAO,CACjBT,MAAOQ,OAAOC,OAAOH,SACrBY,gBAAiBZ,QAAQa,OACrB,CAACC,IAAKlB,OAASkB,KAAOlB,KAAKE,QAAUF,KAAKU,cAAgBV,KAAKa,MAAQ,GACvE,GAEJM,WAAYf,QAAQa,OAAO,CAACC,IAAKlB,OAASkB,KAAOlB,KAAKE,QAAUF,KAAKa,MAAQ,GAAI,IAEzF,QAAAhB,gBAAAd"}
1
+ {"version":3,"sources":["../src/ships/shield-recovery.ts"],"names":["capacitorRechargeAtPips","phaseTime","megajoules","rate","draw","capacity","recharge","Infinity","drain","capacitorLifetime","beforeEmpty","requireFiniteNonNegative","name","value","Number","isFinite","RangeError","shieldRecovery","input","pips","systemsPips","field","systemsRecharge","half","strength","Object","freeze","regenRate","brokenRegenRate","recoveryTime","distributorDraw","systemsCapacity","regenTime","cellBankSummary","banks","index","bank","entries","powered","TypeError","metrics","map","slot","symbol","reinforcement","reinforcementRate","duration","cells","spinUp","heat","totalRestorable","reduce","sum","totalCells"],"mappings":"O,kDA0GA,IAAMC,UAAY,CACdC,WACAC,KACAC,KACAC,SACAC,YAEA,GAAIJ,YAAc,EAAG,OAAO,EAC5B,GAAIC,MAAQ,EAAG,OAAOI,SACtB,GAAIH,MAAQ,EAAG,OAAOF,WAAaC,KACnC,MAAMK,MAAQL,KAAOC,KAAOE,SAC5B,GAAIE,OAAS,EAAG,OAAON,WAAaC,KACpC,MAAMM,kBAAoBJ,SAAWG,MACrC,MAAME,YAAcD,kBAAoBN,KACxC,GAAID,YAAcQ,YAAa,OAAOR,WAAaC,KACnD,GAAIG,UAAY,EAAG,OAAOC,SAC1B,OAAOE,mBAAqBP,WAAaQ,cAAgBJ,SAAWF,OAGxE,IAAMO,yBAA2B,CAACC,KAAcC,SAC5C,IAAKC,OAAOC,SAASF,QAAUA,MAAQ,EAAG,CACtC,MAAM,IAAIG,WAAW,mBAAmBJ,4CAC5C,GAoBG,SAASK,eAAeC,OAC3B,MAAMC,KAAOD,MAAME,aAAe,EAClC,IAAKN,OAAOC,SAASI,OAASA,KAAO,GAAKA,KAAO,EAAG,CAChD,MAAM,IAAIH,WAAW,kEACzB,CACA,IAAA,MAAWK,QAAS,CAChB,WACA,YACA,kBACA,kBACA,kBACA,mBACQ,CACRV,yBAAyBU,MAAOH,MAAMG,OAC1C,CACA,MAAMf,SAAWN,wBAAwBkB,MAAMI,gBAAiBH,MAChE,MAAMI,KAAOL,MAAMM,SAAW,EAC9B,OAAOC,OAAOC,OAAO,CACjBC,UAAWT,MAAMS,UACjBC,gBAAiBV,MAAMU,gBACvBC,aACI,GACA5B,UACIsB,KACAL,MAAMU,gBACNV,MAAMY,gBACNZ,MAAMa,gBACNzB,UAER0B,UAAW/B,UACPsB,KACAL,MAAMS,UACNT,MAAMY,gBACNZ,MAAMa,gBACNzB,WAGZ,CAmBO,SAAS2B,gBAAgBC,OAC5B,IAAA,MAAYC,MAAOC,QAASF,MAAMG,UAAW,CACzC,UAAWD,KAAKE,UAAY,UAAW,CACnC,MAAM,IAAIC,UAAU,0BAA0BJ,mCAClD,CACJ,CACA,MAAMK,QAAUN,MAAMO,IAAKL,MACvBX,OAAOC,OAAO,CACVgB,KAAMN,KAAKM,KACXC,OAAQP,KAAKO,OACbC,cAAeR,KAAKS,kBAAoBT,KAAKU,SAC7CC,MAAOX,KAAKW,MACZC,OAAQZ,KAAKY,OACbF,SAAUV,KAAKU,SACfG,KAAMb,KAAKa,KACXX,QAASF,KAAKE,WAGtB,OAAOb,OAAOC,OAAO,CACjBQ,MAAOT,OAAOC,OAAOc,SACrBU,gBAAiBV,QAAQW,OACrB,CAACC,IAAKhB,OAASgB,KAAOhB,KAAKE,QAAUF,KAAKQ,cAAgBR,KAAKW,MAAQ,GACvE,GAEJM,WAAYb,QAAQW,OAAO,CAACC,IAAKhB,OAASgB,KAAOhB,KAAKE,QAAUF,KAAKW,MAAQ,GAAI,IAEzF,QAAAd,gBAAAhB"}
@@ -1 +1 @@
1
- import{sectorNameFromGridPosition}from"./chunk-DVL5RBKX.js";import{describeValue}from"./chunk-PKWVG2JY.js";var GALAXY_ORIGIN=Object.freeze({x:-49985,y:-40985,z:-24105});var SECTOR_EDGE_LY=1280;function sectorGridPositionFromGalacticPosition(position){const sector={sectorX:Math.floor((position.x-GALAXY_ORIGIN.x)/SECTOR_EDGE_LY),sectorY:Math.floor((position.y-GALAXY_ORIGIN.y)/SECTOR_EDGE_LY),sectorZ:Math.floor((position.z-GALAXY_ORIGIN.z)/SECTOR_EDGE_LY)};for(const v of[sector.sectorX,sector.sectorY,sector.sectorZ]){if(!Number.isInteger(v)||v<0||v>127){throw new RangeError(`Galactic position outside the sector grid: ${describeValue(position)}`)}}return sector}function sectorNameFromGalacticPosition(position){return sectorNameFromGridPosition(sectorGridPositionFromGalacticPosition(position))}export{GALAXY_ORIGIN,SECTOR_EDGE_LY,sectorGridPositionFromGalacticPosition,sectorNameFromGalacticPosition};//# sourceMappingURL=chunk-6EUVIZAS.js.map
1
+ import{sectorNameFromGridPosition}from"./chunk-H47K3UWG.js";import{describeValue}from"./chunk-PKWVG2JY.js";var GALAXY_ORIGIN=Object.freeze({x:-49985,y:-40985,z:-24105});var SECTOR_EDGE_LY=1280;function sectorGridPositionFromGalacticPosition(position){const sector={sectorX:Math.floor((position.x-GALAXY_ORIGIN.x)/SECTOR_EDGE_LY),sectorY:Math.floor((position.y-GALAXY_ORIGIN.y)/SECTOR_EDGE_LY),sectorZ:Math.floor((position.z-GALAXY_ORIGIN.z)/SECTOR_EDGE_LY)};for(const v of[sector.sectorX,sector.sectorY,sector.sectorZ]){if(!Number.isInteger(v)||v<0||v>127){throw new RangeError(`Galactic position outside the sector grid: ${describeValue(position)}`)}}return sector}function sectorNameFromGalacticPosition(position){return sectorNameFromGridPosition(sectorGridPositionFromGalacticPosition(position))}export{GALAXY_ORIGIN,SECTOR_EDGE_LY,sectorGridPositionFromGalacticPosition,sectorNameFromGalacticPosition};//# sourceMappingURL=chunk-4QYTVSNR.js.map
@@ -1 +1 @@
1
- import{getLocalizedName,createLocalizedNameIndex}from"./chunk-RVIYOHYF.js";var engineering_group_names_default={powerPlants:{en:"Power Plants",pt:"Geradores de Energia",ru:"Силовые установки"},guardianPowerPlants:{en:"Guardian Power Plants"},thrusters:{en:"Thrusters",pt:"Propulsores",ru:"Маневровые двигатели"},frameShiftDrives:{en:"Frame Shift Drives",pt:"Motores de Distorção de Fase",ru:"Рамочно-сместительные двигатели"},powerDistributors:{en:"Power Distributors",pt:"Distribuidores de Energia",ru:"Распределители питания"},guardianPowerDistributors:{en:"Guardian Power Distributors"},frameShiftDrivesSCO:{en:"Frame Shift Drives (SCO)"},shieldGenerators:{en:"Shield Generators",pt:"Geradores de Escudo",ru:"Щитогенератор"},shieldCellBanks:{en:"Shield Cell Banks",pt:"Bancos de Célula de Escudo",ru:"Щитонакопитель"},hullReinforcements:{en:"Hull Reinforcements",pt:"Reforços de Casco",ru:"Наборы для усиления корпуса"},guardianHullReinforcements:{en:"Guardian Hull Reinforcements"},pulseLasers:{en:"Pulse Lasers",pt:"Lasers de Pulso",ru:"Импульсные лазеры"},burstLasers:{en:"Burst Lasers",pt:"Lasers de Rajada",ru:"Пульсирующие лазеры"},beamLasers:{en:"Beam Lasers",pt:"Lasers Contínuos",ru:"Пучковые лазеры"},cannons:{en:"Cannons",pt:"Canhões",ru:"Пушки"},fragmentCannons:{en:"Fragment Cannons",pt:"Canhões de Fragmentos",ru:"Залповые орудия"},multiCannons:{en:"Multi-Cannons",pt:"Canhões de Repetição",ru:"Многоствольные орудия"},plasmaAccelerators:{en:"Plasma Accelerators",pt:"Aceleradores de Plasma",ru:"Ускорители плазмы"},railGuns:{en:"Rail Guns",pt:"Canhões Elétricos",ru:"Рельсотроны"},missiles:{en:"Missiles",pt:"Mísseis",ru:"Ракеты"},mines:{en:"Mines",pt:"Minas",ru:"Мины"},torpedoes:{en:"Torpedoes",pt:"Torpedos",ru:"Торпеды"},shieldBoosters:{en:"Shield Boosters",pt:"Potenciadores de Escudo",ru:"Усилители щита"},bulkheads:{en:"Bulkheads",pt:"Blindagem",ru:"Переборки"},lifeSupports:{en:"Life Supports",pt:"Suportes de Vida",ru:"Системы жизнеобеспечения"},sensors:{en:"Sensors",pt:"Sensores",ru:"Сенсоры"},autoFieldMaintenanceUnits:{en:"Auto Field-Maintenance Units",pt:"Unidades de Automanutenção em Campo",ru:"Блоки АПР"},collectionLimpets:{en:"Collection Limpets",pt:"Drones Coletores",ru:"Контроллеры дронов-сборщиков"},fsdBoosters:{en:"FSD Boosters",pt:"Potenciadores de MDD",ru:"Ускорители FSD Стражей"},fsdInterdictors:{en:"FSD Interdictors",pt:"Interditores de MDD",ru:"Перехватчики FSD"},fuelScoops:{en:"Fuel Scoops",pt:"Coletores de Combustível",ru:"Топливозаборники"},fuelTransferLimpets:{en:"Fuel Transfer Limpets",pt:"Drones de Combustível",ru:"Контроллеры дронов-заправщиков"},hatchBreakerLimpets:{en:"Hatch Breaker Limpets",pt:"Drones Quebra-Escotilha",ru:"Контроллеры дронов-взломщиков трюмов"},moduleReinforcements:{en:"Module Reinforcements",pt:"Reforços de Módulo",ru:"Наборы для усиления модулей"},prospectingLimpets:{en:"Prospecting Limpets",pt:"Drones Prospectores",ru:"Контроллеры дронов-геологоразведчиков"},refineries:{en:"Refineries",pt:"Refinarias",ru:"Очистители"},shieldReinforcements:{en:"Shield Reinforcements",pt:"Reforços de Escudo",ru:"Усилители щита"},surfaceScanners:{en:"Surface Scanners",pt:"Scanners de Superfície",ru:"Подробные сканеры поверхности"},chaffLaunchers:{en:"Chaff Launchers",pt:"Lançadores de Chaff",ru:"Разбрасыватели дипольных отражателей"},ecms:{en:"ECMs",pt:"CMEs",ru:"ЭПД"},heatSinkLaunchers:{en:"Heat Sink Launchers",pt:"Lançadores de Dissapador Térmico",ru:"Теплоотводные катапульты"},killWarrantScanners:{en:"Kill Warrant Scanners",pt:"Scanners de Registro Criminal",ru:"Сканеры преступников"},manifestScanners:{en:"Manifest Scanners",pt:"Scanners de Manifesto",ru:"Сканеры содержимого"},pointDefence:{en:"Point Defence",pt:"Defesa de Ponto",ru:"Точечная оборона"},wakeScanners:{en:"Wake Scanners",pt:"Scanners de Rastro",ru:"Сканеры следа FSD"},guardianGauss:{en:"Exp - Guardian Gauss",pt:"Exp - Gauss Guardian",ru:"Экс - Пушки Гаусса Стражей"},guardianPlasma:{en:"Exp - Guardian Plasma",pt:"Exp - Plasma Guardian",ru:"Экс - Плазменные пушки Стражей"},guardianShard:{en:"Exp - Guardian Shard",pt:"Exp - Fragmentos Guardian",ru:"Экс - Осколочные орудия Стражей"}};var NAMES=/* @__PURE__ */createLocalizedNameIndex(engineering_group_names_default);function getEngineeringGroupName(groupId,locale){return getLocalizedName(NAMES,groupId,locale,"getEngineeringGroupName","groupId")}export{getEngineeringGroupName};//# sourceMappingURL=chunk-EKQCVCMK.js.map
1
+ import{getLocalizedName,createLocalizedNameIndex}from"./chunk-RVIYOHYF.js";var engineering_group_names_default={powerPlants:{en:"Power Plants",pt:"Geradores de Energia",ru:"Силовые установки"},guardianPowerPlants:{en:"Guardian Power Plants"},thrusters:{en:"Thrusters",pt:"Propulsores",ru:"Маневровые двигатели"},frameShiftDrives:{en:"Frame Shift Drives",pt:"Motores de Distorção de Fase",ru:"Рамочно-сместительные двигатели"},powerDistributors:{en:"Power Distributors",pt:"Distribuidores de Energia",ru:"Распределители питания"},guardianPowerDistributors:{en:"Guardian Power Distributors"},frameShiftDrivesSCO:{en:"Frame Shift Drives (SCO)"},shieldGenerators:{en:"Shield Generators",pt:"Geradores de Escudo",ru:"Щитогенератор"},shieldCellBanks:{en:"Shield Cell Banks",pt:"Bancos de Célula de Escudo",ru:"Щитонакопитель"},hullReinforcements:{en:"Hull Reinforcements",pt:"Reforços de Casco",ru:"Наборы для усиления корпуса"},guardianHullReinforcements:{en:"Guardian Hull Reinforcements"},pulseLasers:{en:"Pulse Lasers",pt:"Lasers de Pulso",ru:"Импульсные лазеры"},burstLasers:{en:"Burst Lasers",pt:"Lasers de Rajada",ru:"Пульсирующие лазеры"},beamLasers:{en:"Beam Lasers",pt:"Lasers Contínuos",ru:"Пучковые лазеры"},cannons:{en:"Cannons",pt:"Canhões",ru:"Пушки"},fragmentCannons:{en:"Fragment Cannons",pt:"Canhões de Fragmentos",ru:"Залповые орудия"},multiCannons:{en:"Multi-Cannons",pt:"Canhões de Repetição",ru:"Многоствольные орудия"},plasmaAccelerators:{en:"Plasma Accelerators",pt:"Aceleradores de Plasma",ru:"Ускорители плазмы"},railGuns:{en:"Rail Guns",pt:"Canhões Elétricos",ru:"Рельсотроны"},missiles:{en:"Missiles",pt:"Mísseis",ru:"Ракеты"},mines:{en:"Mines",pt:"Minas",ru:"Мины"},torpedoes:{en:"Torpedoes",pt:"Torpedos",ru:"Торпеды"},shieldBoosters:{en:"Shield Boosters",pt:"Potenciadores de Escudo",ru:"Усилители щита"},bulkheads:{en:"Bulkheads",pt:"Blindagem",ru:"Переборки"},lifeSupports:{en:"Life Supports",pt:"Suportes de Vida",ru:"Системы жизнеобеспечения"},sensors:{en:"Sensors",pt:"Sensores",ru:"Сенсоры"},autoFieldMaintenanceUnits:{en:"Auto Field-Maintenance Units",pt:"Unidades de Automanutenção em Campo",ru:"Блоки АПР"},collectionLimpets:{en:"Collection Limpets",pt:"Drones Coletores",ru:"Контроллеры дронов-сборщиков"},fsdBoosters:{en:"FSD Boosters",pt:"Potenciadores de MDD",ru:"Ускорители FSD Стражей"},fsdInterdictors:{en:"FSD Interdictors",pt:"Interditores de MDD",ru:"Перехватчики FSD"},fuelScoops:{en:"Fuel Scoops",pt:"Coletores de Combustível",ru:"Топливозаборники"},fuelTransferLimpets:{en:"Fuel Transfer Limpets",pt:"Drones de Combustível",ru:"Контроллеры дронов-заправщиков"},hatchBreakerLimpets:{en:"Hatch Breaker Limpets",pt:"Drones Quebra-Escotilha",ru:"Контроллеры дронов-взломщиков трюмов"},moduleReinforcements:{en:"Module Reinforcements",pt:"Reforços de Módulo",ru:"Наборы для усиления модулей"},prospectingLimpets:{en:"Prospecting Limpets",pt:"Drones Prospectores",ru:"Контроллеры дронов-геологоразведчиков"},refineries:{en:"Refineries",pt:"Refinarias",ru:"Очистители"},shieldReinforcements:{en:"Shield Reinforcements",pt:"Reforços de Escudo",ru:"Усилители щита"},surfaceScanners:{en:"Surface Scanners",pt:"Scanners de Superfície",ru:"Подробные сканеры поверхности"},chaffLaunchers:{en:"Chaff Launchers",pt:"Lançadores de Chaff",ru:"Разбрасыватели дипольных отражателей"},ecms:{en:"ECMs",pt:"CMEs",ru:"ЭПД"},heatSinkLaunchers:{en:"Heat Sink Launchers",pt:"Lançadores de Dissapador Térmico",ru:"Теплоотводные катапульты"},killWarrantScanners:{en:"Kill Warrant Scanners",pt:"Scanners de Registro Criminal",ru:"Сканеры преступников"},manifestScanners:{en:"Manifest Scanners",pt:"Scanners de Manifesto",ru:"Сканеры содержимого"},pointDefence:{en:"Point Defence",pt:"Defesa de Ponto",ru:"Точечная оборона"},wakeScanners:{en:"Wake Scanners",pt:"Scanners de Rastro",ru:"Сканеры следа FSD"},guardianGauss:{en:"Exp - Guardian Gauss",pt:"Exp - Gauss Guardian",ru:"Экс - Пушки Гаусса Стражей"},guardianPlasma:{en:"Exp - Guardian Plasma",pt:"Exp - Plasma Guardian",ru:"Экс - Плазменные пушки Стражей"},guardianShard:{en:"Exp - Guardian Shard",pt:"Exp - Fragmentos Guardian",ru:"Экс - Осколочные орудия Стражей"}};var NAMES=/* @__PURE__ */createLocalizedNameIndex(engineering_group_names_default);function getEngineeringGroupName(groupId,locale){return getLocalizedName(NAMES,groupId,locale,"getEngineeringGroupName","groupId")}export{getEngineeringGroupName};//# sourceMappingURL=chunk-5ZVYRX6Z.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/i18n/engineering-groups.ts"],"names":["getLocalizedName","createLocalizedNameIndex","engineering_group_names_default","NAMES","getEngineeringGroupName","groupId","locale"],"mappings":"O,siIASA,IAAMG,qBAAAF,yBAAiDC,iCAkBhD,SAASE,wBAAwBC,QAAiBC,QACrD,OAAON,iBAAiBG,MAAOE,QAASC,OAAQ,0BAA2B,UAC/E,QAAAF"}
1
+ {"version":3,"sources":["../src/i18n/engineering-groups.ts"],"names":["getLocalizedName","createLocalizedNameIndex","engineering_group_names_default","NAMES","getEngineeringGroupName","groupId","locale"],"mappings":"O,siIASA,IAAMG,qBAAAF,yBAAiDC,iCAmBhD,SAASE,wBAAwBC,QAAiBC,QACrD,OAAON,iBAAiBG,MAAOE,QAASC,OAAQ,0BAA2B,UAC/E,QAAAF"}
@@ -0,0 +1 @@
1
+ import{assertEquipmentGrade}from"./chunk-2W5MW376.js";import{findInKeyIndex,createKeyIndex}from"./chunk-BKWLI44T.js";import{deepFreeze}from"./chunk-DURKO7JU.js";var weapons_default=[{symbol:"wpn_s_pistol_kinetic_sauto",name:"Karma P-15",upgradeGroup:"karma",class:"pistol",slot:"secondary",damageType:"kinetic",fireMode:"semi-automatic",rateOfFire:10,magazineSize:24,reserveAmmo:120,headshotMultiplier:2,effectiveRange:25,grades:{1:{damage:1.4,modificationSlots:0},2:{damage:1.8,modificationSlots:1},3:{damage:2.4,modificationSlots:2},4:{damage:3.8,modificationSlots:3},5:{damage:4.1,modificationSlots:4}},engineeringType:"kinetic"},{symbol:"wpn_m_assaultrifle_kinetic_fauto",name:"Karma AR-50",upgradeGroup:"karma",class:"rifle",slot:"primary",damageType:"kinetic",fireMode:"automatic",rateOfFire:9.5,magazineSize:50,reserveAmmo:200,headshotMultiplier:2,effectiveRange:50,grades:{1:{damage:1,modificationSlots:0},2:{damage:1.2,modificationSlots:1},3:{damage:1.6,modificationSlots:2},4:{damage:2.2,modificationSlots:3},5:{damage:2.8,modificationSlots:4}},engineeringType:"kinetic"},{symbol:"wpn_m_submachinegun_kinetic_fauto",name:"Karma C-44",upgradeGroup:"karma",class:"carbine",slot:"primary",damageType:"kinetic",fireMode:"automatic",rateOfFire:13.3,magazineSize:45,reserveAmmo:360,headshotMultiplier:2,effectiveRange:25,grades:{1:{damage:.6,modificationSlots:0},2:{damage:.9,modificationSlots:1},3:{damage:1.1,modificationSlots:2},4:{damage:1.5,modificationSlots:3},5:{damage:1.9,modificationSlots:4}},engineeringType:"kinetic"},{symbol:"wpn_m_launcher_rocket_sauto",name:"Karma L-6",upgradeGroup:"karma",class:"launcher",slot:"primary",damageType:"explosive",fireMode:"automatic",rateOfFire:1,magazineSize:2,reserveAmmo:8,headshotMultiplier:1,effectiveRange:300,grades:{1:{damage:40,modificationSlots:0},2:{damage:52.4,modificationSlots:1},3:{damage:69.2,modificationSlots:2},4:{damage:90,modificationSlots:3},5:{damage:119.2,modificationSlots:4}},engineeringType:"kinetic"},{symbol:"wpn_m_assaultrifle_laser_fauto",name:"TK Aphelion",upgradeGroup:"takada",class:"rifle",slot:"primary",damageType:"thermal",fireMode:"automatic",rateOfFire:5.7,magazineSize:25,reserveAmmo:150,headshotMultiplier:1,effectiveRange:70,grades:{1:{damage:1.6,modificationSlots:0},2:{damage:2.1,modificationSlots:1},3:{damage:2.7,modificationSlots:2},4:{damage:3.6,modificationSlots:3},5:{damage:4.7,modificationSlots:4}},engineeringType:"laser"},{symbol:"wpn_m_submachinegun_laser_fauto",name:"TK Eclipse",upgradeGroup:"takada",class:"carbine",slot:"primary",damageType:"thermal",fireMode:"automatic",rateOfFire:10,magazineSize:45,reserveAmmo:280,headshotMultiplier:1,effectiveRange:25,grades:{1:{damage:.9,modificationSlots:0},2:{damage:1.1,modificationSlots:1},3:{damage:1.5,modificationSlots:2},4:{damage:1.9,modificationSlots:3},5:{damage:2.5,modificationSlots:4}},engineeringType:"laser"},{symbol:"wpn_s_pistol_laser_sauto",name:"TK Zenith",upgradeGroup:"takada",class:"pistol",slot:"secondary",damageType:"thermal",fireMode:"burst",rateOfFire:5.7,magazineSize:18,reserveAmmo:90,headshotMultiplier:1,effectiveRange:35,grades:{1:{damage:1.7,modificationSlots:0},2:{damage:2.2,modificationSlots:1},3:{damage:2.9,modificationSlots:2},4:{damage:3.8,modificationSlots:3},5:{damage:5,modificationSlots:4}},engineeringType:"laser"},{symbol:"wpn_m_sniper_plasma_charged",name:"Manticore Executioner",upgradeGroup:"manticore",class:"sniper",slot:"primary",damageType:"plasma",fireMode:"semi-automatic",rateOfFire:.8,magazineSize:3,reserveAmmo:30,headshotMultiplier:3,effectiveRange:100,grades:{1:{damage:15,modificationSlots:0},2:{damage:19.6,modificationSlots:1},3:{damage:26,modificationSlots:2},4:{damage:34,modificationSlots:3},5:{damage:44.7,modificationSlots:4}},engineeringType:"plasma"},{symbol:"wpn_s_pistol_plasma_charged",name:"Manticore Tormentor",upgradeGroup:"manticore",class:"pistol",slot:"secondary",damageType:"plasma",fireMode:"semi-automatic",rateOfFire:1.7,magazineSize:6,reserveAmmo:72,headshotMultiplier:2,effectiveRange:15,grades:{1:{damage:7.5,modificationSlots:0},2:{damage:9.8,modificationSlots:1},3:{damage:13,modificationSlots:2},4:{damage:17,modificationSlots:3},5:{damage:22.4,modificationSlots:4}},engineeringType:"plasma"},{symbol:"wpn_m_shotgun_plasma_doublebarrel",name:"Manticore Intimidator",upgradeGroup:"manticore",class:"shotgun",slot:"primary",damageType:"plasma",fireMode:"semi-automatic",rateOfFire:1.3,magazineSize:2,reserveAmmo:24,headshotMultiplier:1.5,effectiveRange:7,grades:{1:{damage:1.8,modificationSlots:0},2:{damage:2.3,modificationSlots:1},3:{damage:3,modificationSlots:2},4:{damage:4,modificationSlots:3},5:{damage:5.2,modificationSlots:4}},engineeringType:"plasma"},{symbol:"wpn_m_assaultrifle_plasma_fauto",name:"Manticore Oppressor",upgradeGroup:"manticore",class:"rifle",slot:"primary",damageType:"plasma",fireMode:"automatic",rateOfFire:6.7,magazineSize:50,reserveAmmo:300,headshotMultiplier:1.5,effectiveRange:35,grades:{1:{damage:1.1,modificationSlots:0},2:{damage:1.4,modificationSlots:1},3:{damage:1.9,modificationSlots:2},4:{damage:2.5,modificationSlots:3},5:{damage:3.275,modificationSlots:4}},engineeringType:"plasma"}];var PERSONAL_WEAPONS=deepFreeze(weapons_default);var BY_SYMBOL=/* @__PURE__ */createKeyIndex(PERSONAL_WEAPONS,"symbol");var BY_NAME=/* @__PURE__ */createKeyIndex(PERSONAL_WEAPONS,"name");function getPersonalWeaponBySymbol(symbol){return findInKeyIndex(BY_SYMBOL,symbol,"getPersonalWeaponBySymbol: symbol")}function getPersonalWeaponByName(name){return findInKeyIndex(BY_NAME,name,"getPersonalWeaponByName: name")}function getPersonalWeaponGrade(weapon,grade){assertEquipmentGrade(grade,"getPersonalWeaponGrade");return weapon.grades[String(grade)]??null}export{PERSONAL_WEAPONS,getPersonalWeaponByName,getPersonalWeaponBySymbol,getPersonalWeaponGrade};//# sourceMappingURL=chunk-6GJHUWMO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/equipment/weapons.ts"],"names":["assertEquipmentGrade","findInKeyIndex","createKeyIndex","deepFreeze","weapons_default","symbol","name","grades","PERSONAL_WEAPONS","BY_SYMBOL","BY_NAME","getPersonalWeaponBySymbol","getPersonalWeaponByName","getPersonalWeaponGrade","weapon","grade","String"],"mappings":"O,uiKA+EO,IAAMQ,iBAA8CL,WACvDC,iBAGJ,IAAMK,yBAA4BP,eAAeM,iBAAkB,UACnE,IAAME,uBAA0BR,eAAeM,iBAAkB,QAgB1D,SAASG,0BAA0BN,QACtC,OAAOJ,eAAeQ,UAAWJ,OAAQ,oCAC7C,CAgBO,SAASO,wBAAwBN,MACpC,OAAOL,eAAeS,QAASJ,KAAM,gCACzC,CAkBO,SAASO,uBACZC,OACAC,OAEAf,qBAAqBe,MAAO,0BAC5B,OAAOD,OAAOP,OAAOS,OAAOD,SAAkC,IAClE,QAAAP,iBAAAI,wBAAAD,0BAAAE"}
@@ -0,0 +1 @@
1
+ import{capacitorRechargeAtPips}from"./chunk-JOTAOI5T.js";import{systemsResistance,mapDamageTypes,effectiveHitPoints}from"./chunk-JGOAQLYW.js";import{requirePips}from"./chunk-QJ7GB6FF.js";var DAMAGE_TYPES=["kinetic","thermal","explosive","caustic"];function requireFiniteNonNegative(scope,name,value){if(!Number.isFinite(value)||value<0){throw new RangeError(`${scope}: ${name} must be a finite non-negative number`)}}function shieldCapacitorMetrics(input){const scope="shieldCapacitorMetrics";const systemsPips=input.systemsPips??4;requirePips(scope,"systemsPips",systemsPips);for(const field of["strength","systemsCapacity","systemsRecharge"]){requireFiniteNonNegative(scope,field,input[field])}const resistances=input.resistances;if(typeof resistances!=="object"||resistances===null){throw new TypeError(`${scope}: resistances must carry the four damage types`)}for(const type of DAMAGE_TYPES){if(!Number.isFinite(input.resistances[type])){throw new RangeError(`${scope}: resistances.${type} must be a finite number`)}}const sysResistance=systemsResistance(systemsPips);const effectiveResistances=Object.freeze(mapDamageTypes(type=>1-(1-input.resistances[type])*(1-sysResistance)));return Object.freeze({systemsPips:systemsPips,capacity:input.systemsCapacity,rechargeRate:capacitorRechargeAtPips(input.systemsRecharge,systemsPips),systemsResistance:sysResistance,effectiveResistances:effectiveResistances,effectiveHitPoints:Object.freeze(effectiveHitPoints(input.strength,effectiveResistances))})}export{shieldCapacitorMetrics};//# sourceMappingURL=chunk-6L56LWTT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ships/shield-capacitor.ts"],"names":["capacitorRechargeAtPips","systemsResistance","mapDamageTypes","effectiveHitPoints","requirePips","DAMAGE_TYPES","requireFiniteNonNegative","scope","name","value","Number","isFinite","RangeError","shieldCapacitorMetrics","input","systemsPips","field","resistances","TypeError","type","sysResistance","effectiveResistances","Object","freeze","capacity","systemsCapacity","rechargeRate","systemsRecharge","strength"],"mappings":"O,oLAwGA,IAAMK,aAAsC,CAAC,UAAW,UAAW,YAAa,WAEhF,SAASC,yBAAyBC,MAAeC,KAAcC,OAC3D,IAAKC,OAAOC,SAASF,QAAUA,MAAQ,EAAG,CACtC,MAAM,IAAIG,WAAW,GAAGL,UAAUC,4CACtC,CACJ,CAuCO,SAASK,uBAAuBC,OACnC,MAAMP,MAAQ,yBACd,MAAMQ,YAAcD,MAAMC,aAAe,EAGzCX,YAAYG,MAAO,cAAeQ,aAClC,IAAA,MAAWC,QAAS,CAAC,WAAY,kBAAmB,mBAA6B,CAC7EV,yBAAyBC,MAAOS,MAAOF,MAAME,OACjD,CACA,MAAMC,YAAuBH,MAAMG,YACnC,UAAWA,cAAgB,UAAYA,cAAgB,KAAM,CACzD,MAAM,IAAIC,UAAU,GAAGX,sDAC3B,CACA,IAAA,MAAWY,QAAQd,aAAc,CAC7B,IAAKK,OAAOC,SAASG,MAAMG,YAAYE,OAAQ,CAC3C,MAAM,IAAIP,WAAW,GAAGL,sBAAsBY,+BAClD,CACJ,CAEA,MAAMC,cAAgBnB,kBAAkBc,aAExC,MAAMM,qBAA0CC,OAAOC,OACnDrB,eAAgBiB,MAAS,GAAK,EAAIL,MAAMG,YAAYE,QAAU,EAAIC,iBAEtE,OAAOE,OAAOC,OAAO,CACjBR,wBACAS,SAAUV,MAAMW,gBAChBC,aAAc1B,wBAAwBc,MAAMa,gBAAiBZ,aAC7Dd,kBAAmBmB,cACnBC,0CACAlB,mBAAoBmB,OAAOC,OAAOpB,mBAAmBW,MAAMc,SAAUP,wBAE7E,QAAAR"}
@@ -1 +1 @@
1
- var MAX_TOTAL_RANGE_JUMPS=1e5;function requireNonNegative(scope,name,value){if(!Number.isFinite(value)||value<0){throw new RangeError(`${scope}: ${name} must be a finite non-negative number`)}}function requirePositive(scope,name,value){if(!Number.isFinite(value)||value<=0){throw new RangeError(`${scope}: fsd.${name} must be a finite positive number`)}}function validateFsd(scope,fsd){requirePositive(scope,"optMass",fsd.optMass);requireNonNegative(scope,"fsd.maxFuel",fsd.maxFuel);requirePositive(scope,"fuelMul",fsd.fuelMul);requirePositive(scope,"fuelPower",fsd.fuelPower);if(fsd.jumpBoost!==void 0){requireNonNegative(scope,"fsd.jumpBoost",fsd.jumpBoost)}}function frameShiftDriveMassFactorUnchecked(mass,fuel,fsd){return fsd.optMass/(mass+fuel)}function singleJumpRangeUnchecked(mass,fuel,fsd,scope){const burn=Math.min(fuel,fsd.maxFuel);if(burn<=0||mass+fuel<=0)return 0;const base=Math.pow(burn/fsd.fuelMul,1/fsd.fuelPower)*frameShiftDriveMassFactorUnchecked(mass,fuel,fsd);const range=base+(fsd.jumpBoost??0);if(!Number.isFinite(range)){throw new RangeError(`${scope}: parameters produce a non-finite range`)}return range}function frameShiftDriveMassFactor(mass,fuel,fsd){const scope="frameShiftDriveMassFactor";requireNonNegative(scope,"mass",mass);requireNonNegative(scope,"fuel",fuel);requirePositive(scope,"optMass",fsd.optMass);if(mass+fuel<=0){throw new RangeError(`${scope}: mass plus fuel must be positive`)}return frameShiftDriveMassFactorUnchecked(mass,fuel,fsd)}function singleJumpRange(mass,fuel,fsd){const scope="singleJumpRange";requireNonNegative(scope,"mass",mass);requireNonNegative(scope,"fuel",fuel);validateFsd(scope,fsd);return singleJumpRangeUnchecked(mass,fuel,fsd,scope)}function fuelPerJump(distance,mass,fuel,fsd){const scope="fuelPerJump";requireNonNegative(scope,"distance",distance);requireNonNegative(scope,"mass",mass);requireNonNegative(scope,"fuel",fuel);validateFsd(scope,fsd);if(distance<=0)return 0;const burn=Math.min(fuel,fsd.maxFuel);const maxDistance=singleJumpRangeUnchecked(mass,fuel,fsd,scope);if(maxDistance<=0)return 0;const cost=Math.pow(distance/maxDistance,fsd.fuelPower)*burn;return Math.min(cost,burn)}function totalRange(mass,fuel,fsd){const scope="totalRange";requireNonNegative(scope,"mass",mass);requireNonNegative(scope,"fuel",fuel);validateFsd(scope,fsd);if(fsd.maxFuel<=0)return{range:0,jumps:0};const jumps=fuel>0?Math.max(1,Math.ceil(fuel/fsd.maxFuel)):0;if(!Number.isFinite(jumps)||jumps>MAX_TOTAL_RANGE_JUMPS){throw new RangeError(`${scope}: fuel and fsd.maxFuel require more than ${MAX_TOTAL_RANGE_JUMPS} jumps`)}let range=0;let remaining=fuel;for(let i=0;i<jumps;i++){range+=singleJumpRangeUnchecked(mass,remaining,fsd,scope);if(!Number.isFinite(range)){throw new RangeError(`${scope}: parameters produce a non-finite total range`)}remaining=Math.max(0,remaining-fsd.maxFuel)}return{range:range,jumps:jumps}}export{frameShiftDriveMassFactor,fuelPerJump,singleJumpRange,totalRange};//# sourceMappingURL=chunk-GQ5GX5TB.js.map
1
+ var MAX_TOTAL_RANGE_JUMPS=1e5;function requireNonNegative(scope,name,value){if(!Number.isFinite(value)||value<0){throw new RangeError(`${scope}: ${name} must be a finite non-negative number`)}}function requirePositive(scope,name,value){if(!Number.isFinite(value)||value<=0){throw new RangeError(`${scope}: fsd.${name} must be a finite positive number`)}}function validateFsd(scope,fsd){requirePositive(scope,"optMass",fsd.optMass);requireNonNegative(scope,"fsd.maxFuel",fsd.maxFuel);requirePositive(scope,"fuelMul",fsd.fuelMul);requirePositive(scope,"fuelPower",fsd.fuelPower);if(fsd.jumpBoost!==void 0){requireNonNegative(scope,"fsd.jumpBoost",fsd.jumpBoost)}}function frameShiftDriveMassFactorUnchecked(mass,fuel,fsd){return fsd.optMass/(mass+fuel)}function singleJumpRangeUnchecked(mass,fuel,fsd,scope){const burn=Math.min(fuel,fsd.maxFuel);if(burn<=0||mass+fuel<=0)return 0;const base=Math.pow(burn/fsd.fuelMul,1/fsd.fuelPower)*frameShiftDriveMassFactorUnchecked(mass,fuel,fsd);const range=base+(fsd.jumpBoost??0);if(!Number.isFinite(range)){throw new RangeError(`${scope}: parameters produce a non-finite range`)}return range}function frameShiftDriveMassFactor(mass,fuel,fsd){const scope="frameShiftDriveMassFactor";requireNonNegative(scope,"mass",mass);requireNonNegative(scope,"fuel",fuel);requirePositive(scope,"optMass",fsd.optMass);if(mass+fuel<=0){throw new RangeError(`${scope}: mass plus fuel must be positive`)}return frameShiftDriveMassFactorUnchecked(mass,fuel,fsd)}function singleJumpRange(mass,fuel,fsd){const scope="singleJumpRange";requireNonNegative(scope,"mass",mass);requireNonNegative(scope,"fuel",fuel);validateFsd(scope,fsd);return singleJumpRangeUnchecked(mass,fuel,fsd,scope)}function fuelPerJump(distance,mass,fuel,fsd){const scope="fuelPerJump";requireNonNegative(scope,"distance",distance);requireNonNegative(scope,"mass",mass);requireNonNegative(scope,"fuel",fuel);validateFsd(scope,fsd);if(distance<=0)return 0;const burn=Math.min(fuel,fsd.maxFuel);const maxDistance=singleJumpRangeUnchecked(mass,fuel,fsd,scope);if(maxDistance<=0)return 0;const cost=Math.pow(distance/maxDistance,fsd.fuelPower)*burn;return Math.min(cost,burn)}function totalRange(mass,fuel,fsd){const scope="totalRange";requireNonNegative(scope,"mass",mass);requireNonNegative(scope,"fuel",fuel);validateFsd(scope,fsd);if(fsd.maxFuel<=0)return Object.freeze({range:0,jumps:0});const jumps=fuel>0?Math.max(1,Math.ceil(fuel/fsd.maxFuel)):0;if(!Number.isFinite(jumps)||jumps>MAX_TOTAL_RANGE_JUMPS){throw new RangeError(`${scope}: fuel and fsd.maxFuel require more than ${MAX_TOTAL_RANGE_JUMPS} jumps`)}let range=0;let remaining=fuel;for(let i=0;i<jumps;i++){range+=singleJumpRangeUnchecked(mass,remaining,fsd,scope);if(!Number.isFinite(range)){throw new RangeError(`${scope}: parameters produce a non-finite total range`)}remaining=Math.max(0,remaining-fsd.maxFuel)}return Object.freeze({range:range,jumps:jumps})}export{frameShiftDriveMassFactor,fuelPerJump,singleJumpRange,totalRange};//# sourceMappingURL=chunk-6O4NRRSB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ships/jump-range.ts"],"names":["MAX_TOTAL_RANGE_JUMPS","requireNonNegative","scope","name","value","Number","isFinite","RangeError","requirePositive","validateFsd","fsd","optMass","maxFuel","fuelMul","fuelPower","jumpBoost","frameShiftDriveMassFactorUnchecked","mass","fuel","singleJumpRangeUnchecked","burn","Math","min","base","pow","range","frameShiftDriveMassFactor","singleJumpRange","fuelPerJump","distance","maxDistance","cost","totalRange","Object","freeze","jumps","max","ceil","remaining","i"],"mappings":"AA+DA,IAAMA,sBAAwB,IAG9B,SAASC,mBAAmBC,MAAeC,KAAcC,OACrD,IAAKC,OAAOC,SAASF,QAAUA,MAAQ,EAAG,CACtC,MAAM,IAAIG,WAAW,GAAGL,UAAUC,4CACtC,CACJ,CAGA,SAASK,gBAAgBN,MAAeC,KAAcC,OAClD,IAAKC,OAAOC,SAASF,QAAUA,OAAS,EAAG,CACvC,MAAM,IAAIG,WAAW,GAAGL,cAAcC,wCAC1C,CACJ,CAGA,SAASM,YAAYP,MAAeQ,KAChCF,gBAAgBN,MAAO,UAAWQ,IAAIC,SACtCV,mBAAmBC,MAAO,cAAeQ,IAAIE,SAC7CJ,gBAAgBN,MAAO,UAAWQ,IAAIG,SACtCL,gBAAgBN,MAAO,YAAaQ,IAAII,WACxC,GAAIJ,IAAIK,iBAAc,EAAW,CAC7Bd,mBAAmBC,MAAO,gBAAiBQ,IAAIK,UACnD,CACJ,CAGA,SAASC,mCACLC,KACAC,KACAR,KAEA,OAAOA,IAAIC,SAAWM,KAAOC,KACjC,CAGA,SAASC,yBACLF,KACAC,KACAR,IACAR,OAEA,MAAMkB,KAAOC,KAAKC,IAAIJ,KAAMR,IAAIE,SAChC,GAAIQ,MAAQ,GAAKH,KAAOC,MAAQ,EAAG,OAAO,EAC1C,MAAMK,KACFF,KAAKG,IAAIJ,KAAOV,IAAIG,QAAS,EAAIH,IAAII,WACrCE,mCAAmCC,KAAMC,KAAMR,KACnD,MAAMe,MAAQF,MAAQb,IAAIK,WAAa,GACvC,IAAKV,OAAOC,SAASmB,OAAQ,CACzB,MAAM,IAAIlB,WAAW,GAAGL,+CAC5B,CACA,OAAOuB,KACX,CA4BO,SAASC,0BACZT,KACAC,KACAR,KAEA,MAAMR,MAAQ,4BACdD,mBAAmBC,MAAO,OAAQe,MAClChB,mBAAmBC,MAAO,OAAQgB,MAClCV,gBAAgBN,MAAO,UAAWQ,IAAIC,SACtC,GAAIM,KAAOC,MAAQ,EAAG,CAClB,MAAM,IAAIX,WAAW,GAAGL,yCAC5B,CACA,OAAOc,mCAAmCC,KAAMC,KAAMR,IAC1D,CA0BO,SAASiB,gBAAgBV,KAAcC,KAAcR,KACxD,MAAMR,MAAQ,kBACdD,mBAAmBC,MAAO,OAAQe,MAClChB,mBAAmBC,MAAO,OAAQgB,MAClCT,YAAYP,MAAOQ,KACnB,OAAOS,yBAAyBF,KAAMC,KAAMR,IAAKR,MACrD,CA0BO,SAAS0B,YACZC,SACAZ,KACAC,KACAR,KAEA,MAAMR,MAAQ,cACdD,mBAAmBC,MAAO,WAAY2B,UACtC5B,mBAAmBC,MAAO,OAAQe,MAClChB,mBAAmBC,MAAO,OAAQgB,MAClCT,YAAYP,MAAOQ,KACnB,GAAImB,UAAY,EAAG,OAAO,EAC1B,MAAMT,KAAOC,KAAKC,IAAIJ,KAAMR,IAAIE,SAChC,MAAMkB,YAAcX,yBAAyBF,KAAMC,KAAMR,IAAKR,OAC9D,GAAI4B,aAAe,EAAG,OAAO,EAC7B,MAAMC,KAAOV,KAAKG,IAAIK,SAAWC,YAAapB,IAAII,WAAaM,KAC/D,OAAOC,KAAKC,IAAIS,KAAMX,KAC1B,CA4BO,SAASY,WACZf,KACAC,KACAR,KAEA,MAAMR,MAAQ,aACdD,mBAAmBC,MAAO,OAAQe,MAClChB,mBAAmBC,MAAO,OAAQgB,MAClCT,YAAYP,MAAOQ,KACnB,GAAIA,IAAIE,SAAW,EAAG,OAAOqB,OAAOC,OAAO,CAAET,MAAO,EAAGU,MAAO,IAC9D,MAAMA,MAAQjB,KAAO,EAAIG,KAAKe,IAAI,EAAGf,KAAKgB,KAAKnB,KAAOR,IAAIE,UAAY,EACtE,IAAKP,OAAOC,SAAS6B,QAAUA,MAAQnC,sBAAuB,CAC1D,MAAM,IAAIO,WACN,GAAGL,iDAAiDF,8BAE5D,CACA,IAAIyB,MAAQ,EACZ,IAAIa,UAAYpB,KAChB,IAAA,IAASqB,EAAI,EAAGA,EAAIJ,MAAOI,IAAK,CAC5Bd,OAASN,yBAAyBF,KAAMqB,UAAW5B,IAAKR,OACxD,IAAKG,OAAOC,SAASmB,OAAQ,CACzB,MAAM,IAAIlB,WAAW,GAAGL,qDAC5B,CACAoC,UAAYjB,KAAKe,IAAI,EAAGE,UAAY5B,IAAIE,QAC5C,CACA,OAAOqB,OAAOC,OAAO,CAAET,YAAOU,aAClC,QAAAT,0BAAAE,YAAAD,gBAAAK"}