ships - Elite-Dangerous-Almanac/Almanac-Core GitHub Wiki
@elite-dangerous-almanac/core / ships
Ship and outfitting data for Elite Dangerous — Frontier's shipyard and outfitting registries.
This entry point re-exports the ships feature area. Every symbol is also reachable from its own module, so bundlers can drop anything you do not use.
Working with a whole build? Start with ShipLoadout — it reads a SLEF
export (ShipLoadout.fromSlef) or a journal Loadout event
(ShipLoadout.fromLoadout), writes either back out
(ShipLoadout.toSlefString, ShipLoadout.toLoadoutEvent), fits modules
and applies engineering, and carries the figures a capture stated (unladenMass,
rebuy) — keeping what a capture said it paid apart from what the build is worth at
retail (ShipLoadout.sourcePurchase). BuildMetrics is the other
half: BuildMetrics.of(build) answers the questions apps actually ask
(BuildMetrics.maxJumpRange, BuildMetrics.powerBudget,
BuildMetrics.shieldMetricsResult), so an editor need not import the calculations nor
a viewer the editors. Together they are the batteries-included facade and pull in
every catalogue; everything below is what they are built from, so drop to the pieces
when you need one answer rather than a whole ship.
The area has five layers:
- Ships — SHIPS and the getShipBySymbol / getShipByName lookups; each Ship carries the hull's identity, stats and slot layout together. SHIP_GUNSIGHTS and projectGunsight place a hull's fixed mounts at any target range, and the default-loadouts subpath carries the stock modules ShipLoadout.default turns into a live build.
- Modules — the OutfittingModule type and the lookups (getModuleBySymbol & co.), which search the whole catalogue unless you hand them a narrower set; capability guards such as hasWeaponDamageStats narrow the sparse record before stat access. The catalogues live on explicit subpaths split by Frontier's four outfitting categories — CORE_MODULES, INTERNAL_MODULES, HARDPOINT_MODULES, UTILITY_MODULES and ALL_MODULES — so importing one never bundles the rest.
-
Jump range & SLEF — frameShiftDriveMassFactor,
singleJumpRange, fuelPerJump and totalRange are pure maths
over FrameShiftDriveParams; parseSlef reads an Inara SLEF export — or
a bare journal
Loadoutevent — and toSlef / stringifySlef write one back out. - Build metrics — the rest of what an outfitting screen shows, each its own data-free module: powerBudget, shieldMetrics and armourMetrics (with stackShieldResistance / stackArmourResistance behind their resistances), weaponMetrics, mobilityMetrics, shieldRecovery, distributorMetrics, ammunitionCapacity and heatMetrics. A pip allocation is always a separate call over the bare figure, one entry point per capacitor: shieldCapacitorMetrics for SYS, mobilityCapacitorMetrics for ENG and weaponsCapacitorMetrics for WEP.
- Engineering — computeModifiers applies the primitive legs of a BLUEPRINTS recipe and an EXPERIMENTAL_EFFECTS entry; ShipLoadout.applyBlueprint presents that result under Frontier's journal labels, while ShipLoadout.setPreEngineeredVariant fits a fixed article that arrives engineered. ENGINEERING_OPTION_GROUPS answers what a module can take, and PRE_ENGINEERED_MODULES covers the articles you cannot craft. Material shopping data lives on the blueprint-costs and experimental-effect-costs subpaths, so a consumer can price one recipe without the mechanics — and the facade carries them, since BuildMetrics.buildCost prices a whole build. A blueprint cost carries both halves of what a climb takes: the materials and the Merc Coin 25 of the recipes charge beside them.
The registries use two distinct Frontier identity spaces. symbol identifies an
item — a hull, module, material, micro-resource or commodity — and is what item and
journal Item lookups accept. Engineering catalogues carry ids of their own:
blueprintSymbol names a recipe, a fixed variant's identity included, and
experimentalEffectSymbol names an effect. Those two are what the journal writes in
Engineering.BlueprintName and Engineering.ExperimentalEffect respectively; the few
colliding blueprint aliases are resolved for their module by
resolveBlueprintForModule.
Pre-engineered variants are found from the base module's symbol with
getPreEngineeredVariants.
Entity catalogues (SHIPS, the module catalogues, PRE_ENGINEERED_MODULES)
are readonly arrays whose values carry their own identity; engineering catalogues
(BLUEPRINTS, EXPERIMENTAL_EFFECTS, ENGINEERING_OPTION_GROUPS)
are keyed by that identity instead — enumerate them with Object.values(). Prefer the
case-insensitive lookups (getBlueprint, getExperimentalEffect,
getBlueprintCosts,
getExperimentalEffectCost)
to indexing a map with caller- or journal-supplied text.
Identity primarily from EDCD FDevIDs (shipyard.csv, outfitting.csv), with
supplemental module identities documented in the source record; stats and slot
layouts from EDCD/coriolis-data and EDSY. See data/ships/SOURCES.md.
The whole-build layer. ShipLoadout reads a capture and answers the questions an outfitting screen asks. This is the one to start from, and the one that pulls in every catalogue.
import { BuildMetrics } from '@elite-dangerous-almanac/core/ships/build-metrics';
import { ShipLoadout } from '@elite-dangerous-almanac/core/ships/ship-loadout';
import type { LoadoutEvent } from '@elite-dangerous-almanac/core/ships/slef';
declare const event: LoadoutEvent;
// Figures below are one build's — a Krait Phantom explorer.
const metrics = BuildMetrics.of(ShipLoadout.fromLoadout(event));
metrics.maxJumpRange(); // -> 60.5478 (ly)
metrics.powerBudget().withinBudget; // -> true
metrics.shieldMetricsResult().value?.strength; // -> 743.12 (MJ)
metrics.weaponMetrics().total.damagePerSecond; // -> 34The lookup layer. One small hull catalogue, and the outfitting modules split by Frontier's four categories. Lookups ignore case and surrounding whitespace.
import { getShipBySymbol } from '@elite-dangerous-almanac/core/ships/ships';
import { getModuleBySymbol } from '@elite-dangerous-almanac/core/ships/modules';
import { CORE_MODULES } from '@elite-dangerous-almanac/core/ships/modules-core';
getShipBySymbol('empire_trader')?.name; // -> 'Imperial Clipper'
// Pass a category to bound what you bundle; omit it to search every module.
getModuleBySymbol('Int_Hyperdrive_Size6_Class5', CORE_MODULES)?.name;
// -> 'Frame Shift Drive'The data-free layer. Each calculation is its own module over plain constants, so
it costs nothing but the function — no catalogue, no build. ./power, ./shields,
./shield-capacitor, ./armour, ./weapons, ./weapons-capacitor, ./mobility,
./mobility-capacitor, ./ammunition and ./resistances are the same shape.
import { singleJumpRange } from '@elite-dangerous-almanac/core/ships/jump-range';
singleJumpRange(1237.3, 6.8, {
optMass: 7528.04,
maxFuel: 6.8,
fuelMul: 0.011,
fuelPower: 2.5025,
jumpBoost: 10.5, // Guardian FSD Booster
}); // -> 89.4147 (ly)- AmmunitionCapacity
- AmmunitionStats
- ApplyBlueprintOptions
- ArmourInput
- ArmourMetrics
- AvailableBlueprint
- Blueprint
- BlueprintFeature
- BlueprintGrade
- BlueprintModuleEngineering
- BuildCost
- BuildCredits
- BuildMass
- BuildSlotBase
- BuildWeaponMetrics
- BulkheadParams
- CalculationIssue
- CellBankInput
- CellBankMetrics
- CellBankSummary
- CoreBuildSlot
- CoreSlots
- DamageComponents
- DamageDistribution
- DamageResistanceParams
- DamageSplit
- DamageTypeValues
- DistributorCapacitorMetrics
- DistributorInput
- DistributorMetrics
- DistributorOptions
- DistributorPips
- EngineeringMaterial
- EngineeringModifier
- EngineeringNormalizationUnchanged
- EngineeringNormalizationUnsupported
- EngineeringNormalized
- EngineeringOptionGroup
- ExperimentalContribution
- ExperimentalEffect
- ExperimentalEffectUnchanged
- ExperimentalEffectUnsupported
- ExperimentalEffectUpdated
- FittedModule
- FittedWeaponMetrics
- FrameShiftDriveJumpStats
- FrameShiftDriveParams
- FuelCapacity
- GunsightPoint
- HardpointBuildSlot
- HardpointSlotSpec
- HeatInput
- HeatMetrics
- HeatState
- HeatWeapon
- HullReinforcementParams
- JumpOptions
- JumpRangeSummary
- LoadoutCalculationModule
- LoadoutEvent
- LoadoutExportOptions
- LoadoutIssue
- LoadoutMass
- LoadoutModule
- LoadoutValidation
- LoadoutValidationInput
- MassCurveStats
- MobilityCapacitorInput
- MobilityCapacitorMetrics
- MobilityCapacitorOptions
- MobilityInput
- MobilityMetrics
- ModuleLimitEntry
- ModuleLimitIncrease
- ModuleLimitUsage
- ModuleReinforcementParams
- OptionalBuildSlot
- OptionalSlotSpec
- OutfittingModule
- OutfittingModuleIdentity
- OutfittingModuleStats
- ParsedSlot
- PowerBand
- PowerBudget
- PowerConsumer
- PowerConsumerResult
- PowerDistributorStats
- PowerGenerationStats
- PreEngineeredModifier
- PreEngineeredVariant
- ProjectileRangeBoundaries
- ShieldBoosterParams
- ShieldCapacitorInput
- ShieldCapacitorMetrics
- ShieldCapacitorOptions
- ShieldGeneratorParams
- ShieldInput
- ShieldMetrics
- ShieldRecovery
- ShieldRecoveryInput
- ShieldRecoveryOptions
- ShieldRegenerationStats
- Ship
- ShipSlots
- SimpleBuildSlot
- SlefDiagnostic
- SlefEntry
- SlefExportOptions
- SlefHeader
- SlefInspection
- SlefStringifyOptions
- SourceModuleValue
- SourcePurchaseRecord
- StandardLoadInputs
- ThrusterCurveParams
- ThrusterParams
- TotalRangeDetails
- ValidationModule
- WeaponDamageStats
- WeaponMetrics
- WeaponsCapacitorInput
- WeaponsCapacitorMetrics
- WeaponsOptions
- WeaponStats
- WeaponTotals
- BlueprintGrades
- BuildSlot
- CalculationIssueReason
- CalculationResult
- CoreSlotType
- DamageResistances
- DamageType
- EngineeringGroupId
- EngineeringNormalizationCode
- EngineeringNormalizationResult
- ExperimentalEffectMutationCode
- ExperimentalEffectMutationResult
- FixedMountRepairResult
- GunsightOffset
- HardpointRestriction
- ImmovableReason
- LoadoutEditErrorCode
- LoadoutImportOutcome
- LoadoutIssueCode
- LoadoutIssueParam
- LoadoutIssueParams
- LoadoutSlot
- ModifierMethod
- ModuleCategory
- ModuleEngineering
- ModuleExclusionGroup
- ModuleFitConstraint
- ModuleGuidance
- ModuleLimitGroup
- ModuleMount
- ModuleRating
- ModuleSlot
- OptionalRestriction
- OutfittingFamilyId
- PreEngineeredAcquisition
- ShipGunsight
- ShipGunsightCatalogue
- Slef
- SlefConstraint
- SlefDiagnosticCode
- SlotKind
- SlotRestriction
- StandardLoad
- ThrusterLoad
- BLUEPRINTS
- ENGINEERING_OPTION_GROUPS
- EXPERIMENTAL_EFFECTS
- OUTFITTING_FAMILIES
- OVERHEAT_HEAT_LEVEL
- PRE_ENGINEERED_MODULES
- SHIP_GUNSIGHTS
- SHIP_MODULE_LIMITS
- SHIPS
- SLOT_RESTRICTION_LABELS
- ammunitionCapacity
- armourMetrics
- armourPiercingFactor
- calculateCargoCapacity
- calculateFuelCapacity
- calculateModuleLimits
- calculatePassengerCapacity
- calculateUnladenMass
- cellBankSummary
- combinedRateOfFire
- computeModifiers
- damageFalloff
- damagePerSecond
- distributorMetrics
- effectiveHitPoints
- effectiveWeaponThermalLoad
- energyPerSecond
- enumerateSlots
- equilibriumHeatLevel
- frameShiftDriveMassFactor
- fuelPerJump
- getBlueprint
- getBlueprintGrade
- getBlueprintsForModule
- getBulkheadsForShip
- getEngineeringGroup
- getExperimentalEffect
- getExperimentalsForBlueprint
- getExperimentalsForModule
- getLoadoutModifier
- getModuleBySymbol
- getModulesByName
- getPreEngineeredJournalModifiers
- getPreEngineeredModifiers
- getPreEngineeredStats
- getPreEngineeredVariants
- getShipByName
- getShipBySymbol
- getShipGunsight
- getShipSlots
- getSourceModuleValue
- hasFrameShiftDriveJumpStats
- hasMassCurveStats
- hasPowerDistributorStats
- hasPowerGenerationStats
- hasShieldRegenerationStats
- hasWeaponDamageStats
- heatLevelAtTime
- heatMetrics
- heatPerSecond
- identifyPreEngineeredVariant
- inspectSlef
- isPreEngineered
- mapDamageTypes
- mobilityCapacitorMetrics
- mobilityMetrics
- parseSlef
- parseSlotName
- powerBudget
- projectGunsight
- resolveBlueprintForModule
- secondsToHeatLevel
- shieldCapacitorMetrics
- shieldMassCurveMultiplier
- shieldMetrics
- shieldRecovery
- shieldStrength
- singleJumpRange
- sourcePurchaseFromLoadout
- splitDamage
- stackArmourResistance
- stackShieldResistance
- stringifySlef
- sumMaterials
- sumSourceModuleValues
- sumWeaponMetrics
- sustainedDamagePerSecond
- sustainedFireFactor
- systemsResistance
- thrusterMassCurveMultiplier
- toSlef
- totalRange
- unresolvedModifiers
- validateLoadout
- weaponMetrics
- weaponsCapacitorMetrics