@elite-dangerous-almanac/core 0.1.8 → 0.2.1

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 (316) hide show
  1. package/PROVENANCE/i18n/SOURCES.md +2 -2
  2. package/PROVENANCE/ships/SOURCES.md +34 -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-37JIMWLK.js +1 -0
  22. package/dist/chunk-37JIMWLK.js.map +1 -0
  23. package/dist/chunk-4CBMQULR.js +1 -0
  24. package/dist/{chunk-4ZGUSHTP.js.map → chunk-4CBMQULR.js.map} +1 -1
  25. package/dist/{chunk-6EUVIZAS.js → chunk-4QYTVSNR.js} +1 -1
  26. package/dist/chunk-5VWACBTN.js +1 -0
  27. package/dist/chunk-5VWACBTN.js.map +1 -0
  28. package/dist/{chunk-EKQCVCMK.js → chunk-5ZVYRX6Z.js} +1 -1
  29. package/dist/{chunk-EKQCVCMK.js.map → chunk-5ZVYRX6Z.js.map} +1 -1
  30. package/dist/chunk-65FZECUX.js +1 -0
  31. package/dist/chunk-65FZECUX.js.map +1 -0
  32. package/dist/chunk-6BFQIYGZ.js +1 -0
  33. package/dist/chunk-6BFQIYGZ.js.map +1 -0
  34. package/dist/chunk-6GJHUWMO.js +1 -0
  35. package/dist/chunk-6GJHUWMO.js.map +1 -0
  36. package/dist/chunk-6HA2YIKW.js +1 -0
  37. package/dist/chunk-6HA2YIKW.js.map +1 -0
  38. package/dist/{chunk-7EE5VIHR.js → chunk-6HMIF2RJ.js} +1 -1
  39. package/dist/chunk-6S36AVA4.js +1 -0
  40. package/dist/chunk-6S36AVA4.js.map +1 -0
  41. package/dist/{chunk-WNGQ3IAM.js → chunk-6UNAD74Z.js} +1 -1
  42. package/dist/{chunk-WNGQ3IAM.js.map → chunk-6UNAD74Z.js.map} +1 -1
  43. package/dist/chunk-6WTUY6ZX.js +1 -0
  44. package/dist/chunk-6WTUY6ZX.js.map +1 -0
  45. package/dist/{chunk-JPBMRJFC.js → chunk-77I24V6B.js} +1 -1
  46. package/dist/chunk-77I24V6B.js.map +1 -0
  47. package/dist/chunk-77TT4K53.js +1 -0
  48. package/dist/chunk-7ATBEOVC.js +1 -0
  49. package/dist/chunk-7ATBEOVC.js.map +1 -0
  50. package/dist/chunk-A4QKXXZD.js +1 -0
  51. package/dist/chunk-A4QKXXZD.js.map +1 -0
  52. package/dist/{chunk-6EPYVBAX.js → chunk-A6OINYNP.js} +1 -1
  53. package/dist/chunk-AAE4KZ2V.js +1 -0
  54. package/dist/chunk-AAE4KZ2V.js.map +1 -0
  55. package/dist/{chunk-Q5XOGATC.js → chunk-AIEC3LBT.js} +1 -1
  56. package/dist/{chunk-QY3L5BKN.js → chunk-APEG4ZER.js} +1 -1
  57. package/dist/{chunk-Q3QCLNVG.js → chunk-AYAKU4YA.js} +1 -1
  58. package/dist/chunk-AYAKU4YA.js.map +1 -0
  59. package/dist/chunk-B7EYTZRK.js +1 -0
  60. package/dist/chunk-B7EYTZRK.js.map +1 -0
  61. package/dist/{chunk-EBAHNZ36.js → chunk-CIULJH3G.js} +1 -1
  62. package/dist/{chunk-EBAHNZ36.js.map → chunk-CIULJH3G.js.map} +1 -1
  63. package/dist/{chunk-SNADUQSJ.js → chunk-CJK2IBI2.js} +1 -1
  64. package/dist/{chunk-SNADUQSJ.js.map → chunk-CJK2IBI2.js.map} +1 -1
  65. package/dist/{chunk-DYPOL3CI.js → chunk-CJQ37JII.js} +1 -1
  66. package/dist/chunk-CJQ37JII.js.map +1 -0
  67. package/dist/{chunk-Z6XMXMVI.js → chunk-DBDCOHI4.js} +1 -1
  68. package/dist/chunk-DBDCOHI4.js.map +1 -0
  69. package/dist/{chunk-AFVYCQWL.js → chunk-DCB4COCL.js} +1 -1
  70. package/dist/{chunk-AFVYCQWL.js.map → chunk-DCB4COCL.js.map} +1 -1
  71. package/dist/{chunk-CJWFY6OX.js → chunk-DSMLYA2M.js} +1 -1
  72. package/dist/{chunk-CJWFY6OX.js.map → chunk-DSMLYA2M.js.map} +1 -1
  73. package/dist/{chunk-UXBCLFGU.js → chunk-DWRNXUAX.js} +1 -1
  74. package/dist/{chunk-UXBCLFGU.js.map → chunk-DWRNXUAX.js.map} +1 -1
  75. package/dist/chunk-F44QX47A.js +1 -0
  76. package/dist/chunk-F44QX47A.js.map +1 -0
  77. package/dist/{chunk-EVJ32UF3.js → chunk-FA5JVXVG.js} +1 -1
  78. package/dist/{chunk-EVJ32UF3.js.map → chunk-FA5JVXVG.js.map} +1 -1
  79. package/dist/{chunk-4S6WB7QR.js → chunk-FF2X4K5P.js} +1 -1
  80. package/dist/chunk-FF2X4K5P.js.map +1 -0
  81. package/dist/chunk-GGQMIQPC.js +1 -0
  82. package/dist/chunk-GGQMIQPC.js.map +1 -0
  83. package/dist/{chunk-QTZPA2FR.js → chunk-GLWPSVFV.js} +1 -1
  84. package/dist/chunk-GLWPSVFV.js.map +1 -0
  85. package/dist/{chunk-EYGVDJ2I.js → chunk-GMTAFUAG.js} +1 -1
  86. package/dist/{chunk-Z43DN4PY.js → chunk-GTEHRZPN.js} +1 -1
  87. package/dist/{chunk-Z43DN4PY.js.map → chunk-GTEHRZPN.js.map} +1 -1
  88. package/dist/chunk-H47K3UWG.js +1 -0
  89. package/dist/chunk-H47K3UWG.js.map +1 -0
  90. package/dist/{chunk-PA5EITW5.js → chunk-HUYYGTRM.js} +1 -1
  91. package/dist/{chunk-PA5EITW5.js.map → chunk-HUYYGTRM.js.map} +1 -1
  92. package/dist/{chunk-HKXXFIRI.js → chunk-ITKZKREP.js} +1 -1
  93. package/dist/chunk-IWFQ4ZKF.js +1 -0
  94. package/dist/chunk-IWFQ4ZKF.js.map +1 -0
  95. package/dist/{chunk-Y6UZWNP4.js → chunk-J7BM5NGK.js} +1 -1
  96. package/dist/{chunk-Y6UZWNP4.js.map → chunk-J7BM5NGK.js.map} +1 -1
  97. package/dist/chunk-JET673E5.js +1 -0
  98. package/dist/chunk-JET673E5.js.map +1 -0
  99. package/dist/chunk-JMAXSXXQ.js +1 -0
  100. package/dist/chunk-JMAXSXXQ.js.map +1 -0
  101. package/dist/chunk-JO52LYO3.js +1 -0
  102. package/dist/chunk-M2TCZKRT.js +1 -0
  103. package/dist/chunk-M2TCZKRT.js.map +1 -0
  104. package/dist/chunk-M4FZRDAH.js +1 -0
  105. package/dist/chunk-M4FZRDAH.js.map +1 -0
  106. package/dist/{chunk-JWWYAMGD.js → chunk-MGRDB2BZ.js} +1 -1
  107. package/dist/{chunk-JWWYAMGD.js.map → chunk-MGRDB2BZ.js.map} +1 -1
  108. package/dist/{chunk-MKGJPVPS.js → chunk-MRTTQYT5.js} +1 -1
  109. package/dist/{chunk-MKGJPVPS.js.map → chunk-MRTTQYT5.js.map} +1 -1
  110. package/dist/chunk-MTJ4MS7W.js +1 -0
  111. package/dist/chunk-MTJ4MS7W.js.map +1 -0
  112. package/dist/chunk-NIURLW2F.js +1 -0
  113. package/dist/chunk-NIURLW2F.js.map +1 -0
  114. package/dist/chunk-OJC6AUL7.js +1 -0
  115. package/dist/chunk-OJC6AUL7.js.map +1 -0
  116. package/dist/chunk-OLKNYGGT.js +1 -0
  117. package/dist/chunk-OLKNYGGT.js.map +1 -0
  118. package/dist/chunk-PL75RTA2.js +1 -0
  119. package/dist/{chunk-2VPVZELZ.js.map → chunk-PL75RTA2.js.map} +1 -1
  120. package/dist/chunk-Q5ALV3DI.js +1 -0
  121. package/dist/chunk-Q5ALV3DI.js.map +1 -0
  122. package/dist/{chunk-SQS7672E.js → chunk-Q6YDPREF.js} +1 -1
  123. package/dist/chunk-SG6YLUQ4.js +1 -0
  124. package/dist/chunk-SG6YLUQ4.js.map +1 -0
  125. package/dist/{chunk-OVUHQEH5.js → chunk-T4MKUKYS.js} +1 -1
  126. package/dist/{chunk-OVUHQEH5.js.map → chunk-T4MKUKYS.js.map} +1 -1
  127. package/dist/{chunk-J42ZXLBL.js → chunk-T62GO4AA.js} +1 -1
  128. package/dist/chunk-T62GO4AA.js.map +1 -0
  129. package/dist/{chunk-E3BRVGJJ.js → chunk-TBZJIQ5P.js} +1 -1
  130. package/dist/{chunk-E3BRVGJJ.js.map → chunk-TBZJIQ5P.js.map} +1 -1
  131. package/dist/chunk-VEEBJFJ7.js +1 -0
  132. package/dist/chunk-VEEBJFJ7.js.map +1 -0
  133. package/dist/{chunk-L747RVPO.js → chunk-VQJXRPYI.js} +1 -1
  134. package/dist/{chunk-L747RVPO.js.map → chunk-VQJXRPYI.js.map} +1 -1
  135. package/dist/chunk-VTMCSCXV.js +1 -0
  136. package/dist/chunk-VTMCSCXV.js.map +1 -0
  137. package/dist/chunk-XQJERZUS.js +1 -0
  138. package/dist/chunk-XQJERZUS.js.map +1 -0
  139. package/dist/commodities/commodities-all.js +1 -1
  140. package/dist/commodities/commodities-rare.js +1 -1
  141. package/dist/commodities/commodities-standard.js +1 -1
  142. package/dist/commodities/commodities.d.ts +20 -10
  143. package/dist/commodities/commodities.js +1 -1
  144. package/dist/commodities/index.d.ts +15 -4
  145. package/dist/commodities/index.js +1 -1
  146. package/dist/equipment/index.js +1 -1
  147. package/dist/equipment/modification-costs.d.ts +2 -1
  148. package/dist/equipment/modification-costs.js.map +1 -1
  149. package/dist/equipment/modification-journal.js +1 -1
  150. package/dist/equipment/modifications.d.ts +2 -1
  151. package/dist/equipment/modifications.js +1 -1
  152. package/dist/equipment/suits.d.ts +6 -3
  153. package/dist/equipment/suits.js +1 -1
  154. package/dist/equipment/upgrade-costs.d.ts +8 -4
  155. package/dist/equipment/upgrade-costs.js +1 -1
  156. package/dist/equipment/upgrade-costs.js.map +1 -1
  157. package/dist/equipment/weapons.d.ts +13 -5
  158. package/dist/equipment/weapons.js +1 -1
  159. package/dist/i18n/blueprints.d.ts +6 -6
  160. package/dist/i18n/blueprints.js +1 -1
  161. package/dist/i18n/diagnostics.d.ts +1 -13
  162. package/dist/i18n/engineering-groups.d.ts +1 -0
  163. package/dist/i18n/engineering-groups.js +1 -1
  164. package/dist/i18n/experimental-effect-descriptions.d.ts +4 -3
  165. package/dist/i18n/experimental-effect-descriptions.js +1 -1
  166. package/dist/i18n/experimental-effects.d.ts +5 -4
  167. package/dist/i18n/experimental-effects.js +1 -1
  168. package/dist/i18n/index.d.ts +1 -13
  169. package/dist/i18n/index.js +1 -1
  170. package/dist/i18n/pre-engineered.d.ts +7 -6
  171. package/dist/i18n/pre-engineered.js +1 -1
  172. package/dist/materials/index.d.ts +16 -4
  173. package/dist/materials/index.js +1 -1
  174. package/dist/materials/materials-all.js +1 -1
  175. package/dist/materials/materials-encoded.js +1 -1
  176. package/dist/materials/materials-manufactured.js +1 -1
  177. package/dist/materials/materials-raw.js +1 -1
  178. package/dist/materials/materials.d.ts +36 -19
  179. package/dist/materials/materials.js +1 -1
  180. package/dist/materials/micro-resources.d.ts +18 -7
  181. package/dist/materials/micro-resources.js +1 -1
  182. package/dist/ships/armour.d.ts +20 -4
  183. package/dist/ships/armour.js +1 -1
  184. package/dist/ships/blueprint-costs.d.ts +20 -17
  185. package/dist/ships/blueprint-costs.js +1 -1
  186. package/dist/ships/blueprint-journal.d.ts +9 -8
  187. package/dist/ships/blueprint-journal.js +1 -1
  188. package/dist/ships/blueprints.d.ts +14 -12
  189. package/dist/ships/blueprints.js +1 -1
  190. package/dist/ships/build-metrics.d.ts +1061 -0
  191. package/dist/ships/build-metrics.js +1 -0
  192. package/dist/ships/build-metrics.js.map +1 -0
  193. package/dist/ships/distributor.d.ts +10 -3
  194. package/dist/ships/distributor.js +1 -1
  195. package/dist/ships/engineering-options.d.ts +8 -6
  196. package/dist/ships/engineering-options.js +1 -1
  197. package/dist/ships/engineering.d.ts +2 -16
  198. package/dist/ships/engineering.js +1 -1
  199. package/dist/ships/experimental-effect-costs.d.ts +5 -5
  200. package/dist/ships/experimental-effect-costs.js +1 -1
  201. package/dist/ships/experimental-effects.d.ts +9 -8
  202. package/dist/ships/experimental-effects.js +1 -1
  203. package/dist/ships/heat.d.ts +7 -2
  204. package/dist/ships/heat.js +1 -1
  205. package/dist/ships/index.d.ts +35 -23
  206. package/dist/ships/index.js +1 -1
  207. package/dist/ships/jump-range.d.ts +10 -3
  208. package/dist/ships/jump-range.js +1 -1
  209. package/dist/ships/loadout-calculations.d.ts +1 -1
  210. package/dist/ships/loadout-calculations.js +1 -1
  211. package/dist/ships/loadout-validation.d.ts +111 -5
  212. package/dist/ships/loadout-validation.js +1 -1
  213. package/dist/ships/mobility-capacitor.d.ts +90 -0
  214. package/dist/ships/mobility-capacitor.js +1 -0
  215. package/dist/ships/mobility-capacitor.js.map +1 -0
  216. package/dist/ships/mobility.d.ts +29 -17
  217. package/dist/ships/mobility.js +1 -1
  218. package/dist/ships/modules-all.js +1 -1
  219. package/dist/ships/modules-core.js +1 -1
  220. package/dist/ships/modules-internal.js +1 -1
  221. package/dist/ships/modules.d.ts +21 -1
  222. package/dist/ships/modules.js +1 -1
  223. package/dist/ships/power.d.ts +12 -5
  224. package/dist/ships/power.js +1 -1
  225. package/dist/ships/pre-engineered-stats.d.ts +20 -13
  226. package/dist/ships/pre-engineered-stats.js +1 -1
  227. package/dist/ships/pre-engineered.d.ts +6 -6
  228. package/dist/ships/pre-engineered.js +1 -1
  229. package/dist/ships/resistances.d.ts +2 -2
  230. package/dist/ships/resistances.js +1 -1
  231. package/dist/ships/shield-capacitor.d.ts +133 -0
  232. package/dist/ships/shield-capacitor.js +1 -0
  233. package/dist/ships/shield-capacitor.js.map +1 -0
  234. package/dist/ships/shield-recovery.d.ts +16 -2
  235. package/dist/ships/shield-recovery.js +1 -1
  236. package/dist/ships/shields.d.ts +86 -28
  237. package/dist/ships/shields.js +1 -1
  238. package/dist/ships/ship-loadout.d.ts +176 -815
  239. package/dist/ships/ship-loadout.js +1 -1
  240. package/dist/ships/ships.d.ts +7 -6
  241. package/dist/ships/ships.js +1 -1
  242. package/dist/ships/slef.d.ts +5 -2
  243. package/dist/ships/slef.js +1 -1
  244. package/dist/ships/source-purchase.d.ts +2 -1
  245. package/dist/ships/source-purchase.js +1 -1
  246. package/dist/ships/weapons-capacitor.d.ts +10 -3
  247. package/dist/ships/weapons-capacitor.js +1 -1
  248. package/dist/ships/weapons.d.ts +22 -6
  249. package/dist/ships/weapons.js +1 -1
  250. package/dist/{system-address-DYsN1qOT.d.ts → system-address-cyJaeZIS.d.ts} +2 -1
  251. package/package.json +17 -2
  252. package/dist/chunk-2FHHMYDC.js +0 -1
  253. package/dist/chunk-2FHHMYDC.js.map +0 -1
  254. package/dist/chunk-2TW4ZBI3.js +0 -1
  255. package/dist/chunk-2TW4ZBI3.js.map +0 -1
  256. package/dist/chunk-2VPVZELZ.js +0 -1
  257. package/dist/chunk-3BM5BHI3.js +0 -1
  258. package/dist/chunk-3BM5BHI3.js.map +0 -1
  259. package/dist/chunk-4S6WB7QR.js.map +0 -1
  260. package/dist/chunk-4ZGUSHTP.js +0 -1
  261. package/dist/chunk-6BO5JJNI.js +0 -1
  262. package/dist/chunk-6BO5JJNI.js.map +0 -1
  263. package/dist/chunk-B4ZSTOM4.js +0 -1
  264. package/dist/chunk-B4ZSTOM4.js.map +0 -1
  265. package/dist/chunk-CX7B67OI.js +0 -1
  266. package/dist/chunk-CX7B67OI.js.map +0 -1
  267. package/dist/chunk-DVL5RBKX.js +0 -1
  268. package/dist/chunk-DVL5RBKX.js.map +0 -1
  269. package/dist/chunk-DYPOL3CI.js.map +0 -1
  270. package/dist/chunk-FGXWVFN6.js +0 -1
  271. package/dist/chunk-FGXWVFN6.js.map +0 -1
  272. package/dist/chunk-FMPRCYKY.js +0 -1
  273. package/dist/chunk-FMPRCYKY.js.map +0 -1
  274. package/dist/chunk-G3265B27.js +0 -1
  275. package/dist/chunk-G3265B27.js.map +0 -1
  276. package/dist/chunk-GQ5GX5TB.js +0 -1
  277. package/dist/chunk-GQ5GX5TB.js.map +0 -1
  278. package/dist/chunk-IOJXLDJN.js +0 -1
  279. package/dist/chunk-IOJXLDJN.js.map +0 -1
  280. package/dist/chunk-IYU4WLFM.js +0 -1
  281. package/dist/chunk-IYU4WLFM.js.map +0 -1
  282. package/dist/chunk-J42ZXLBL.js.map +0 -1
  283. package/dist/chunk-JPBMRJFC.js.map +0 -1
  284. package/dist/chunk-JQG4C67D.js +0 -1
  285. package/dist/chunk-LJI7VXJD.js +0 -1
  286. package/dist/chunk-LJI7VXJD.js.map +0 -1
  287. package/dist/chunk-OCND33TO.js +0 -1
  288. package/dist/chunk-OCND33TO.js.map +0 -1
  289. package/dist/chunk-P2QOL63K.js +0 -1
  290. package/dist/chunk-P2QOL63K.js.map +0 -1
  291. package/dist/chunk-Q3QCLNVG.js.map +0 -1
  292. package/dist/chunk-QTZPA2FR.js.map +0 -1
  293. package/dist/chunk-RLUS76LZ.js +0 -1
  294. package/dist/chunk-RLUS76LZ.js.map +0 -1
  295. package/dist/chunk-TEOJCBSG.js +0 -1
  296. package/dist/chunk-TEOJCBSG.js.map +0 -1
  297. package/dist/chunk-TMMGS6TC.js +0 -1
  298. package/dist/chunk-TMMGS6TC.js.map +0 -1
  299. package/dist/chunk-V4C6FIE2.js +0 -1
  300. package/dist/chunk-VZZUNSDF.js +0 -1
  301. package/dist/chunk-VZZUNSDF.js.map +0 -1
  302. package/dist/chunk-W6EPHHTS.js +0 -1
  303. package/dist/chunk-W6EPHHTS.js.map +0 -1
  304. package/dist/chunk-Z6XMXMVI.js.map +0 -1
  305. package/dist/chunk-ZNCXENNB.js +0 -1
  306. package/dist/chunk-ZNCXENNB.js.map +0 -1
  307. /package/dist/{chunk-6EUVIZAS.js.map → chunk-4QYTVSNR.js.map} +0 -0
  308. /package/dist/{chunk-7EE5VIHR.js.map → chunk-6HMIF2RJ.js.map} +0 -0
  309. /package/dist/{chunk-JQG4C67D.js.map → chunk-77TT4K53.js.map} +0 -0
  310. /package/dist/{chunk-6EPYVBAX.js.map → chunk-A6OINYNP.js.map} +0 -0
  311. /package/dist/{chunk-Q5XOGATC.js.map → chunk-AIEC3LBT.js.map} +0 -0
  312. /package/dist/{chunk-QY3L5BKN.js.map → chunk-APEG4ZER.js.map} +0 -0
  313. /package/dist/{chunk-EYGVDJ2I.js.map → chunk-GMTAFUAG.js.map} +0 -0
  314. /package/dist/{chunk-HKXXFIRI.js.map → chunk-ITKZKREP.js.map} +0 -0
  315. /package/dist/{chunk-V4C6FIE2.js.map → chunk-JO52LYO3.js.map} +0 -0
  316. /package/dist/{chunk-SQS7672E.js.map → chunk-Q6YDPREF.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
@@ -415,6 +415,29 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
415
415
  size-determined `fsdHeatRate` above), so no calculation reads the flag; the
416
416
  overcharged supercruise behaviour the drives are named for has no published figures
417
417
  and none are stored.
418
+ - **`grantOnly` — the articles that arrive granted rather than sold.** Fifteen records
419
+ carry `true`: the nine `*_free` starter fittings (power plant, thrusters, drive, life
420
+ support, distributor, sensors, fuel tank, shield generator, cargo rack) and the six
421
+ `*_Free` Vessel Hangars. Every other record omits it, and nothing carries `false`.
422
+ - **Source:** Frontier's own symbol naming, and for the six hangars the pinned CAPI
423
+ response, which lists them `bundle: true` under the grant tokens
424
+ `ELITE_V_MKIFIGHTERBAY_FREE` / `ELITE_V_MKIIFIGHTERBAY_FREE` — see "Records sourced
425
+ outside the baseline registries" below, which also reads that response's zero as the
426
+ bundle charge rather than a purchase price. No registry publishes a field for
427
+ "offered in outfitting": coriolis-data and EDSY carry these records beside the sold
428
+ ones.
429
+ - **Derivation:** the `_free` / `_Free` symbol family is the classification, applied
430
+ once here so a consumer reads a datum instead of matching the suffix — the same rule
431
+ `slot` and `supercruiseOvercharge` follow above. Each starter record is its priced
432
+ twin bar the price (§Prices), so a screen offering both would show one article twice,
433
+ once unpriced.
434
+ - **It is not a statement about price, and the flag is not extended on a missing one.**
435
+ Eleven further records carry no `cost` — the five size-8 drives, the three Mk II
436
+ Vessel Hangars, the two unsold Corrosion Resistant Cargo Racks and the 1B shield
437
+ generator — and none is flagged. The two racks are the closest case and still fail
438
+ the rule: no source states them as a hull or bundle grant, and each is its own
439
+ identity at a capacity no other rack carries, not a second identity for something a
440
+ station already sells.
418
441
 
419
442
  ### `module-families.jsonc` — the family ids and their English names
420
443
 
@@ -568,7 +591,7 @@ Thirteen stored fields supply the base values referenced by engineering recipes:
568
591
  7, identical between the plain and SCO lines at every size — and the size-8 SCO drives
569
592
  are 50, so the size-8 plain drives take 50. Stated as derivation, not as a reading.
570
593
  The Mk II supercharge-optimised size-8 SCO drive is **not** among them: EDSY publishes
571
- its `fsdheat: 50` outright, spelling the fdname
594
+ its `fsdheat: 50` outright, spelling the symbol
572
595
  `Int_Hyperdrive_Overcharge_Size8_Class5_Overchargebooster_MkII` where the outfitting
573
596
  registry this catalogue is keyed on capitalises the `B`. The case-insensitive source
574
597
  join makes it a reading.
@@ -1193,7 +1216,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1193
1216
  general alias mechanism: it says "the game writes this recipe as X", nothing about
1194
1217
  equivalence, and contains exactly these three records. EDSY publishes the sensor-suite
1195
1218
  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
1219
+ journal symbols; its journal importer resolves them by module type. Coriolis supplies the
1197
1220
  distinct stored recipe keys. The multi-cannon split is detailed under Engineering
1198
1221
  options.
1199
1222
  - **Blueprint source:** EDCD/coriolis-data,
@@ -1300,7 +1323,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1300
1323
  is absent for the same reason. That index is the whole evidence for the negative half
1301
1324
  of the claim: it is a completeness reading of one listing, not 197 pages checked one
1302
1325
  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
1326
+ - **Every row is joined to its blueprint symbol by its own material recipe, not by name.** Inara
1304
1327
  publishes one page per recipe, keyed by its display name; each of the 18 pages' per-grade
1305
1328
  material lists was compared against `blueprint-costs.jsonc` before its Merc-Coin figures
1306
1329
  were taken, and all 25 rows agree on every grade, every material and every count. That is what
@@ -1517,12 +1540,12 @@ up straight through with no disambiguation at all. Both paths are evidence that
1517
1540
  the journal `BlueprintName` this catalogue joins on, so life support lists
1518
1541
  `LifeSupport_LightWeight`, an AFMU `AFM_Shielded`, a fuel scoop `FuelScoop_Shielded`,
1519
1542
  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
1543
+ cosmetic for the scanners:** EDSY's `scan_lr` and `cs_lr` share the symbol
1521
1544
  `Sensor_LongRange`, but `Scanner_LongRange` is a different recipe (power draw, not
1522
1545
  mass; a larger range roll), so the utility scanners take the `Scanner_*` ids for Long
1523
1546
  Range and Wide Angle where the sensor suites take the `Sensor_*` ones. (Their other
1524
1547
  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
1548
+ coriolis has them.) The shared symbol is not a defect in EDSY's table, and §Scanner
1526
1549
  Long Range and Wide Angle below is what follows from that. Eleven groups carry a
1527
1550
  substitution; the substituted lists are then checked against coriolis's own, as are
1528
1551
  the nine further groups it carries a list for —
@@ -1646,7 +1669,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1646
1669
  `MC_Overcharged`; other weapon menus list
1647
1670
  `Weapon_Overcharged`. Coriolis `modifications/modules.json` assigns the first key to
1648
1671
  multi-cannons and the second to six other weapon groups, while
1649
- `modifications/blueprints.json` gives both the journal fdname
1672
+ `modifications/blueprints.json` gives both the journal symbol
1650
1673
  `Weapon_Overcharged`. The recipes differ only in the `AmmoClipSize` reduction carried
1651
1674
  by `MC_Overcharged` (−3% at grade 1 through −15% at grade 5).
1652
1675
  `modifications/blueprints.json` was acquired 2026-08-07 UTC and has SHA-256
@@ -1736,7 +1759,8 @@ up straight through with no disambiguation at all. Both paths are evidence that
1736
1759
  distributor, hull-reinforcement, module-reinforcement, shield-reinforcement or
1737
1760
  FSD-booster reward variants, so the absence of an `Int_Guardian*` row is deliberate. The
1738
1761
  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
1762
+ `blueprintSymbol` and no `experimentalEffectSymbol`. Source: maintainer confirmation
1763
+ recorded 2026-08-12
1740
1764
  UTC; there is no immutable upstream revision.
1741
1765
  - **Records:** pair a base module `symbol` with its published pre-engineered identity:
1742
1766
  `{ symbol, name, blueprint, grade, acquisition }`, plus any sourced stat block and
@@ -1796,8 +1820,9 @@ up straight through with no disambiguation at all. Both paths are evidence that
1796
1820
  under Engineering options.
1797
1821
  - **A reward variant is not reproducible by engineering the same blueprint.** Alongside
1798
1822
  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
1823
+ grants — that is what makes it a reward rather than a shortcut. The `blueprintSymbol` /
1824
+ `grade` / `experimentalEffectSymbol` recorded here **identify** the variant; they are not
1825
+ a recipe
1801
1826
  that recreates it. The ordinary blueprint material recipe does not price the reward.
1802
1827
  - **Two community-goal rewards are not stored:** the size-5 and size-6 Corrosion
1803
1828
  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"}
@@ -0,0 +1 @@
1
+ import{requireFiniteNonNegative}from"./chunk-65FZECUX.js";function combinedRateOfFire(weapon){const interval=weapon.burstInterval;if(interval===void 0||interval<=0)return void 0;const burst=weapon.burstRounds&&weapon.burstRounds>0?weapon.burstRounds:1;const burstRate=weapon.burstRateOfFire&&weapon.burstRateOfFire>0?weapon.burstRateOfFire:1;const cycle=(burst>1?(burst-1)/burstRate:0)+interval;return cycle>0?burst/cycle:void 0}var ZERO_SPLIT={kinetic:0,thermal:0,explosive:0,absolute:0,antiXeno:0};function splitDamage(damage,distribution){if(!distribution)return Object.freeze({...ZERO_SPLIT,absolute:damage});return Object.freeze({kinetic:damage*(distribution.kinetic??0),thermal:damage*(distribution.thermal??0),explosive:damage*(distribution.explosive??0),absolute:damage*(distribution.absolute??0),...(distribution.unclassified??0)===0?{}:{unclassified:damage*distribution.unclassified},antiXeno:damage*(distribution.antiXeno??0)})}function splitComponents(damage,components){const unclassified=(components.unclassified??[]).reduce((sum,value)=>sum+value,0);const conventional=(components.kinetic??0)+(components.thermal??0)+(components.explosive??0)+(components.absolute??0)+unclassified;if(conventional<=0)return Object.freeze({...ZERO_SPLIT,absolute:damage});const scale=damage/conventional;return Object.freeze({kinetic:(components.kinetic??0)*scale,thermal:(components.thermal??0)*scale,explosive:(components.explosive??0)*scale,absolute:(components.absolute??0)*scale,...unclassified===0?{}:{unclassified:unclassified*scale},antiXeno:(components.antiXeno??0)*scale})}function sustainedFireFactor(weapon){const rateOfFire=weapon.rateOfFire;const clip=weapon.clipSize===void 0?void 0:Math.ceil(weapon.clipSize);if(!rateOfFire||!clip||clip<=0)return 1;const burst=weapon.burstRounds&&weapon.burstRounds>0?weapon.burstRounds:1;const burstRate=weapon.burstRateOfFire&&weapon.burstRateOfFire>0?weapon.burstRateOfFire:1;const reload=weapon.reloadTime??0;const cycle=(clip-burst)/rateOfFire+(burst-1)/burstRate+reload;if(cycle<=0)return 1;const sustainedRate=clip/cycle;return Math.min(1,sustainedRate/rateOfFire)}function damagePerSecond(weapon){const damage=weapon.damage??0;const rounds=weapon.roundsPerShot&&weapon.roundsPerShot>0?weapon.roundsPerShot:1;return damage*rounds*(weapon.rateOfFire??1)}function sustainedDamagePerSecond(weapon){return damagePerSecond(weapon)*sustainedFireFactor(weapon)}function energyPerSecond(weapon){return(weapon.distributorDraw??0)*(weapon.rateOfFire??1)}function heatPerSecond(weapon){return(weapon.thermalLoad??0)*(weapon.rateOfFire??1)}function damageFalloff(weapon,metres){const maximum=weapon.maximumRange;if(maximum!==void 0&&metres>maximum)return 0;const falloff=weapon.falloffRange;if(falloff===void 0||maximum===void 0||metres<=falloff)return 1;const taper=maximum-falloff;if(taper<=0)return 1;return Math.max(0,1-(metres-falloff)/taper)}function armourPiercingFactor(armourPiercing,hardness){requireFiniteNonNegative("armourPiercingFactor","armour piercing",armourPiercing);requireFiniteNonNegative("armourPiercingFactor","hardness",hardness);if(hardness===0)return 1;return Math.min(1,armourPiercing/hardness)}function weaponMetrics(weapon){const continuous=weapon.rateOfFire===void 0;const rateOfFire=weapon.rateOfFire??1;const factor=sustainedFireFactor(weapon);const dps=damagePerSecond(weapon);const sdps=dps*factor;const eps=energyPerSecond(weapon);const hps=heatPerSecond(weapon);const rounds=weapon.roundsPerShot&&weapon.roundsPerShot>0?weapon.roundsPerShot:1;return Object.freeze({damagePerShot:(weapon.damage??0)*rounds,rateOfFire:rateOfFire,sustainedRateOfFire:rateOfFire*factor,damagePerSecond:dps,sustainedDamagePerSecond:sdps,energyPerSecond:eps,sustainedEnergyPerSecond:eps*factor,heatPerSecond:hps,sustainedHeatPerSecond:hps*factor,thermalLoad:weapon.thermalLoad??0,powerDraw:weapon.powerDraw??0,damageByType:weapon.damageComponents?splitComponents(dps,weapon.damageComponents):splitDamage(dps,weapon.damageDistribution),sustainedDamageByType:weapon.damageComponents?splitComponents(sdps,weapon.damageComponents):splitDamage(sdps,weapon.damageDistribution),continuous:continuous})}function sumWeaponMetrics(metrics){const damageByType=emptyDamageSplitAccumulator();const sustainedDamageByType=emptyDamageSplitAccumulator();let damagePerSecond2=0;let sustainedDamagePerSecond2=0;let energyPerSecond2=0;let sustainedEnergyPerSecond=0;let heatPerSecond2=0;let sustainedHeatPerSecond=0;let thermalLoad=0;let powerDraw=0;for(const metric of metrics){damagePerSecond2+=metric.damagePerSecond;sustainedDamagePerSecond2+=metric.sustainedDamagePerSecond;energyPerSecond2+=metric.energyPerSecond;sustainedEnergyPerSecond+=metric.sustainedEnergyPerSecond;heatPerSecond2+=metric.heatPerSecond;sustainedHeatPerSecond+=metric.sustainedHeatPerSecond;thermalLoad+=metric.thermalLoad;powerDraw+=metric.powerDraw;addDamageSplit(damageByType,metric.damageByType);addDamageSplit(sustainedDamageByType,metric.sustainedDamageByType)}return Object.freeze({damagePerSecond:damagePerSecond2,sustainedDamagePerSecond:sustainedDamagePerSecond2,energyPerSecond:energyPerSecond2,sustainedEnergyPerSecond:sustainedEnergyPerSecond,heatPerSecond:heatPerSecond2,sustainedHeatPerSecond:sustainedHeatPerSecond,thermalLoad:thermalLoad,powerDraw:powerDraw,damageByType:finishDamageSplit(damageByType),sustainedDamageByType:finishDamageSplit(sustainedDamageByType)})}function emptyDamageSplitAccumulator(){return{kinetic:0,thermal:0,explosive:0,absolute:0,unclassified:0,antiXeno:0}}function addDamageSplit(total,split){total.kinetic+=split.kinetic;total.thermal+=split.thermal;total.explosive+=split.explosive;total.absolute+=split.absolute;total.unclassified+=split.unclassified??0;total.antiXeno+=split.antiXeno}function finishDamageSplit(total){const{unclassified:unclassified,...classified}=total;return Object.freeze(unclassified===0?classified:{...classified,unclassified:unclassified})}export{armourPiercingFactor,combinedRateOfFire,damageFalloff,damagePerSecond,energyPerSecond,heatPerSecond,splitDamage,sumWeaponMetrics,sustainedDamagePerSecond,sustainedFireFactor,weaponMetrics};//# sourceMappingURL=chunk-37JIMWLK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ships/weapons.ts"],"names":["requireFiniteNonNegative","combinedRateOfFire","weapon","interval","burstInterval","burst","burstRounds","burstRate","burstRateOfFire","cycle","ZERO_SPLIT","kinetic","thermal","explosive","absolute","antiXeno","splitDamage","damage","distribution","Object","freeze","unclassified","splitComponents","components","reduce","sum","value","conventional","scale","sustainedFireFactor","rateOfFire","clip","clipSize","Math","ceil","reload","reloadTime","sustainedRate","min","damagePerSecond","rounds","roundsPerShot","sustainedDamagePerSecond","energyPerSecond","distributorDraw","heatPerSecond","thermalLoad","damageFalloff","metres","maximum","maximumRange","falloff","falloffRange","taper","max","armourPiercingFactor","armourPiercing","hardness","weaponMetrics","continuous","factor","dps","sdps","eps","hps","damagePerShot","sustainedRateOfFire","sustainedEnergyPerSecond","sustainedHeatPerSecond","powerDraw","damageByType","damageComponents","damageDistribution","sustainedDamageByType","sumWeaponMetrics","metrics","emptyDamageSplitAccumulator","metric","addDamageSplit","finishDamageSplit","total","split","classified"],"mappings":"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"}