@elite-dangerous-almanac/core 0.2.0 → 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 (150) hide show
  1. package/PROVENANCE/ships/SOURCES.md +23 -0
  2. package/dist/chunk-37JIMWLK.js +1 -0
  3. package/dist/chunk-37JIMWLK.js.map +1 -0
  4. package/dist/chunk-4CBMQULR.js +1 -0
  5. package/dist/{chunk-4ZGUSHTP.js.map → chunk-4CBMQULR.js.map} +1 -1
  6. package/dist/{chunk-QTAMQ6ME.js → chunk-5VWACBTN.js} +1 -1
  7. package/dist/chunk-65FZECUX.js +1 -0
  8. package/dist/chunk-65FZECUX.js.map +1 -0
  9. package/dist/chunk-6BFQIYGZ.js +1 -0
  10. package/dist/chunk-6BFQIYGZ.js.map +1 -0
  11. package/dist/chunk-6HA2YIKW.js +1 -0
  12. package/dist/chunk-6HA2YIKW.js.map +1 -0
  13. package/dist/{chunk-7EE5VIHR.js → chunk-6HMIF2RJ.js} +1 -1
  14. package/dist/chunk-6S36AVA4.js +1 -0
  15. package/dist/chunk-6S36AVA4.js.map +1 -0
  16. package/dist/chunk-6WTUY6ZX.js +1 -0
  17. package/dist/{chunk-V3AEUBHV.js.map → chunk-6WTUY6ZX.js.map} +1 -1
  18. package/dist/chunk-77TT4K53.js +1 -0
  19. package/dist/{chunk-Y6KJJMIM.js → chunk-A4QKXXZD.js} +1 -1
  20. package/dist/chunk-AAE4KZ2V.js +1 -0
  21. package/dist/chunk-AAE4KZ2V.js.map +1 -0
  22. package/dist/{chunk-Q5XOGATC.js → chunk-AIEC3LBT.js} +1 -1
  23. package/dist/{chunk-QY3L5BKN.js → chunk-APEG4ZER.js} +1 -1
  24. package/dist/{chunk-JGOAQLYW.js → chunk-F44QX47A.js} +1 -1
  25. package/dist/{chunk-EVJ32UF3.js → chunk-FA5JVXVG.js} +1 -1
  26. package/dist/{chunk-EVJ32UF3.js.map → chunk-FA5JVXVG.js.map} +1 -1
  27. package/dist/chunk-GGQMIQPC.js +1 -0
  28. package/dist/chunk-GGQMIQPC.js.map +1 -0
  29. package/dist/{chunk-EYGVDJ2I.js → chunk-GMTAFUAG.js} +1 -1
  30. package/dist/{chunk-Z43DN4PY.js → chunk-GTEHRZPN.js} +1 -1
  31. package/dist/{chunk-Z43DN4PY.js.map → chunk-GTEHRZPN.js.map} +1 -1
  32. package/dist/{chunk-PA5EITW5.js → chunk-HUYYGTRM.js} +1 -1
  33. package/dist/{chunk-PA5EITW5.js.map → chunk-HUYYGTRM.js.map} +1 -1
  34. package/dist/{chunk-HKXXFIRI.js → chunk-ITKZKREP.js} +1 -1
  35. package/dist/{chunk-OYR5HUQZ.js → chunk-IWFQ4ZKF.js} +1 -1
  36. package/dist/{chunk-ZCEAPJDH.js → chunk-J7BM5NGK.js} +1 -1
  37. package/dist/chunk-JET673E5.js +1 -0
  38. package/dist/chunk-JET673E5.js.map +1 -0
  39. package/dist/chunk-JMAXSXXQ.js +1 -0
  40. package/dist/chunk-JMAXSXXQ.js.map +1 -0
  41. package/dist/chunk-JO52LYO3.js +1 -0
  42. package/dist/chunk-M2TCZKRT.js +1 -0
  43. package/dist/chunk-M2TCZKRT.js.map +1 -0
  44. package/dist/chunk-M4FZRDAH.js +1 -0
  45. package/dist/chunk-M4FZRDAH.js.map +1 -0
  46. package/dist/chunk-OJC6AUL7.js +1 -0
  47. package/dist/chunk-OJC6AUL7.js.map +1 -0
  48. package/dist/{chunk-FYVPZBXN.js → chunk-Q5ALV3DI.js} +1 -1
  49. package/dist/{chunk-SQS7672E.js → chunk-Q6YDPREF.js} +1 -1
  50. package/dist/chunk-SG6YLUQ4.js +1 -0
  51. package/dist/chunk-SG6YLUQ4.js.map +1 -0
  52. package/dist/{chunk-OVUHQEH5.js → chunk-T4MKUKYS.js} +1 -1
  53. package/dist/{chunk-OVUHQEH5.js.map → chunk-T4MKUKYS.js.map} +1 -1
  54. package/dist/{chunk-XUHAPOM6.js → chunk-VEEBJFJ7.js} +1 -1
  55. package/dist/{chunk-L747RVPO.js → chunk-VQJXRPYI.js} +1 -1
  56. package/dist/{chunk-L747RVPO.js.map → chunk-VQJXRPYI.js.map} +1 -1
  57. package/dist/chunk-VTMCSCXV.js +1 -0
  58. package/dist/chunk-VTMCSCXV.js.map +1 -0
  59. package/dist/chunk-XQJERZUS.js +1 -0
  60. package/dist/chunk-XQJERZUS.js.map +1 -0
  61. package/dist/commodities/commodities-all.js +1 -1
  62. package/dist/commodities/commodities-rare.js +1 -1
  63. package/dist/commodities/commodities-standard.js +1 -1
  64. package/dist/commodities/commodities.js +1 -1
  65. package/dist/commodities/index.js +1 -1
  66. package/dist/materials/index.js +1 -1
  67. package/dist/materials/materials-all.js +1 -1
  68. package/dist/materials/materials-encoded.js +1 -1
  69. package/dist/materials/materials-manufactured.js +1 -1
  70. package/dist/materials/materials-raw.js +1 -1
  71. package/dist/materials/materials.js +1 -1
  72. package/dist/ships/armour.js +1 -1
  73. package/dist/ships/build-metrics.js +1 -1
  74. package/dist/ships/distributor.js +1 -1
  75. package/dist/ships/heat.js +1 -1
  76. package/dist/ships/index.d.ts +1 -1
  77. package/dist/ships/index.js +1 -1
  78. package/dist/ships/jump-range.js +1 -1
  79. package/dist/ships/loadout-validation.d.ts +111 -5
  80. package/dist/ships/loadout-validation.js +1 -1
  81. package/dist/ships/mobility-capacitor.js +1 -1
  82. package/dist/ships/mobility.js +1 -1
  83. package/dist/ships/modules-all.js +1 -1
  84. package/dist/ships/modules-core.js +1 -1
  85. package/dist/ships/modules-internal.js +1 -1
  86. package/dist/ships/modules.d.ts +21 -1
  87. package/dist/ships/modules.js +1 -1
  88. package/dist/ships/power.js +1 -1
  89. package/dist/ships/pre-engineered-stats.d.ts +12 -7
  90. package/dist/ships/pre-engineered-stats.js +1 -1
  91. package/dist/ships/resistances.js +1 -1
  92. package/dist/ships/shield-capacitor.js +1 -1
  93. package/dist/ships/shield-recovery.js +1 -1
  94. package/dist/ships/shields.js +1 -1
  95. package/dist/ships/ship-loadout.d.ts +84 -17
  96. package/dist/ships/ship-loadout.js +1 -1
  97. package/dist/ships/slef.d.ts +4 -1
  98. package/dist/ships/slef.js +1 -1
  99. package/dist/ships/weapons-capacitor.js +1 -1
  100. package/dist/ships/weapons.js +1 -1
  101. package/package.json +1 -1
  102. package/dist/chunk-4KJ7CR74.js +0 -1
  103. package/dist/chunk-4KJ7CR74.js.map +0 -1
  104. package/dist/chunk-4ZGUSHTP.js +0 -1
  105. package/dist/chunk-6L56LWTT.js +0 -1
  106. package/dist/chunk-6L56LWTT.js.map +0 -1
  107. package/dist/chunk-6O4NRRSB.js +0 -1
  108. package/dist/chunk-6O4NRRSB.js.map +0 -1
  109. package/dist/chunk-7TQ2X6Q3.js +0 -1
  110. package/dist/chunk-7TQ2X6Q3.js.map +0 -1
  111. package/dist/chunk-B4ZSTOM4.js +0 -1
  112. package/dist/chunk-B4ZSTOM4.js.map +0 -1
  113. package/dist/chunk-D6YEHR5S.js +0 -1
  114. package/dist/chunk-D6YEHR5S.js.map +0 -1
  115. package/dist/chunk-EVW4Z4CB.js +0 -1
  116. package/dist/chunk-EVW4Z4CB.js.map +0 -1
  117. package/dist/chunk-GZYPQIO2.js +0 -1
  118. package/dist/chunk-GZYPQIO2.js.map +0 -1
  119. package/dist/chunk-JQG4C67D.js +0 -1
  120. package/dist/chunk-OYFMHDYT.js +0 -1
  121. package/dist/chunk-OYFMHDYT.js.map +0 -1
  122. package/dist/chunk-PY5L6WC5.js +0 -1
  123. package/dist/chunk-PY5L6WC5.js.map +0 -1
  124. package/dist/chunk-Q2L75GSI.js +0 -1
  125. package/dist/chunk-Q2L75GSI.js.map +0 -1
  126. package/dist/chunk-QJ7GB6FF.js +0 -1
  127. package/dist/chunk-QJ7GB6FF.js.map +0 -1
  128. package/dist/chunk-RRYBSAPX.js +0 -1
  129. package/dist/chunk-RRYBSAPX.js.map +0 -1
  130. package/dist/chunk-V3AEUBHV.js +0 -1
  131. package/dist/chunk-V4C6FIE2.js +0 -1
  132. package/dist/chunk-VYDQHPY2.js +0 -1
  133. package/dist/chunk-VYDQHPY2.js.map +0 -1
  134. package/dist/chunk-YXPZ7QQB.js +0 -1
  135. package/dist/chunk-YXPZ7QQB.js.map +0 -1
  136. /package/dist/{chunk-QTAMQ6ME.js.map → chunk-5VWACBTN.js.map} +0 -0
  137. /package/dist/{chunk-7EE5VIHR.js.map → chunk-6HMIF2RJ.js.map} +0 -0
  138. /package/dist/{chunk-JQG4C67D.js.map → chunk-77TT4K53.js.map} +0 -0
  139. /package/dist/{chunk-Y6KJJMIM.js.map → chunk-A4QKXXZD.js.map} +0 -0
  140. /package/dist/{chunk-Q5XOGATC.js.map → chunk-AIEC3LBT.js.map} +0 -0
  141. /package/dist/{chunk-QY3L5BKN.js.map → chunk-APEG4ZER.js.map} +0 -0
  142. /package/dist/{chunk-JGOAQLYW.js.map → chunk-F44QX47A.js.map} +0 -0
  143. /package/dist/{chunk-EYGVDJ2I.js.map → chunk-GMTAFUAG.js.map} +0 -0
  144. /package/dist/{chunk-HKXXFIRI.js.map → chunk-ITKZKREP.js.map} +0 -0
  145. /package/dist/{chunk-OYR5HUQZ.js.map → chunk-IWFQ4ZKF.js.map} +0 -0
  146. /package/dist/{chunk-ZCEAPJDH.js.map → chunk-J7BM5NGK.js.map} +0 -0
  147. /package/dist/{chunk-V4C6FIE2.js.map → chunk-JO52LYO3.js.map} +0 -0
  148. /package/dist/{chunk-FYVPZBXN.js.map → chunk-Q5ALV3DI.js.map} +0 -0
  149. /package/dist/{chunk-SQS7672E.js.map → chunk-Q6YDPREF.js.map} +0 -0
  150. /package/dist/{chunk-XUHAPOM6.js.map → chunk-VEEBJFJ7.js.map} +0 -0
@@ -1 +1 @@
1
- export{getBulkheadsForShip,getModuleBySymbol,getModulesByName}from"../chunk-PA5EITW5.js"; //# sourceMappingURL=modules.js.map
1
+ export{getBulkheadsForShip,getModuleBySymbol,getModulesByName}from"../chunk-HUYYGTRM.js"; //# sourceMappingURL=modules.js.map
@@ -1 +1 @@
1
- export{powerBudget}from"../chunk-D6YEHR5S.js";//# sourceMappingURL=power.js.map
1
+ export{powerBudget}from"../chunk-GGQMIQPC.js"; //# sourceMappingURL=power.js.map
@@ -15,8 +15,8 @@ import './slots.js';
15
15
  * arrives, not as the stock module leaves the shipyard. That is what
16
16
  * {@link getPreEngineeredStats} returns.
17
17
  *
18
- * This module imports every module record to resolve stats. Its resolver is 362.5 KiB
19
- * minified in a consumer bundle; the complete runtime API is 396.3 KiB (43.1 KiB
18
+ * This module imports every module record to resolve stats. Its resolver is 362.7 KiB
19
+ * minified in a consumer bundle; the complete runtime API is 396.5 KiB (43.2 KiB
20
20
  * gzipped). Consumers that only list variants can import `./pre-engineered.js` without
21
21
  * these module catalogues.
22
22
  * A journal or SLEF module can instead be classified with
@@ -100,11 +100,16 @@ declare function getPreEngineeredJournalModifiers(variant: PreEngineeredVariant)
100
100
  *
101
101
  * A locked fixed article is also identified by its unique
102
102
  * symbol/blueprint/grade/experimental tuple when a SLEF capture omits the `Modifiers` key
103
- * entirely. A present empty or partial array does not use this shortcut: older library
104
- * exports can carry an ordinary roll with the same tuple, and its values must not be
105
- * replaced by reward stats. A third-party export can omit the array from such a roll;
106
- * that record is indistinguishable from the fixed article, so the catalogue identity
107
- * wins.
103
+ * entirely: being final, no ordinary roll could have written that tuple. A present empty
104
+ * or partial array does not use this shortcut: older library exports can carry an ordinary
105
+ * roll with the same tuple, and its values must not be replaced by reward stats. A third-
106
+ * party export can omit the array from such a roll; that record is indistinguishable from
107
+ * the fixed article, so the catalogue identity wins.
108
+ *
109
+ * An unlocked article that shares a blueprint with no craftable recipe of its base module
110
+ * is identified the same way, but by `ShipLoadout.fromLoadout` rather than here — that
111
+ * reading needs each module's engineering menu, a catalogue this module deliberately does
112
+ * not carry into a consumer's bundle.
108
113
  *
109
114
  * Frontier journals and captures may omit a derived modifier, so one predicted value may
110
115
  * be absent. Every stated predicted value must agree within journal float noise, and all
@@ -1 +1 @@
1
- export{getPreEngineeredJournalModifiers,getPreEngineeredModifiers,getPreEngineeredStats,identifyPreEngineeredVariant,unresolvedModifiers}from"../chunk-GZYPQIO2.js"; //# sourceMappingURL=pre-engineered-stats.js.map
1
+ export{getPreEngineeredJournalModifiers,getPreEngineeredModifiers,getPreEngineeredStats,identifyPreEngineeredVariant,unresolvedModifiers}from"../chunk-JET673E5.js"; //# sourceMappingURL=pre-engineered-stats.js.map
@@ -1 +1 @@
1
- export{effectiveHitPoints,mapDamageTypes,stackArmourResistance,stackShieldResistance,systemsResistance}from"../chunk-JGOAQLYW.js"; //# sourceMappingURL=resistances.js.map
1
+ export{effectiveHitPoints,mapDamageTypes,stackArmourResistance,stackShieldResistance,systemsResistance}from"../chunk-F44QX47A.js"; //# sourceMappingURL=resistances.js.map
@@ -1 +1 @@
1
- export{shieldCapacitorMetrics}from"../chunk-6L56LWTT.js"; //# sourceMappingURL=shield-capacitor.js.map
1
+ export{shieldCapacitorMetrics}from"../chunk-XQJERZUS.js"; //# sourceMappingURL=shield-capacitor.js.map
@@ -1 +1 @@
1
- export{cellBankSummary,shieldRecovery}from"../chunk-4KJ7CR74.js"; //# sourceMappingURL=shield-recovery.js.map
1
+ export{cellBankSummary,shieldRecovery}from"../chunk-JMAXSXXQ.js"; //# sourceMappingURL=shield-recovery.js.map
@@ -1 +1 @@
1
- export{shieldMassCurveMultiplier,shieldMetrics,shieldStrength}from"../chunk-QTAMQ6ME.js"; //# sourceMappingURL=shields.js.map
1
+ export{shieldMassCurveMultiplier,shieldMetrics,shieldStrength}from"../chunk-5VWACBTN.js"; //# sourceMappingURL=shields.js.map
@@ -160,10 +160,13 @@ type LoadoutSlot = BuildSlot & {
160
160
  * A change made while normalizing a journal or SLEF loadout against the catalogues.
161
161
  *
162
162
  * @remarks
163
- * `ShipLoadout.fromLoadout` states the rule these outcomes report: a removable mount is
163
+ * `ShipLoadout.fromLoadout` states the rules these outcomes report: a removable mount is
164
164
  * `emptied` of an article the catalogue cannot resolve, and a fixed mount is `defaulted`
165
165
  * to the hull's stock article whenever the source left none it can hold — with a `null`
166
- * `sourceSymbol` when the source named nothing there at all.
166
+ * `sourceSymbol` when the source named nothing there at all. A module whose source stated
167
+ * a recipe and no `Modifiers` reports `unresolvedEngineering` when neither a craftable
168
+ * recipe nor a catalogued article answers to what it named, because that module alone
169
+ * keeps the figures of an unengineered one.
167
170
  *
168
171
  * @example
169
172
  * ```ts
@@ -194,6 +197,20 @@ type LoadoutImportOutcome = {
194
197
  readonly sourceSymbol: string | null;
195
198
  /** Stock module identity installed in the mount. */
196
199
  readonly replacementSymbol: string;
200
+ } | {
201
+ /**
202
+ * The source stated engineering with no `Modifiers`, and what it named could
203
+ * not be rolled — an unknown or unoffered blueprint or experimental effect, a
204
+ * grade or quality outside the recipe, or a base stat the catalogues do not
205
+ * carry — so this module's figures are the unengineered ones.
206
+ */
207
+ readonly action: 'unresolvedEngineering';
208
+ /** Exact slot spelling used by the imported build. */
209
+ readonly slot: string;
210
+ /** Module identity the recipe was stated for. */
211
+ readonly sourceSymbol: string;
212
+ /** Recipe the source named, in its own spelling. */
213
+ readonly blueprintSymbol: string;
197
214
  };
198
215
 
199
216
  /**
@@ -378,8 +395,9 @@ interface EngineeringNormalized {
378
395
  /** Discriminator for a successful normalization. */
379
396
  readonly kind: 'normalized';
380
397
  /**
381
- * Quality reported by the fitted module before normalization, in `[0, 1]`. It reads
382
- * `1` where a completed roll stated no modifiers and this call spelled them out.
398
+ * Quality reported by the fitted module before normalization, in `[0, 1]`. A block
399
+ * that stated no modifiers still reports the quality it stated, so this reads `1` for
400
+ * a completed roll whose figures this call was the first to spell out.
383
401
  */
384
402
  readonly previousQuality: number;
385
403
  /** Completed engineering quality. Always `1`. */
@@ -541,7 +559,8 @@ declare class ShipLoadout {
541
559
  * Defaults to the first.
542
560
  * @returns The loadout for that entry.
543
561
  * @remarks Module normalization follows {@link ShipLoadout.fromLoadout}; inspect
544
- * {@link importOutcomes} for modules that were emptied or defaulted.
562
+ * {@link importOutcomes} for modules that were emptied or defaulted, and for stated
563
+ * engineering it could not resolve.
545
564
  * @throws {SyntaxError} If `input` is a string that is not valid JSON.
546
565
  * @throws {TypeError} If the export holds no usable loadout, `index` is out of range,
547
566
  * or the selected entry names a hull absent from the catalogue.
@@ -560,6 +579,20 @@ declare class ShipLoadout {
560
579
  * and the catalogue's stat block then supplies the values the capture omits; the
561
580
  * capture's own modifiers stay authoritative over it.
562
581
  *
582
+ * **A recipe stated without `Modifiers` is rolled.** A journal writes the modifier
583
+ * block beside the recipe, but SLEF permits stating the recipe alone and Inara does,
584
+ * so such a block is materialised here at the grade and quality it states — otherwise
585
+ * the module would report that it is engineered while publishing the figures of one
586
+ * that is not. Where the module's own engineering menu offers the recipe, the block
587
+ * is read as an ordinary roll of it, even if a fixed article of that module carries
588
+ * the same blueprint at the same grade; use {@link setPreEngineeredVariant} to say
589
+ * the article was meant instead. A Mercenary article is read as its own article at
590
+ * the grade it was bought at, and as that purchase climbed by its bespoke recipe
591
+ * above it. Where the menu does not offer the recipe, no ordinary roll
592
+ * could have written the block, so a single catalogued article answering to it is
593
+ * fitted. Where neither answers, the module keeps unengineered figures and
594
+ * {@link importOutcomes} reports the slot as `unresolvedEngineering`.
595
+ *
563
596
  * Modules are imported as one complete snapshot, so their order does not affect
564
597
  * per-ship count allowances. An entry stands as the event stated it when the mount
565
598
  * can hold the article the catalogue resolves, when its slot is a known cosmetic or
@@ -725,18 +758,23 @@ declare class ShipLoadout {
725
758
  */
726
759
  get sourcePurchase(): SourcePurchaseRecord | null;
727
760
  /**
728
- * Changes made while importing this build, in source order, followed by the fixed
729
- * mounts stocked from the hull defaults because the source named none, in the
730
- * defaults' own order.
761
+ * What the import made of this build: the changes it applied, in source order,
762
+ * followed by the fixed mounts stocked from the hull defaults because the source
763
+ * named none, in the defaults' own order, followed by the modules whose stated
764
+ * engineering it could not resolve.
731
765
  *
732
766
  * @returns A deeply frozen list. It is empty for builds created with
733
767
  * {@link ShipLoadout.empty} or {@link ShipLoadout.default}, and for imports that
734
- * needed no normalization.
768
+ * needed no normalization and left no engineering unresolved.
735
769
  * @remarks
736
770
  * Each entry names the exact slot, and the source identity where the source gave one.
737
771
  * `emptied` means an unknown module was removed from a removable mount; `defaulted`
738
772
  * names the stock article fitted to armour, a core internal or the cargo hatch, with
739
773
  * a `null` `sourceSymbol` when the source named nothing there at all.
774
+ * `unresolvedEngineering` is the one entry that reports a *non*-change: the source
775
+ * stated a recipe and no `Modifiers`, nothing the catalogues carry answers to it, and
776
+ * that module alone keeps the figures of an unengineered one (see
777
+ * {@link ShipLoadout.fromLoadout}).
740
778
  */
741
779
  get importOutcomes(): readonly LoadoutImportOutcome[];
742
780
  /**
@@ -744,11 +782,29 @@ declare class ShipLoadout {
744
782
  *
745
783
  * @remarks
746
784
  * `valid` asks whether the fit is legal: a module in a nonexistent or incompatible
747
- * slot, a duplicated exclusive family, or a module count past the build's allowance
748
- * makes it `false`. `complete` asks that *and* whether armour and the seven core
749
- * mounts are filled every build fills those, so on a build the two answers agree.
750
- * Neither question reports import normalization, so read {@link importOutcomes}
751
- * beside them.
785
+ * slot, a duplicated exclusive family, a module count past the build's allowance, or
786
+ * a ship heavier than its own thrusters can move makes it `false`. `complete` asks
787
+ * that *and* whether armour and the seven core mounts are filled every build fills
788
+ * those, so on a build the two answers agree. Neither question reports import
789
+ * normalization, so read {@link importOutcomes} beside them.
790
+ *
791
+ * The thruster rule weighs the fitted thrusters' post-engineering `maxMass` against
792
+ * what the ship comes to at each load it can reach without being re-fitted:
793
+ * {@link unladenMass} alone, then with a full {@link fuelCapacity | main tank}, then
794
+ * with a full {@link cargoCapacity | hold} as well. The lightest of those that is
795
+ * already too heavy is what gets reported. A ship that cannot move on a full tank is
796
+ * an error — it never leaves the pad, where the tank always is one — while a ship
797
+ * that only fails with the hold full is a warning, and leaves the build valid and
798
+ * complete: how much cargo to take is the pilot's call. Either way
799
+ * {@link ships!BuildMetrics.mobilityMetrics | BuildMetrics.mobilityMetrics} reports
800
+ * a speed of zero at the load in question.
801
+ *
802
+ * A capture may state a mass nobody can weigh — a negative `UnladenMass`, or an
803
+ * engineering modifier that drives a rating below zero. Neither is refused here:
804
+ * this method reports a build rather than rejecting one, so an unweighable figure is
805
+ * left out and the rule it feeds simply does not run. The figure itself is still
806
+ * reported, as a thrown one, by whichever {@link ships!BuildMetrics | BuildMetrics}
807
+ * calculation reads it.
752
808
  *
753
809
  * @returns The validation report, recomputed from the current fit on every call.
754
810
  */
@@ -836,6 +892,13 @@ declare class ShipLoadout {
836
892
  * satisfied, with candidates that would worsen a one-per-ship or module-count limit
837
893
  * omitted.
838
894
  *
895
+ * @remarks
896
+ * This is the outfitting *offer*, so the fifteen {@link ships!OutfittingModule.grantOnly | grantOnly}
897
+ * articles are never in it: each is a second identity for a module the game already
898
+ * sells — `Int_Engine_Size2_Class1_free` is the 2E Thrusters — and listing both puts
899
+ * the same article on the screen twice, once with no price. A build that already
900
+ * carries one keeps it; only the choices are filtered.
901
+ *
839
902
  * @param slotKey - The slot key to fit, matched case-insensitively (journal spelling).
840
903
  * @returns The fitting modules, in complete-catalogue order.
841
904
  * @throws {RangeError} If the hull has no slot with that key.
@@ -1019,9 +1082,13 @@ declare class ShipLoadout {
1019
1082
  * purchase identity. A refusal never changes the loadout.
1020
1083
  *
1021
1084
  * A block that names a blueprint and grade but states no `Modifiers` at all is rolled
1022
- * here too, even at quality `1` SLEF permits that identity-only shape and Inara
1023
- * writes it, so a capture of a completed roll would otherwise stay stock. A stated
1024
- * modifier array, empty or partial, is left alone at quality `1`.
1085
+ * here too, even at quality `1`, so a completed roll cannot stay stock. On an imported
1086
+ * build such a block is one {@link ShipLoadout.fromLoadout} did not roll: a catalogued
1087
+ * article it fitted instead, whose fixed modifiers this spells out unless the article
1088
+ * is final; a Mercenary article at the grade it was bought at, whose block no registry
1089
+ * publishes and which this refuses; or a recipe nothing answered to, which this
1090
+ * refuses for the reason the import could not roll it. A stated modifier array, empty
1091
+ * or partial, is left alone at quality `1`.
1025
1092
  *
1026
1093
  * @param slotKey - The engineered slot, matched case-insensitively.
1027
1094
  * @returns A frozen result identifying a normalized, unchanged or unsupported state.
@@ -1 +1 @@
1
- export{LoadoutEditError,ShipLoadout}from"../chunk-OYFMHDYT.js"; //# sourceMappingURL=ship-loadout.js.map
1
+ export{LoadoutEditError,ShipLoadout}from"../chunk-SG6YLUQ4.js"; //# sourceMappingURL=ship-loadout.js.map
@@ -90,7 +90,10 @@ interface BlueprintModuleEngineering {
90
90
  * `BlueprintName`, `Level` and `Quality` — the specification's own example omits it —
91
91
  * so an export from another app may name the blueprint and its roll without spelling
92
92
  * out the resulting stats. Treat a missing array as "not stated", not as "nothing was
93
- * changed". A craftable recipe can be reconstructed with
93
+ * changed". {@link ShipLoadout.fromLoadout} resolves what a missing array implies —
94
+ * rolling the stated recipe, or fitting the catalogued article the identity can only
95
+ * mean — so a build imported through it needs none of this. Working from the wire
96
+ * shape directly, a craftable recipe is reconstructed with
94
97
  * {@link ShipLoadout.applyBlueprint}, or rolled where it stands with
95
98
  * {@link ShipLoadout.completeEngineeringGrade}, which spells out a stated identity
96
99
  * at quality `1`; resolve a fixed identity through the pre-engineered catalogue and
@@ -1 +1 @@
1
- export{getLoadoutModifier,inspectSlef,parseSlef,stringifySlef,toSlef}from"../chunk-OVUHQEH5.js"; //# sourceMappingURL=slef.js.map
1
+ export{getLoadoutModifier,inspectSlef,parseSlef,stringifySlef,toSlef}from"../chunk-T4MKUKYS.js"; //# sourceMappingURL=slef.js.map
@@ -1 +1 @@
1
- export{weaponsCapacitorMetrics}from"../chunk-RRYBSAPX.js"; //# sourceMappingURL=weapons-capacitor.js.map
1
+ export{weaponsCapacitorMetrics}from"../chunk-M4FZRDAH.js"; //# sourceMappingURL=weapons-capacitor.js.map
@@ -1 +1 @@
1
- export{armourPiercingFactor,combinedRateOfFire,damageFalloff,damagePerSecond,energyPerSecond,heatPerSecond,splitDamage,sumWeaponMetrics,sustainedDamagePerSecond,sustainedFireFactor,weaponMetrics}from"../chunk-7TQ2X6Q3.js";//# sourceMappingURL=weapons.js.map
1
+ export{armourPiercingFactor,combinedRateOfFire,damageFalloff,damagePerSecond,energyPerSecond,heatPerSecond,splitDamage,sumWeaponMetrics,sustainedDamagePerSecond,sustainedFireFactor,weaponMetrics}from"../chunk-37JIMWLK.js"; //# sourceMappingURL=weapons.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elite-dangerous-almanac/core",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Elite Dangerous static data and calculations: astronomy, ships and outfitting, personal equipment and engineering, materials, and market commodities.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -1 +0,0 @@
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 +0,0 @@
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"}