@elite-dangerous-almanac/core 0.1.6 → 0.1.8

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 (139) hide show
  1. package/PROVENANCE/i18n/SOURCES.md +92 -35
  2. package/PROVENANCE/ships/SOURCES.md +54 -14
  3. package/THIRD_PARTY_NOTICES.md +3 -0
  4. package/dist/chunk-3BM5BHI3.js +1 -0
  5. package/dist/chunk-3BM5BHI3.js.map +1 -0
  6. package/dist/{chunk-EWAS7KMF.js → chunk-4S6WB7QR.js} +1 -1
  7. package/dist/chunk-4TFAZX73.js +1 -0
  8. package/dist/{chunk-PYV7VI6I.js.map → chunk-4TFAZX73.js.map} +1 -1
  9. package/dist/chunk-4ZGUSHTP.js +1 -0
  10. package/dist/{chunk-5V4OXZLE.js.map → chunk-4ZGUSHTP.js.map} +1 -1
  11. package/dist/{chunk-BZDTEXXM.js → chunk-6BO5JJNI.js} +1 -1
  12. package/dist/{chunk-3MPLVD2R.js → chunk-6G6TYW2D.js} +1 -1
  13. package/dist/chunk-AFS6HN3D.js +1 -0
  14. package/dist/chunk-AFS6HN3D.js.map +1 -0
  15. package/dist/chunk-CJWFY6OX.js +1 -0
  16. package/dist/{chunk-JKWV3CZN.js.map → chunk-CJWFY6OX.js.map} +1 -1
  17. package/dist/{chunk-24INI4U7.js → chunk-CX7B67OI.js} +1 -1
  18. package/dist/chunk-CX7B67OI.js.map +1 -0
  19. package/dist/chunk-EKQCVCMK.js +1 -0
  20. package/dist/{chunk-WHAU3C4E.js.map → chunk-EKQCVCMK.js.map} +1 -1
  21. package/dist/chunk-ELT3FEA4.js +1 -0
  22. package/dist/{chunk-6FKBZPI6.js.map → chunk-ELT3FEA4.js.map} +1 -1
  23. package/dist/{chunk-3EO7PTAP.js → chunk-EVJ32UF3.js} +1 -1
  24. package/dist/{chunk-3EO7PTAP.js.map → chunk-EVJ32UF3.js.map} +1 -1
  25. package/dist/chunk-GRSNX36B.js +1 -0
  26. package/dist/{chunk-JXLCRQH5.js.map → chunk-GRSNX36B.js.map} +1 -1
  27. package/dist/chunk-GVNTKCVF.js +1 -0
  28. package/dist/chunk-GVNTKCVF.js.map +1 -0
  29. package/dist/{chunk-FEER4ERG.js → chunk-IOJXLDJN.js} +1 -1
  30. package/dist/{chunk-EVEFYI7K.js → chunk-J42ZXLBL.js} +1 -1
  31. package/dist/{chunk-EVEFYI7K.js.map → chunk-J42ZXLBL.js.map} +1 -1
  32. package/dist/chunk-KJFUNIIY.js +1 -0
  33. package/dist/{chunk-NCKOVFBJ.js.map → chunk-KJFUNIIY.js.map} +1 -1
  34. package/dist/{chunk-RC6F6RAU.js → chunk-LZYHBFJC.js} +1 -1
  35. package/dist/{chunk-RC6F6RAU.js.map → chunk-LZYHBFJC.js.map} +1 -1
  36. package/dist/chunk-M6G3UDTX.js +1 -0
  37. package/dist/chunk-M6G3UDTX.js.map +1 -0
  38. package/dist/{chunk-DLLBARN5.js → chunk-MKGJPVPS.js} +1 -1
  39. package/dist/{chunk-UXFMVZAY.js → chunk-OVUHQEH5.js} +1 -1
  40. package/dist/{chunk-UXFMVZAY.js.map → chunk-OVUHQEH5.js.map} +1 -1
  41. package/dist/{chunk-UPUC5X2C.js → chunk-PA5EITW5.js} +1 -1
  42. package/dist/{chunk-UPUC5X2C.js.map → chunk-PA5EITW5.js.map} +1 -1
  43. package/dist/chunk-QY3L5BKN.js +1 -0
  44. package/dist/{chunk-PEHOKSSD.js.map → chunk-QY3L5BKN.js.map} +1 -1
  45. package/dist/chunk-RVIYOHYF.js +1 -0
  46. package/dist/chunk-RVIYOHYF.js.map +1 -0
  47. package/dist/chunk-SD6GNFDX.js +1 -0
  48. package/dist/chunk-SD6GNFDX.js.map +1 -0
  49. package/dist/chunk-TW7LUBHD.js +1 -0
  50. package/dist/{chunk-QGAZWX7G.js.map → chunk-TW7LUBHD.js.map} +1 -1
  51. package/dist/chunk-V4C6FIE2.js +1 -0
  52. package/dist/{chunk-TLA6LHLN.js.map → chunk-V4C6FIE2.js.map} +1 -1
  53. package/dist/chunk-Z6XMXMVI.js +1 -0
  54. package/dist/{chunk-NEFUW32I.js.map → chunk-Z6XMXMVI.js.map} +1 -1
  55. package/dist/{chunk-T4CV4CDF.js → chunk-ZRG35JSH.js} +1 -1
  56. package/dist/i18n/blueprints.d.ts +2 -1
  57. package/dist/i18n/blueprints.js +1 -1
  58. package/dist/i18n/diagnostics.d.ts +1 -0
  59. package/dist/i18n/diagnostics.js +1 -1
  60. package/dist/i18n/engineering-groups.js +1 -1
  61. package/dist/i18n/experimental-effect-descriptions.js +1 -1
  62. package/dist/i18n/experimental-effects.js +1 -1
  63. package/dist/i18n/index.d.ts +9 -6
  64. package/dist/i18n/index.js +1 -1
  65. package/dist/i18n/materials.js +1 -1
  66. package/dist/i18n/micro-resources.js +1 -1
  67. package/dist/i18n/module-families.d.ts +32 -0
  68. package/dist/i18n/module-families.js +1 -0
  69. package/dist/i18n/module-families.js.map +1 -0
  70. package/dist/i18n/modules.js +1 -1
  71. package/dist/i18n/pre-engineered.js +1 -1
  72. package/dist/i18n/ships.js +1 -1
  73. package/dist/i18n/slots.js +1 -1
  74. package/dist/materials/index.js +1 -1
  75. package/dist/materials/materials-all.js +1 -1
  76. package/dist/materials/materials.js +1 -1
  77. package/dist/materials/micro-resources-all.js +1 -1
  78. package/dist/materials/micro-resources.js +1 -1
  79. package/dist/ships/blueprint-costs.d.ts +1 -0
  80. package/dist/ships/blueprints.d.ts +1 -0
  81. package/dist/ships/engineering.d.ts +1 -0
  82. package/dist/ships/experimental-effect-costs.d.ts +1 -0
  83. package/dist/ships/experimental-effects.d.ts +1 -0
  84. package/dist/ships/index.d.ts +2 -1
  85. package/dist/ships/index.js +1 -1
  86. package/dist/ships/loadout-validation.d.ts +1 -0
  87. package/dist/ships/mobility.d.ts +12 -0
  88. package/dist/ships/mobility.js +1 -1
  89. package/dist/ships/module-capabilities.d.ts +1 -0
  90. package/dist/ships/module-families.d.ts +49 -0
  91. package/dist/ships/module-families.js +1 -0
  92. package/dist/ships/module-families.js.map +1 -0
  93. package/dist/ships/module-limits.d.ts +1 -0
  94. package/dist/ships/modules-all.d.ts +1 -0
  95. package/dist/ships/modules-all.js +1 -1
  96. package/dist/ships/modules-core.d.ts +1 -0
  97. package/dist/ships/modules-core.js +1 -1
  98. package/dist/ships/modules-hardpoint.d.ts +2 -1
  99. package/dist/ships/modules-hardpoint.js +1 -1
  100. package/dist/ships/modules-internal.d.ts +2 -1
  101. package/dist/ships/modules-internal.js +1 -1
  102. package/dist/ships/modules-utility.d.ts +2 -1
  103. package/dist/ships/modules-utility.js +1 -1
  104. package/dist/ships/modules.d.ts +41 -14
  105. package/dist/ships/modules.js +1 -1
  106. package/dist/ships/pre-engineered-stats.d.ts +1 -0
  107. package/dist/ships/pre-engineered-stats.js +1 -1
  108. package/dist/ships/ship-loadout.d.ts +143 -7
  109. package/dist/ships/ship-loadout.js +1 -1
  110. package/dist/ships/slef.d.ts +10 -8
  111. package/dist/ships/slef.js +1 -1
  112. package/dist/ships/weapons.d.ts +1 -0
  113. package/package.json +9 -1
  114. package/dist/chunk-24INI4U7.js.map +0 -1
  115. package/dist/chunk-5V4OXZLE.js +0 -1
  116. package/dist/chunk-6FKBZPI6.js +0 -1
  117. package/dist/chunk-DAQ3PJ4R.js +0 -1
  118. package/dist/chunk-DAQ3PJ4R.js.map +0 -1
  119. package/dist/chunk-JKWV3CZN.js +0 -1
  120. package/dist/chunk-JXLCRQH5.js +0 -1
  121. package/dist/chunk-NCKOVFBJ.js +0 -1
  122. package/dist/chunk-NEFUW32I.js +0 -1
  123. package/dist/chunk-NWBWTJM3.js +0 -1
  124. package/dist/chunk-NWBWTJM3.js.map +0 -1
  125. package/dist/chunk-PEHOKSSD.js +0 -1
  126. package/dist/chunk-PYV7VI6I.js +0 -1
  127. package/dist/chunk-QGAZWX7G.js +0 -1
  128. package/dist/chunk-SU352DIW.js +0 -1
  129. package/dist/chunk-SU352DIW.js.map +0 -1
  130. package/dist/chunk-TLA6LHLN.js +0 -1
  131. package/dist/chunk-WHAU3C4E.js +0 -1
  132. package/dist/chunk-ZKU7CMAH.js +0 -1
  133. package/dist/chunk-ZKU7CMAH.js.map +0 -1
  134. /package/dist/{chunk-EWAS7KMF.js.map → chunk-4S6WB7QR.js.map} +0 -0
  135. /package/dist/{chunk-BZDTEXXM.js.map → chunk-6BO5JJNI.js.map} +0 -0
  136. /package/dist/{chunk-3MPLVD2R.js.map → chunk-6G6TYW2D.js.map} +0 -0
  137. /package/dist/{chunk-FEER4ERG.js.map → chunk-IOJXLDJN.js.map} +0 -0
  138. /package/dist/{chunk-DLLBARN5.js.map → chunk-MKGJPVPS.js.map} +0 -0
  139. /package/dist/{chunk-T4CV4CDF.js.map → chunk-ZRG35JSH.js.map} +0 -0
@@ -143,9 +143,10 @@ export { GunsightOffset, GunsightPoint, SHIP_GUNSIGHTS, ShipGunsight, ShipGunsig
143
143
  export { DamageComponents, DamageDistribution, ModuleCategory, ModuleExclusionGroup, ModuleGuidance, ModuleLimitGroup, ModuleLimitIncrease, ModuleMount, ModuleRating, OutfittingModule, OutfittingModuleIdentity, OutfittingModuleStats, ProjectileRangeBoundaries, getBulkheadsForShip, getModuleBySymbol, getModulesByName } from './modules.js';
144
144
  export { ModuleLimitEntry, ModuleLimitUsage, SHIP_MODULE_LIMITS, calculateModuleLimits } from './module-limits.js';
145
145
  export { FrameShiftDriveJumpStats, MassCurveStats, PowerDistributorStats, PowerGenerationStats, ShieldRegenerationStats, WeaponDamageStats, hasFrameShiftDriveJumpStats, hasMassCurveStats, hasPowerDistributorStats, hasPowerGenerationStats, hasShieldRegenerationStats, hasWeaponDamageStats } from './module-capabilities.js';
146
+ export { OUTFITTING_FAMILIES, OutfittingFamilyId } from './module-families.js';
146
147
  export { BlueprintModuleEngineering, EngineeringModifier, LoadoutEvent, LoadoutModule, ModuleEngineering, Slef, SlefConstraint, SlefDiagnostic, SlefDiagnosticCode, SlefEntry, SlefHeader, SlefInspection, SlefStringifyOptions, getLoadoutModifier, inspectSlef, parseSlef, stringifySlef, toSlef } from './slef.js';
147
148
  export { FrameShiftDriveParams, TotalRangeDetails, frameShiftDriveMassFactor, fuelPerJump, singleJumpRange, totalRange } from './jump-range.js';
148
- export { ApplyBlueprintOptions, AvailableBlueprint, BuildCost, BuildCredits, BuildWeaponMetrics, DefenceOptions, DistributorOptions, EngineeringNormalizationCode, EngineeringNormalizationResult, EngineeringNormalizationUnchanged, EngineeringNormalizationUnsupported, EngineeringNormalized, ExperimentalEffectMutationCode, ExperimentalEffectMutationResult, ExperimentalEffectUnchanged, ExperimentalEffectUnsupported, ExperimentalEffectUpdated, FittedModule, FittedWeaponMetrics, FixedMountRepairResult, ImmovableReason, JumpOptions, JumpRangeSummary, LoadoutEditError, LoadoutEditErrorCode, LoadoutExportOptions, LoadoutImportOutcome, LoadoutSlot, MobilityOptions, ShipLoadout, SlefExportOptions, StandardLoad, StandardLoadInputs, WeaponsOptions } from './ship-loadout.js';
149
+ export { ApplyBlueprintOptions, AvailableBlueprint, BuildCost, BuildCredits, BuildMass, BuildWeaponMetrics, DefenceOptions, DistributorOptions, EngineeringNormalizationCode, EngineeringNormalizationResult, EngineeringNormalizationUnchanged, EngineeringNormalizationUnsupported, EngineeringNormalized, ExperimentalEffectMutationCode, ExperimentalEffectMutationResult, ExperimentalEffectUnchanged, ExperimentalEffectUnsupported, ExperimentalEffectUpdated, FittedModule, FittedWeaponMetrics, FixedMountRepairResult, ImmovableReason, JumpOptions, JumpRangeSummary, LoadoutEditError, LoadoutEditErrorCode, LoadoutExportOptions, LoadoutImportOutcome, LoadoutSlot, MobilityOptions, ShipLoadout, SlefExportOptions, StandardLoad, StandardLoadInputs, WeaponsOptions } from './ship-loadout.js';
149
150
  export { CalculationIssue, CalculationIssueReason, CalculationResult, FuelCapacity, LoadoutCalculationModule, calculateCargoCapacity, calculateFuelCapacity, calculateUnladenMass } from './loadout-calculations.js';
150
151
  export { LoadoutIssue, LoadoutIssueCode, LoadoutIssueParam, LoadoutIssueParams, LoadoutValidation, LoadoutValidationInput, ModuleFitConstraint, ValidationModule, validateLoadout } from './loadout-validation.js';
151
152
  export { SourceModuleValue, SourcePurchaseRecord, getSourceModuleValue, sourcePurchaseFromLoadout, sumSourceModuleValues } from './source-purchase.js';
@@ -1 +1 @@
1
- export{LoadoutEditError,ShipLoadout}from"../chunk-ZKU7CMAH.js";export{shieldMassCurveMultiplier,shieldMetrics,shieldStrength}from"../chunk-2FHHMYDC.js";export{SHIPS,getShipByName,getShipBySymbol,getShipSlots}from"../chunk-WNGQ3IAM.js";export{getLoadoutModifier,inspectSlef,parseSlef,stringifySlef,toSlef}from"../chunk-UXFMVZAY.js";export{getSourceModuleValue,sourcePurchaseFromLoadout,sumSourceModuleValues}from"../chunk-IYU4WLFM.js";export{weaponsCapacitorMetrics}from"../chunk-FMPRCYKY.js";export{powerBudget}from"../chunk-RLUS76LZ.js";export{getPreEngineeredJournalModifiers,getPreEngineeredModifiers,getPreEngineeredStats,identifyPreEngineeredVariant,unresolvedModifiers}from"../chunk-BZDTEXXM.js";export{armourPiercingFactor,combinedRateOfFire,damageFalloff,damagePerSecond,energyPerSecond,heatPerSecond,splitDamage,sumWeaponMetrics,sustainedDamagePerSecond,sustainedFireFactor,weaponMetrics}from"../chunk-LJI7VXJD.js";export{getBulkheadsForShip,getModuleBySymbol,getModulesByName}from"../chunk-UPUC5X2C.js";export{PRE_ENGINEERED_MODULES,getPreEngineeredVariants,isPreEngineered}from"../chunk-2VPVZELZ.js";export{cellBankSummary,shieldRecovery}from"../chunk-VZZUNSDF.js";export{calculateCargoCapacity,calculateFuelCapacity,calculateUnladenMass}from"../chunk-AFVYCQWL.js";export{validateLoadout}from"../chunk-B4ZSTOM4.js";export{mobilityMetrics,thrusterMassCurveMultiplier}from"../chunk-24INI4U7.js";export{hasFrameShiftDriveJumpStats,hasMassCurveStats,hasPowerDistributorStats,hasPowerGenerationStats,hasShieldRegenerationStats,hasWeaponDamageStats}from"../chunk-JTQVWIGL.js";export{SHIP_MODULE_LIMITS,calculateModuleLimits}from"../chunk-KPETDYQX.js"; export{EXPERIMENTAL_EFFECTS,getExperimentalEffect}from"../chunk-JPBMRJFC.js";export{SHIP_GUNSIGHTS,getShipGunsight,projectGunsight}from"../chunk-DBGXZF7O.js";export{OVERHEAT_HEAT_LEVEL,effectiveWeaponThermalLoad,equilibriumHeatLevel,heatLevelAtTime,heatMetrics,secondsToHeatLevel}from"../chunk-W6EPHHTS.js";export{frameShiftDriveMassFactor,fuelPerJump,singleJumpRange,totalRange}from"../chunk-GQ5GX5TB.js";export{ammunitionCapacity}from"../chunk-AA3K5XUE.js";export{armourMetrics}from"../chunk-FGXWVFN6.js";export{effectiveHitPoints,mapDamageTypes,stackArmourResistance,stackShieldResistance,systemsResistance}from"../chunk-ZNCXENNB.js"; export{computeModifiers,rollsForGrade,sumMaterials}from"../chunk-DYPOL3CI.js";export{resolveBlueprintForModule}from"../chunk-2TW4ZBI3.js";export{ENGINEERING_OPTION_GROUPS,getBlueprintsForModule,getEngineeringGroup,getExperimentalsForBlueprint,getExperimentalsForModule}from"../chunk-QTZPA2FR.js";export{BLUEPRINTS,getBlueprint,getBlueprintGrade}from"../chunk-Q3QCLNVG.js"; export{distributorMetrics}from"../chunk-P2QOL63K.js"; export{SLOT_RESTRICTION_LABELS,enumerateSlots,parseSlotName}from"../chunk-RAO35XDF.js"; //# sourceMappingURL=index.js.map
1
+ export{LoadoutEditError,ShipLoadout}from"../chunk-3BM5BHI3.js";export{weaponsCapacitorMetrics}from"../chunk-FMPRCYKY.js";export{cellBankSummary,shieldRecovery}from"../chunk-VZZUNSDF.js";export{shieldMassCurveMultiplier,shieldMetrics,shieldStrength}from"../chunk-2FHHMYDC.js";export{SHIPS,getShipByName,getShipBySymbol,getShipSlots}from"../chunk-WNGQ3IAM.js";export{getLoadoutModifier,inspectSlef,parseSlef,stringifySlef,toSlef}from"../chunk-OVUHQEH5.js";export{getSourceModuleValue,sourcePurchaseFromLoadout,sumSourceModuleValues}from"../chunk-IYU4WLFM.js";export{powerBudget}from"../chunk-RLUS76LZ.js";export{getPreEngineeredJournalModifiers,getPreEngineeredModifiers,getPreEngineeredStats,identifyPreEngineeredVariant,unresolvedModifiers}from"../chunk-6BO5JJNI.js";export{armourPiercingFactor,combinedRateOfFire,damageFalloff,damagePerSecond,energyPerSecond,heatPerSecond,splitDamage,sumWeaponMetrics,sustainedDamagePerSecond,sustainedFireFactor,weaponMetrics}from"../chunk-LJI7VXJD.js";export{getBulkheadsForShip,getModuleBySymbol,getModulesByName}from"../chunk-PA5EITW5.js";export{PRE_ENGINEERED_MODULES,getPreEngineeredVariants,isPreEngineered}from"../chunk-2VPVZELZ.js";export{frameShiftDriveMassFactor,fuelPerJump,singleJumpRange,totalRange}from"../chunk-GQ5GX5TB.js";export{calculateCargoCapacity,calculateFuelCapacity,calculateUnladenMass}from"../chunk-AFVYCQWL.js";export{validateLoadout}from"../chunk-B4ZSTOM4.js";export{mobilityMetrics,thrusterMassCurveMultiplier}from"../chunk-CX7B67OI.js";export{hasFrameShiftDriveJumpStats,hasMassCurveStats,hasPowerDistributorStats,hasPowerGenerationStats,hasShieldRegenerationStats,hasWeaponDamageStats}from"../chunk-JTQVWIGL.js";export{OUTFITTING_FAMILIES}from"../chunk-M6G3UDTX.js";export{SHIP_MODULE_LIMITS,calculateModuleLimits}from"../chunk-KPETDYQX.js"; export{distributorMetrics}from"../chunk-P2QOL63K.js"; export{EXPERIMENTAL_EFFECTS,getExperimentalEffect}from"../chunk-JPBMRJFC.js";export{SHIP_GUNSIGHTS,getShipGunsight,projectGunsight}from"../chunk-DBGXZF7O.js";export{OVERHEAT_HEAT_LEVEL,effectiveWeaponThermalLoad,equilibriumHeatLevel,heatLevelAtTime,heatMetrics,secondsToHeatLevel}from"../chunk-W6EPHHTS.js";export{ammunitionCapacity}from"../chunk-AA3K5XUE.js";export{armourMetrics}from"../chunk-FGXWVFN6.js";export{effectiveHitPoints,mapDamageTypes,stackArmourResistance,stackShieldResistance,systemsResistance}from"../chunk-ZNCXENNB.js"; export{computeModifiers,rollsForGrade,sumMaterials}from"../chunk-DYPOL3CI.js";export{resolveBlueprintForModule}from"../chunk-2TW4ZBI3.js";export{ENGINEERING_OPTION_GROUPS,getBlueprintsForModule,getEngineeringGroup,getExperimentalsForBlueprint,getExperimentalsForModule}from"../chunk-QTZPA2FR.js";export{BLUEPRINTS,getBlueprint,getBlueprintGrade}from"../chunk-Q3QCLNVG.js"; export{SLOT_RESTRICTION_LABELS,enumerateSlots,parseSlotName}from"../chunk-RAO35XDF.js"; //# sourceMappingURL=index.js.map
@@ -1,6 +1,7 @@
1
1
  import { BuildSlot } from './slots.js';
2
2
  import { ModuleExclusionGroup, ModuleLimitGroup, ModuleLimitIncrease } from './modules.js';
3
3
  import './engineering-options.js';
4
+ import './module-families.js';
4
5
 
5
6
  /**
6
7
  * Structural validation for fitted ship loadouts.
@@ -66,6 +66,18 @@ interface MobilityInput {
66
66
  }
67
67
  /** Speed and rotation rates for one loaded ship. */
68
68
  interface MobilityMetrics {
69
+ /**
70
+ * The loaded mass these figures were calculated at, in tonnes — the
71
+ * {@link MobilityInput.mass} that went in.
72
+ *
73
+ * @remarks
74
+ * Reported so a build-level caller, which never states the mass itself, can read
75
+ * what the curve was evaluated at. Against the fitted curve's `optMass` and
76
+ * `maxMass` it is the build's position on that curve: at or below `optMass` the
77
+ * thrusters are at or above their rated performance, and past `maxMass` they do not
78
+ * move the ship at all — {@link massCurveMultiplier} is `0` there.
79
+ */
80
+ readonly loadedMass: number;
69
81
  /** Top speed at this mass and ENG allocation, in metres per second. */
70
82
  readonly speed: number;
71
83
  /** Boost speed at this mass, in metres per second. */
@@ -1 +1 @@
1
- export{mobilityMetrics,thrusterMassCurveMultiplier}from"../chunk-24INI4U7.js";//# sourceMappingURL=mobility.js.map
1
+ export{mobilityMetrics,thrusterMassCurveMultiplier}from"../chunk-CX7B67OI.js";//# sourceMappingURL=mobility.js.map
@@ -1,5 +1,6 @@
1
1
  import { OutfittingModuleStats } from './modules.js';
2
2
  import './engineering-options.js';
3
+ import './module-families.js';
3
4
  import './slots.js';
4
5
 
5
6
  /**
@@ -0,0 +1,49 @@
1
+ /**
2
+ * The outfitting **module families** — the grouping an outfitting list shows above the
3
+ * modules that share it, and the id every {@link OutfittingModuleIdentity} carries.
4
+ *
5
+ * A family is coarser than an engineering group and finer than an outfitting category:
6
+ * ordinary, Bi-Weave and Prismatic generators are all `shieldGenerators`, while the
7
+ * eight core mounts each have their own family. Localized display text for these ids is
8
+ * `getOutfittingFamilyName` in `i18n/module-families`.
9
+ *
10
+ * @packageDocumentation
11
+ */
12
+ /**
13
+ * A stable identifier for an outfitting module family.
14
+ *
15
+ * @remarks
16
+ * These are the keys of {@link OUTFITTING_FAMILIES}. Every module carries one, core
17
+ * modules included, so an outfitting list can group every choice
18
+ * `ShipLoadout.modulesForSlot()` returns without a private taxonomy. Closely related
19
+ * variants share a family: Mk II and corrosion-resistant racks are `cargoRacks`, and a
20
+ * pre-engineered or Powerplay variant stays in its base module's family.
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * import type { OutfittingFamilyId } from '@elite-dangerous-almanac/core/ships/module-families';
25
+ *
26
+ * const family: OutfittingFamilyId = 'shieldGenerators';
27
+ * ```
28
+ */
29
+ type OutfittingFamilyId = 'armour' | 'powerPlants' | 'engines' | 'fsd' | 'lifeSupport' | 'powerDistributors' | 'sensors' | 'fuelTanks' | 'dockingComputers' | 'shieldGenerators' | 'shieldCellBanks' | 'cargoRacks' | 'hatchBreakerLimpets' | 'surfaceScanners' | 'fuelScoops' | 'refineries' | 'fsdInterdictors' | 'afms' | 'hullReinforcements' | 'collectorLimpets' | 'fuelTransferLimpets' | 'prospectingLimpets' | 'planetaryVehicleHangars' | 'planetaryApproachSuites' | 'cargoHatches' | 'passengerCabins' | 'vesselHangars' | 'moduleReinforcements' | 'repairLimpets' | 'researchLimpets' | 'decontaminationLimpets' | 'guardianShieldReinforcementPackages' | 'fsdBoosters' | 'guardianHybridPowerDistributors' | 'guardianHybridPowerPlants' | 'reconLimpets' | 'flightAssists' | 'miningMultiLimpetControllers' | 'multiLimpetControllers' | 'experimentalWeaponStabilisers' | 'pulseLasers' | 'burstLasers' | 'beamLasers' | 'cannons' | 'fragmentCannons' | 'multiCannons' | 'plasmaAccelerators' | 'railGuns' | 'missiles' | 'mines' | 'torpedoes' | 'miningLasers' | 'remoteReleaseFlakLaunchers' | 'axMissileRacks' | 'axMultiCannons' | 'guardianGaussCannons' | 'remoteReleaseFlechetteLaunchers' | 'guardianPlasmaChargers' | 'guardianShardCannons' | 'shockCannons' | 'subSurfaceDisplacementMissiles' | 'abrasionBlasters' | 'miningTools' | 'subSurfaceExtractionMissiles' | 'guardianNaniteTorpedoPylons' | 'chaffLaunchers' | 'ecms' | 'heatsinkLaunchers' | 'pointDefence' | 'manifestScanners' | 'wakeScanners' | 'killWarrantScanners' | 'shieldBoosters' | 'shutdownFieldNeutralisers' | 'xenoScanners' | 'pulseWaveAnalyser' | 'causticSinkLaunchers';
30
+ /**
31
+ * Every outfitting family's canonical English display name, keyed by id.
32
+ *
33
+ * @remarks
34
+ * The names are Frontier's own outfitting category labels where the game publishes one,
35
+ * and the Almanac's descriptive name for the 19 families it does not. They are
36
+ * canonical English, not localized UI text: use
37
+ * `getOutfittingFamilyName` for a locale.
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * import { OUTFITTING_FAMILIES } from '@elite-dangerous-almanac/core/ships/module-families';
42
+ *
43
+ * OUTFITTING_FAMILIES.shieldGenerators; // -> 'Shield Generators'
44
+ * OUTFITTING_FAMILIES.armour; // -> 'Armour'
45
+ * ```
46
+ */
47
+ declare const OUTFITTING_FAMILIES: Readonly<Record<OutfittingFamilyId, string>>;
48
+
49
+ export { OUTFITTING_FAMILIES, type OutfittingFamilyId };
@@ -0,0 +1 @@
1
+ export{OUTFITTING_FAMILIES}from"../chunk-M6G3UDTX.js"; //# sourceMappingURL=module-families.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"O"}
@@ -1,5 +1,6 @@
1
1
  import { ModuleLimitGroup, ModuleLimitIncrease } from './modules.js';
2
2
  import './engineering-options.js';
3
+ import './module-families.js';
3
4
  import './slots.js';
4
5
 
5
6
  /**
@@ -1,5 +1,6 @@
1
1
  import { OutfittingModule } from './modules.js';
2
2
  import './engineering-options.js';
3
+ import './module-families.js';
3
4
  import './slots.js';
4
5
 
5
6
  /**
@@ -1 +1 @@
1
- export{ALL_MODULES}from"../chunk-PEHOKSSD.js"; //# sourceMappingURL=modules-all.js.map
1
+ export{ALL_MODULES}from"../chunk-QY3L5BKN.js"; //# sourceMappingURL=modules-all.js.map
@@ -1,5 +1,6 @@
1
1
  import { OutfittingModule } from './modules.js';
2
2
  import './engineering-options.js';
3
+ import './module-families.js';
3
4
  import './slots.js';
4
5
 
5
6
  /**
@@ -1 +1 @@
1
- export{CORE_MODULES}from"../chunk-3EO7PTAP.js"; //# sourceMappingURL=modules-core.js.map
1
+ export{CORE_MODULES}from"../chunk-EVJ32UF3.js"; //# sourceMappingURL=modules-core.js.map
@@ -1,5 +1,6 @@
1
1
  import { OutfittingModule } from './modules.js';
2
2
  import './engineering-options.js';
3
+ import './module-families.js';
3
4
  import './slots.js';
4
5
 
5
6
  /**
@@ -34,7 +35,7 @@ import './slots.js';
34
35
  * import { HARDPOINT_MODULES } from '@elite-dangerous-almanac/core/ships/modules-hardpoint';
35
36
  *
36
37
  * HARDPOINT_MODULES.length; // -> 159
37
- * HARDPOINT_MODULES.filter((m) => m.family === 'Beam Lasers').length; // -> 12
38
+ * HARDPOINT_MODULES.filter((m) => m.familyId === 'beamLasers').length; // -> 12
38
39
  * HARDPOINT_MODULES.filter((m) => m.mount === 'Turreted').length; // turreted variants
39
40
  * ```
40
41
  */
@@ -1 +1 @@
1
- export{HARDPOINT_MODULES}from"../chunk-PYV7VI6I.js"; //# sourceMappingURL=modules-hardpoint.js.map
1
+ export{HARDPOINT_MODULES}from"../chunk-4TFAZX73.js"; //# sourceMappingURL=modules-hardpoint.js.map
@@ -1,5 +1,6 @@
1
1
  import { OutfittingModule } from './modules.js';
2
2
  import './engineering-options.js';
3
+ import './module-families.js';
3
4
  import './slots.js';
4
5
 
5
6
  /**
@@ -33,7 +34,7 @@ import './slots.js';
33
34
  * import { INTERNAL_MODULES } from '@elite-dangerous-almanac/core/ships/modules-internal';
34
35
  *
35
36
  * INTERNAL_MODULES.length; // -> 484
36
- * INTERNAL_MODULES.filter((m) => m.family === 'Cargo Racks').length; // -> 16
37
+ * INTERNAL_MODULES.filter((m) => m.familyId === 'cargoRacks').length; // -> 16
37
38
  * ```
38
39
  */
39
40
  declare const INTERNAL_MODULES: readonly OutfittingModule[];
@@ -1 +1 @@
1
- export{INTERNAL_MODULES}from"../chunk-5V4OXZLE.js"; //# sourceMappingURL=modules-internal.js.map
1
+ export{INTERNAL_MODULES}from"../chunk-4ZGUSHTP.js"; //# sourceMappingURL=modules-internal.js.map
@@ -1,5 +1,6 @@
1
1
  import { OutfittingModule } from './modules.js';
2
2
  import './engineering-options.js';
3
+ import './module-families.js';
3
4
  import './slots.js';
4
5
 
5
6
  /**
@@ -33,7 +34,7 @@ import './slots.js';
33
34
  * import { UTILITY_MODULES } from '@elite-dangerous-almanac/core/ships/modules-utility';
34
35
  *
35
36
  * UTILITY_MODULES.length; // -> 35
36
- * UTILITY_MODULES.filter((m) => m.family === 'Shield Boosters').length; // -> 5
37
+ * UTILITY_MODULES.filter((m) => m.familyId === 'shieldBoosters').length; // -> 5
37
38
  * ```
38
39
  */
39
40
  declare const UTILITY_MODULES: readonly OutfittingModule[];
@@ -1 +1 @@
1
- export{UTILITY_MODULES}from"../chunk-6FKBZPI6.js"; //# sourceMappingURL=modules-utility.js.map
1
+ export{UTILITY_MODULES}from"../chunk-ELT3FEA4.js"; //# sourceMappingURL=modules-utility.js.map
@@ -1,4 +1,5 @@
1
1
  import { EngineeringGroupId } from './engineering-options.js';
2
+ import { OutfittingFamilyId } from './module-families.js';
2
3
  import { ModuleSlot, SlotRestriction } from './slots.js';
3
4
 
4
5
  /**
@@ -43,7 +44,7 @@ import { ModuleSlot, SlotRestriction } from './slots.js';
43
44
  *
44
45
  * @remarks
45
46
  * **This is the one default that costs real bundle weight.** A lookup imported from
46
- * here pulls all four catalogues — 318.3 KiB minified (32.4 KiB gzipped) — since
47
+ * here pulls all four catalogues — 337.4 KiB minified (33.3 KiB gzipped) — since
47
48
  * that is what it falls back to, and passing an explicit catalogue does not undo it.
48
49
  * A build that must carry only one category should import that catalogue and search
49
50
  * it directly:
@@ -200,7 +201,7 @@ interface ProjectileRangeBoundaries {
200
201
  * Identity, classification, fit constraints, and price for one outfitting module.
201
202
  *
202
203
  * @remarks
203
- * The core identity fields (`symbol`, `name`, `category`, `family`, `class`, and `rating`)
204
+ * The core identity fields (`symbol`, `name`, `category`, `familyId`, `class`, and `rating`)
204
205
  * are always present. Optional fields describe fit restrictions, purchase entitlement,
205
206
  * and price. Performance data belongs to {@link OutfittingModuleStats}; the complete
206
207
  * flat catalogue record is {@link OutfittingModule}.
@@ -213,7 +214,7 @@ interface ProjectileRangeBoundaries {
213
214
  * symbol: 'CustomBeamLaser',
214
215
  * category: 'hardpoint',
215
216
  * engineeringGroup: 'beamLasers',
216
- * family: 'Beam Lasers',
217
+ * familyId: 'beamLasers',
217
218
  * name: 'Custom Beam Laser',
218
219
  * class: 2,
219
220
  * rating: 'D',
@@ -241,21 +242,21 @@ interface OutfittingModuleIdentity {
241
242
  */
242
243
  readonly engineeringGroup: EngineeringGroupId | null;
243
244
  /**
244
- * Stable descriptive English family used to group an outfitting list, such as
245
- * `"Cargo Racks"`, `"Shield Generators"`, or `"Beam Lasers"`.
245
+ * Stable outfitting family used to group an outfitting list, such as
246
+ * `'cargoRacks'`, `'shieldGenerators'` or `'beamLasers'`. See
247
+ * {@link OutfittingFamilyId}.
246
248
  *
247
249
  * @remarks
248
- * Every optional-internal, hardpoint, and utility-mount record carries a family.
249
- * Closely related variants share it: Bi-Weave and Prismatic generators are Shield
250
- * Generators, Mk II and corrosion-resistant racks are Cargo Racks, and Powerplay
251
- * weapon variants stay with their base weapon family. Core modules are outside this
252
- * display grouping and carry `null`.
250
+ * Every record carries one, core modules included, so every choice
251
+ * {@link ShipLoadout.modulesForSlot} returns has a family. Closely related variants
252
+ * share it: Bi-Weave and Prismatic generators are `'shieldGenerators'`, Mk II and
253
+ * corrosion-resistant racks are `'cargoRacks'`, and a Powerplay or pre-engineered
254
+ * variant stays with its base weapon's family.
253
255
  *
254
- * This canonical label is not localized and is not suitable as a localization key;
255
- * source-backed locale coverage is tracked in
256
- * [#320](https://github.com/DarkSession/Elite-Dangerous-Almanac/issues/320).
256
+ * {@link OUTFITTING_FAMILIES} gives the canonical English display name;
257
+ * `getOutfittingFamilyName` in `i18n/module-families` gives a localized one.
257
258
  */
258
- readonly family: string | null;
259
+ readonly familyId: OutfittingFamilyId;
259
260
  /**
260
261
  * The one fixed mount this module fills, when it fills one: `'armour'` or one of
261
262
  * the seven {@link CoreSlotType} core functions.
@@ -498,6 +499,32 @@ interface OutfittingModuleStats {
498
499
  * drive of the same size.
499
500
  */
500
501
  readonly fsdHeatRate?: number;
502
+ /**
503
+ * Frame shift drive: `true` on a Supercruise Overcharge drive, the line the
504
+ * outfitting screen labels SCO.
505
+ *
506
+ * @remarks
507
+ * A sparse capability flag on the 36 Overcharge drives and absent everywhere else,
508
+ * including on the 36 ordinary drives of the same sizes and ratings. Read it rather
509
+ * than matching `Int_Hyperdrive_Overcharge` on the symbol: the capability is the
510
+ * record's to state, and a pre-engineered or fitted article carries the flag
511
+ * through while its symbol is not always the one you looked up.
512
+ *
513
+ * The two lines share every jump constant this library models, so the flag changes
514
+ * no calculation here; it is what an outfitting list filters and labels on. The
515
+ * overcharged supercruise behaviour itself — the boosted acceleration and the extra
516
+ * fuel it burns — is in-flight behaviour the game publishes no figures for, and the
517
+ * library models none of it.
518
+ *
519
+ * @example
520
+ * ```ts
521
+ * import { getModuleBySymbol } from '@elite-dangerous-almanac/core/ships/modules';
522
+ *
523
+ * getModuleBySymbol('Int_Hyperdrive_Overcharge_Size5_Class5')?.supercruiseOvercharge; // -> true
524
+ * getModuleBySymbol('Int_Hyperdrive_Size5_Class5')?.supercruiseOvercharge; // -> undefined
525
+ * ```
526
+ */
527
+ readonly supercruiseOvercharge?: boolean;
501
528
  /** Guardian FSD Booster: flat jump-range bonus, in light-years. */
502
529
  readonly jumpBoost?: number;
503
530
  /** Power plant: power generated, in megawatts. */
@@ -1 +1 @@
1
- export{getBulkheadsForShip,getModuleBySymbol,getModulesByName}from"../chunk-UPUC5X2C.js"; //# sourceMappingURL=modules.js.map
1
+ export{getBulkheadsForShip,getModuleBySymbol,getModulesByName}from"../chunk-PA5EITW5.js"; //# sourceMappingURL=modules.js.map
@@ -2,6 +2,7 @@ import { OutfittingModule } from './modules.js';
2
2
  import { PreEngineeredVariant } from './pre-engineered.js';
3
3
  import { EngineeringModifier, LoadoutModule } from './slef.js';
4
4
  import './engineering-options.js';
5
+ import './module-families.js';
5
6
  import './slots.js';
6
7
 
7
8
  /**
@@ -1 +1 @@
1
- export{getPreEngineeredJournalModifiers,getPreEngineeredModifiers,getPreEngineeredStats,identifyPreEngineeredVariant,unresolvedModifiers}from"../chunk-BZDTEXXM.js"; //# sourceMappingURL=pre-engineered-stats.js.map
1
+ export{getPreEngineeredJournalModifiers,getPreEngineeredModifiers,getPreEngineeredStats,identifyPreEngineeredVariant,unresolvedModifiers}from"../chunk-6BO5JJNI.js"; //# sourceMappingURL=pre-engineered-stats.js.map
@@ -11,13 +11,14 @@ import { WeaponMetrics, WeaponTotals } from './weapons.js';
11
11
  import { AmmunitionCapacity } from './ammunition.js';
12
12
  import { WeaponsCapacitorMetrics } from './weapons-capacitor.js';
13
13
  import { DistributorMetrics } from './distributor.js';
14
- import { MobilityMetrics } from './mobility.js';
14
+ import { ThrusterParams, MobilityMetrics } from './mobility.js';
15
15
  import { ShieldRecovery, CellBankSummary } from './shield-recovery.js';
16
16
  import { PreEngineeredVariant } from './pre-engineered.js';
17
17
  import { SourcePurchaseRecord } from './source-purchase.js';
18
18
  import { FuelCapacity, CalculationResult } from './loadout-calculations.js';
19
19
  import { ModuleFitConstraint, LoadoutIssueParams, LoadoutValidation } from './loadout-validation.js';
20
20
  import './engineering-options.js';
21
+ import './module-families.js';
21
22
  import './resistances.js';
22
23
 
23
24
  /**
@@ -389,7 +390,10 @@ interface EngineeringNormalizationUnchanged {
389
390
  interface EngineeringNormalized {
390
391
  /** Discriminator for a successful normalization. */
391
392
  readonly kind: 'normalized';
392
- /** Quality reported by the fitted module before normalization, in `[0, 1)`. */
393
+ /**
394
+ * Quality reported by the fitted module before normalization, in `[0, 1]`. It reads
395
+ * `1` where a completed roll stated no modifiers and this call spelled them out.
396
+ */
393
397
  readonly previousQuality: number;
394
398
  /** Completed engineering quality. Always `1`. */
395
399
  readonly quality: 1;
@@ -421,12 +425,29 @@ interface MobilityOptions extends JumpOptions {
421
425
  }
422
426
  /** A standard fuel-and-cargo condition shared by jump and mobility views. */
423
427
  type StandardLoad = 'maximum' | 'unladen' | 'laden';
424
- /** Fuel and cargo carried for a {@link StandardLoad}, both in tonnes. */
428
+ /** What a {@link StandardLoad} carries, and what the ship weighs carrying it. */
425
429
  interface StandardLoadInputs {
426
430
  /** Main-tank fuel carried, in tonnes. */
427
431
  readonly fuel: number;
428
432
  /** Cargo carried, in tonnes. */
429
433
  readonly cargo: number;
434
+ /**
435
+ * What the ship weighs at this load, in tonnes: {@link ShipLoadout.unladenMass}
436
+ * plus `fuel` plus `cargo`.
437
+ *
438
+ * @remarks
439
+ * This is the mass the jump and mobility calculations run on, so it is the figure
440
+ * to show beside them rather than one reassembled by the caller. The reserve tank
441
+ * is **not** in it: the game's statistics panel counts the reserve in the current
442
+ * mass it displays, and neither calculation here does — see
443
+ * {@link ShipLoadout.mobilityMetrics}. Add {@link FuelCapacity.reserve} to match the
444
+ * panel.
445
+ *
446
+ * The extra `fuel` and `cargo` are the load a screen labels; the mass is what they
447
+ * add up to, and passing the whole value back into {@link ShipLoadout.jumpRange} or
448
+ * {@link ShipLoadout.mobilityMetrics} is unaffected by its presence.
449
+ */
450
+ readonly mass: number;
430
451
  }
431
452
  /** Optional WEP allocation for {@link ShipLoadout.weaponsCapacitorMetrics}. */
432
453
  interface WeaponsOptions {
@@ -499,6 +520,47 @@ interface BuildCost {
499
520
  */
500
521
  readonly materials: readonly EngineeringMaterial[];
501
522
  }
523
+ /**
524
+ * What an assembled build weighs, broken down the way {@link ShipLoadout.buildMass}
525
+ * weighs it. Every figure is in tonnes.
526
+ *
527
+ * @remarks
528
+ * The mass counterpart of {@link BuildCredits}, and the same split: what the bare hull
529
+ * contributes, what the fit adds, and the total. `fuel` and `cargo` are the chosen load
530
+ * on top of that, so `total` is the mass the jump and mobility calculations run on.
531
+ */
532
+ interface BuildMass {
533
+ /** Bare hull mass — the {@link ships!Ship.hullMass | hullMass} of the hull being flown. */
534
+ readonly hull: number;
535
+ /**
536
+ * Every fitted module's post-engineering mass, summed.
537
+ *
538
+ * @remarks
539
+ * Lightweight blueprints are already folded in, and the cargo hatch weighs nothing.
540
+ * A fitted record with no mass at all contributes `0` rather than making the total
541
+ * unavailable — mass is the one figure no article can be missing (see
542
+ * {@link ShipLoadout.unladenMass}), which is why there is no `unpriced` counterpart
543
+ * to {@link BuildCredits.unpriced} here.
544
+ */
545
+ readonly modules: number;
546
+ /**
547
+ * The ship with an empty tank and no cargo — {@link ShipLoadout.unladenMass}.
548
+ *
549
+ * @remarks
550
+ * `hull` and `modules` are always computed from the hull record and the current
551
+ * fit, while this is the build's own unladen mass, which for an unedited import is
552
+ * the figure the **capture** stated. The two agree on anything assembled here; where
553
+ * a capture disagrees with the catalogues, this is the one the jump and mobility
554
+ * calculations use and the decomposition is what the catalogues say it is made of.
555
+ */
556
+ readonly unladen: number;
557
+ /** Main-tank fuel counted, in tonnes. Defaults to a full main tank. */
558
+ readonly fuel: number;
559
+ /** Cargo counted, in tonnes. Defaults to an empty hold. */
560
+ readonly cargo: number;
561
+ /** `unladen + fuel + cargo`: what the ship weighs at the chosen load. */
562
+ readonly total: number;
563
+ }
502
564
  /** One fitted weapon and what it does, as {@link ShipLoadout.weaponMetrics} reports it. */
503
565
  interface FittedWeaponMetrics {
504
566
  /** The hardpoint's slot key, e.g. `"LargeHardpoint1"`. */
@@ -1137,6 +1199,11 @@ declare class ShipLoadout {
1137
1199
  * reward rebuilds its hand-authored modifiers and optional effect without losing its
1138
1200
  * purchase identity. A refusal never changes the loadout.
1139
1201
  *
1202
+ * A block that names a blueprint and grade but states no `Modifiers` at all is rolled
1203
+ * here too, even at quality `1` — SLEF permits that identity-only shape and Inara
1204
+ * writes it, so a capture of a completed roll would otherwise stay stock. A stated
1205
+ * modifier array, empty or partial, is left alone at quality `1`.
1206
+ *
1140
1207
  * @param slotKey - The engineered slot, matched case-insensitively.
1141
1208
  * @returns A frozen result identifying a normalized, unchanged or unsupported state.
1142
1209
  * @throws {TypeError} If `slotKey` is not a string.
@@ -1294,6 +1361,36 @@ declare class ShipLoadout {
1294
1361
  * jump constants.
1295
1362
  */
1296
1363
  get frameShiftDrive(): FrameShiftDriveParams;
1364
+ /**
1365
+ * The fitted thrusters' post-engineering mass curve, or `null` when the build has
1366
+ * none — the thruster counterpart of {@link frameShiftDrive}.
1367
+ *
1368
+ * @remarks
1369
+ * A {@link ships!ThrusterParams | ThrusterParams} carries the three masses the
1370
+ * curve is defined over and the multiplier at each, plus the separate `speedCurve`
1371
+ * and `rotationCurve` an enhanced-performance thruster refines them with. Pass it
1372
+ * straight to
1373
+ * {@link ships!thrusterMassCurveMultiplier | thrusterMassCurveMultiplier} for the
1374
+ * multiplier at a mass of your own, or read `optMass` and `maxMass` against
1375
+ * {@link ships!MobilityMetrics.loadedMass | loadedMass} for where this build sits
1376
+ * on the curve.
1377
+ *
1378
+ * This is the fitted article's curve, so a switched-off or shed thruster still has
1379
+ * one; {@link mobilityMetricsResult} is what judges whether the build can use it.
1380
+ * It answers `null` rather than throwing — unlike `frameShiftDrive`, which the jump
1381
+ * equation cannot do without — when no thrusters are fitted or the fitted record
1382
+ * carries no complete curve.
1383
+ *
1384
+ * @example
1385
+ * ```ts
1386
+ * import { ShipLoadout } from '@elite-dangerous-almanac/core/ships/ship-loadout';
1387
+ *
1388
+ * const build = ShipLoadout.default('Anaconda');
1389
+ * build.thrusters?.optMass; // -> 1440, tonnes
1390
+ * build.thrusters?.maxMass; // -> 2160, past which the ship does not move at all
1391
+ * ```
1392
+ */
1393
+ get thrusters(): ThrusterParams | null;
1297
1394
  /**
1298
1395
  * The fitted frame shift drive's dimensionless mass factor at a chosen load.
1299
1396
  *
@@ -1380,9 +1477,10 @@ declare class ShipLoadout {
1380
1477
  *
1381
1478
  * @param load - `'maximum'` for one jump's fuel and no cargo, `'unladen'` for a
1382
1479
  * full main tank and no cargo, or `'laden'` for a full main tank and full hold.
1383
- * @returns Fuel and cargo in tonnes. Only `'maximum'` can come back incomplete: it
1384
- * validates the whole fitted drive, jump booster included, so a complete one can be
1385
- * passed straight to {@link jumpRange}.
1480
+ * @returns The fuel and cargo carried, and the {@link StandardLoadInputs.mass} the
1481
+ * ship weighs carrying them, all in tonnes. Only `'maximum'` can come back
1482
+ * incomplete: it validates the whole fitted drive, jump booster included, so a
1483
+ * complete one can be passed straight to {@link jumpRange}.
1386
1484
  * @throws {RangeError} If `load` is not a recognised standard load.
1387
1485
  * @example
1388
1486
  * ```ts
@@ -1392,6 +1490,13 @@ declare class ShipLoadout {
1392
1490
  * const load = build.standardLoadResult('maximum');
1393
1491
  * if (load.complete) build.mobilityMetrics({ ...load.value, enginesPips: 2 });
1394
1492
  * ```
1493
+ * @example
1494
+ * ```ts
1495
+ * import { ShipLoadout } from '@elite-dangerous-almanac/core/ships/ship-loadout';
1496
+ *
1497
+ * const build = ShipLoadout.default('Anaconda');
1498
+ * build.standardLoadResult('laden').value?.mass; // -> 1210, tonnes with a full tank and hold
1499
+ * ```
1395
1500
  */
1396
1501
  standardLoadResult(load: StandardLoad): CalculationResult<StandardLoadInputs>;
1397
1502
  /**
@@ -1653,6 +1758,37 @@ declare class ShipLoadout {
1653
1758
  * ```
1654
1759
  */
1655
1760
  buildCost(): BuildCost;
1761
+ /**
1762
+ * Weigh the whole build: the hull, the fitted modules, and the load on top of them.
1763
+ *
1764
+ * @remarks
1765
+ * The mass companion to {@link buildCost}, answering the same question in tonnes
1766
+ * that that one answers in credits. Every module's mass is post-engineering, so a
1767
+ * Lightweight roll is already in `modules`.
1768
+ *
1769
+ * The reserve tank is **not** counted. The main tank is the fuel the drive and the
1770
+ * flight model see, and it is what {@link jumpRange} and {@link mobilityMetrics}
1771
+ * weigh; the game's statistics panel additionally counts the reserve in the current
1772
+ * mass it displays, so add {@link fuelCapacity}`.reserve` to reproduce that reading.
1773
+ *
1774
+ * @param options - {@link JumpOptions}. `fuel` defaults to a full main tank and
1775
+ * `cargo` to `0`, matching {@link jumpRange} and {@link mobilityMetrics}. Pass
1776
+ * {@link standardLoadResult} to weigh one of the standard loads.
1777
+ * @returns A frozen {@link BuildMass}, every figure in tonnes.
1778
+ * @throws {RangeError} If fuel or cargo is not finite and non-negative.
1779
+ * @example
1780
+ * ```ts
1781
+ * import { ShipLoadout } from '@elite-dangerous-almanac/core/ships/ship-loadout';
1782
+ *
1783
+ * const build = ShipLoadout.default('Anaconda');
1784
+ * const mass = build.buildMass();
1785
+ * mass.hull; // -> 400
1786
+ * mass.modules; // -> 664
1787
+ * mass.total; // -> 1096, a full main tank and an empty hold
1788
+ * build.buildMass({ cargo: build.cargoCapacity }).total; // -> 1210
1789
+ * ```
1790
+ */
1791
+ buildMass(options?: JumpOptions): BuildMass;
1656
1792
  /**
1657
1793
  * The build's armour: hull hit points, the bulkhead and reinforcement each
1658
1794
  * contribute, and the effective resistances.
@@ -1744,4 +1880,4 @@ declare class ShipLoadout {
1744
1880
  distributorMetrics(options?: DistributorOptions): DistributorMetrics | null;
1745
1881
  }
1746
1882
 
1747
- export { type ApplyBlueprintOptions, type AvailableBlueprint, type BuildCost, type BuildCredits, type BuildWeaponMetrics, type DefenceOptions, type DistributorOptions, type EngineeringNormalizationCode, type EngineeringNormalizationResult, type EngineeringNormalizationUnchanged, type EngineeringNormalizationUnsupported, type EngineeringNormalized, type ExperimentalEffectMutationCode, type ExperimentalEffectMutationResult, type ExperimentalEffectUnchanged, type ExperimentalEffectUnsupported, type ExperimentalEffectUpdated, type FittedModule, type FittedWeaponMetrics, type FixedMountRepairResult, type ImmovableReason, type JumpOptions, type JumpRangeSummary, LoadoutEditError, type LoadoutEditErrorCode, type LoadoutExportOptions, type LoadoutImportOutcome, type LoadoutSlot, type MobilityOptions, ShipLoadout, type SlefExportOptions, type StandardLoad, type StandardLoadInputs, type WeaponsOptions };
1883
+ export { type ApplyBlueprintOptions, type AvailableBlueprint, type BuildCost, type BuildCredits, type BuildMass, type BuildWeaponMetrics, type DefenceOptions, type DistributorOptions, type EngineeringNormalizationCode, type EngineeringNormalizationResult, type EngineeringNormalizationUnchanged, type EngineeringNormalizationUnsupported, type EngineeringNormalized, type ExperimentalEffectMutationCode, type ExperimentalEffectMutationResult, type ExperimentalEffectUnchanged, type ExperimentalEffectUnsupported, type ExperimentalEffectUpdated, type FittedModule, type FittedWeaponMetrics, type FixedMountRepairResult, type ImmovableReason, type JumpOptions, type JumpRangeSummary, LoadoutEditError, type LoadoutEditErrorCode, type LoadoutExportOptions, type LoadoutImportOutcome, type LoadoutSlot, type MobilityOptions, ShipLoadout, type SlefExportOptions, type StandardLoad, type StandardLoadInputs, type WeaponsOptions };
@@ -1 +1 @@
1
- export{LoadoutEditError,ShipLoadout}from"../chunk-ZKU7CMAH.js"; //# sourceMappingURL=ship-loadout.js.map
1
+ export{LoadoutEditError,ShipLoadout}from"../chunk-3BM5BHI3.js"; //# sourceMappingURL=ship-loadout.js.map
@@ -91,9 +91,10 @@ interface BlueprintModuleEngineering {
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
93
  * changed". A craftable recipe can be reconstructed with
94
- * {@link ShipLoadout.applyBlueprint}; resolve a fixed identity through the
95
- * pre-engineered catalogue and fit it with
96
- * {@link ShipLoadout.setPreEngineeredVariant}.
94
+ * {@link ShipLoadout.applyBlueprint}, or rolled where it stands with
95
+ * {@link ShipLoadout.completeEngineeringGrade}, which spells out a stated identity
96
+ * at quality `1`; resolve a fixed identity through the pre-engineered catalogue and
97
+ * fit it with {@link ShipLoadout.setPreEngineeredVariant}.
97
98
  */
98
99
  readonly Modifiers?: readonly EngineeringModifier[];
99
100
  }
@@ -149,13 +150,14 @@ interface LoadoutModule {
149
150
  * Only `Ship` and `Modules` are strictly required by SLEF; every other field is
150
151
  * optional. Masses are in tonnes, ranges in light-years, values in credits.
151
152
  *
152
- * `timestamp`, `ShipID`, `HullHealth` and `Hot` are deliberately outside the durable
153
- * loadout shape. They describe the capture or the ship instance/state rather than its
154
- * fit, so {@link ShipLoadout.fromLoadout} drops them and subsequent loadout/SLEF exports
155
- * never write them. A tolerant parse still accepts an input object carrying those keys.
153
+ * `event`, `timestamp`, `ShipID`, `HullHealth` and `Hot` are deliberately outside the
154
+ * durable loadout shape. They name the journal line, or describe the capture or the ship
155
+ * instance/state, rather than its fit, so {@link ShipLoadout.fromLoadout} drops them and
156
+ * subsequent loadout/SLEF exports never write them. A tolerant parse still accepts an
157
+ * input object carrying those keys.
156
158
  */
157
159
  interface LoadoutEvent {
158
- /** Always `"Loadout"`. */
160
+ /** `"Loadout"` when a journal line supplied it. Accepted on input, never written. */
159
161
  readonly event?: string;
160
162
  /** The hull's internal id, e.g. `"explorer_nx"` (lower-cased). */
161
163
  readonly Ship: string;