@elite-dangerous-almanac/core 0.2.10 → 0.2.12

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 (93) hide show
  1. package/PROVENANCE/astro/SOURCES.md +18 -0
  2. package/PROVENANCE/commodities/SOURCES.md +2 -1
  3. package/PROVENANCE/i18n/SOURCES.md +66 -2
  4. package/PROVENANCE/ships/SOURCES.md +58 -51
  5. package/README.md +7 -5
  6. package/THIRD_PARTY_NOTICES.md +2 -1
  7. package/dist/astro/codex-region-lookup.js +1 -1
  8. package/dist/astro/codex-region.d.ts +5 -1
  9. package/dist/astro/codex-region.js +1 -1
  10. package/dist/astro/index.js +1 -1
  11. package/dist/chunk-25EECUZ2.js +1 -0
  12. package/dist/chunk-25EECUZ2.js.map +1 -0
  13. package/dist/chunk-36I5QLTL.js +1 -0
  14. package/dist/chunk-36I5QLTL.js.map +1 -0
  15. package/dist/{chunk-2TY42PTF.js → chunk-6MQOPQAA.js} +1 -1
  16. package/dist/{chunk-X3MXPE7G.js → chunk-7UF4XRIR.js} +1 -1
  17. package/dist/{chunk-K5JK3XQB.js → chunk-ARG6ESYB.js} +1 -1
  18. package/dist/{chunk-K5JK3XQB.js.map → chunk-ARG6ESYB.js.map} +1 -1
  19. package/dist/{chunk-ADLVPKUV.js → chunk-ATD32GCX.js} +1 -1
  20. package/dist/{chunk-ADLVPKUV.js.map → chunk-ATD32GCX.js.map} +1 -1
  21. package/dist/chunk-BUQLUEQS.js +1 -0
  22. package/dist/chunk-BUQLUEQS.js.map +1 -0
  23. package/dist/{chunk-SFEQXUIA.js → chunk-CCJPWDMA.js} +1 -1
  24. package/dist/{chunk-5VWACBTN.js → chunk-DBJKLXLS.js} +1 -1
  25. package/dist/{chunk-5VWACBTN.js.map → chunk-DBJKLXLS.js.map} +1 -1
  26. package/dist/{chunk-G7WARJ3X.js → chunk-DEY44PHF.js} +1 -1
  27. package/dist/chunk-DEY44PHF.js.map +1 -0
  28. package/dist/chunk-EXHZ4CFB.js +1 -0
  29. package/dist/{chunk-AUBV6S7V.js.map → chunk-EXHZ4CFB.js.map} +1 -1
  30. package/dist/chunk-FRG7MKSJ.js +1 -0
  31. package/dist/{chunk-T7IQHFQ2.js.map → chunk-FRG7MKSJ.js.map} +1 -1
  32. package/dist/chunk-KLC5XT6F.js +1 -0
  33. package/dist/chunk-KLC5XT6F.js.map +1 -0
  34. package/dist/chunk-KR664YI3.js +1 -0
  35. package/dist/{chunk-UI5RROGI.js.map → chunk-KR664YI3.js.map} +1 -1
  36. package/dist/{chunk-Q647OXON.js → chunk-LOWKWUNS.js} +1 -1
  37. package/dist/{chunk-Q647OXON.js.map → chunk-LOWKWUNS.js.map} +1 -1
  38. package/dist/chunk-O4NIJDL4.js +1 -0
  39. package/dist/chunk-O4NIJDL4.js.map +1 -0
  40. package/dist/{chunk-C3YZ5KTA.js → chunk-P6HCQ2YE.js} +1 -1
  41. package/dist/chunk-P6HCQ2YE.js.map +1 -0
  42. package/dist/chunk-WDAYRHXR.js +1 -0
  43. package/dist/{chunk-AYAKU4YA.js.map → chunk-WDAYRHXR.js.map} +1 -1
  44. package/dist/commodities/commodities-all.js +1 -1
  45. package/dist/commodities/commodities-standard.d.ts +1 -1
  46. package/dist/commodities/commodities-standard.js +1 -1
  47. package/dist/commodities/commodities.js +1 -1
  48. package/dist/commodities/index.js +1 -1
  49. package/dist/equipment/index.d.ts +7 -0
  50. package/dist/equipment/index.js +1 -1
  51. package/dist/equipment/suit-loadout.d.ts +284 -0
  52. package/dist/equipment/suit-loadout.js +1 -0
  53. package/dist/equipment/suit-loadout.js.map +1 -0
  54. package/dist/i18n/blueprints.js +1 -1
  55. package/dist/i18n/codex-regions.d.ts +33 -0
  56. package/dist/i18n/codex-regions.js +1 -0
  57. package/dist/i18n/codex-regions.js.map +1 -0
  58. package/dist/i18n/index.d.ts +10 -8
  59. package/dist/i18n/index.js +1 -1
  60. package/dist/i18n/pre-engineered.d.ts +4 -0
  61. package/dist/i18n/pre-engineered.js +1 -1
  62. package/dist/materials/index.js +1 -1
  63. package/dist/materials/micro-resources-all.js +1 -1
  64. package/dist/materials/micro-resources.js +1 -1
  65. package/dist/ships/blueprint-costs.js +1 -1
  66. package/dist/ships/blueprints.d.ts +1 -2
  67. package/dist/ships/blueprints.js +1 -1
  68. package/dist/ships/build-metrics.js +1 -1
  69. package/dist/ships/index.js +1 -1
  70. package/dist/ships/pre-engineered-stats.d.ts +5 -9
  71. package/dist/ships/pre-engineered-stats.js +1 -1
  72. package/dist/ships/pre-engineered.d.ts +12 -6
  73. package/dist/ships/pre-engineered.js +1 -1
  74. package/dist/ships/shields.d.ts +4 -1
  75. package/dist/ships/shields.js +1 -1
  76. package/dist/ships/ship-loadout.d.ts +21 -19
  77. package/dist/ships/ship-loadout.js +1 -1
  78. package/package.json +14 -5
  79. package/dist/chunk-AUBV6S7V.js +0 -1
  80. package/dist/chunk-AYAKU4YA.js +0 -1
  81. package/dist/chunk-C3YZ5KTA.js.map +0 -1
  82. package/dist/chunk-G7WARJ3X.js.map +0 -1
  83. package/dist/chunk-GVNTKCVF.js +0 -1
  84. package/dist/chunk-GVNTKCVF.js.map +0 -1
  85. package/dist/chunk-HIJR7DOC.js +0 -1
  86. package/dist/chunk-HIJR7DOC.js.map +0 -1
  87. package/dist/chunk-T7IQHFQ2.js +0 -1
  88. package/dist/chunk-UI5RROGI.js +0 -1
  89. package/dist/chunk-ZBUTGTZ3.js +0 -1
  90. package/dist/chunk-ZBUTGTZ3.js.map +0 -1
  91. /package/dist/{chunk-2TY42PTF.js.map → chunk-6MQOPQAA.js.map} +0 -0
  92. /package/dist/{chunk-X3MXPE7G.js.map → chunk-7UF4XRIR.js.map} +0 -0
  93. /package/dist/{chunk-SFEQXUIA.js.map → chunk-CCJPWDMA.js.map} +0 -0
@@ -0,0 +1,284 @@
1
+ import { PersonalModifier } from './engineering.js';
2
+ import { PersonalModification } from './modifications.js';
3
+ import { d as PersonalMountKey, e as PersonalWeapon, E as EquipmentGrade, i as PersonalWeaponMetrics, l as Suit, m as SuitGrade } from '../suits-B4sQMLFe.js';
4
+
5
+ /**
6
+ * Import a journal suit loadout: the suit a Commander wears, its grade, the permanent
7
+ * modifications on it, and the weapon at each mount with the modifications on that.
8
+ *
9
+ * The game writes the same payload under three event names — `SuitLoadout` when a
10
+ * session starts or a loadout changes, `SwitchSuitLoadout` when the Commander changes
11
+ * suit, and `CreateSuitLoadout` when they save a new one — so {@link parseSuitLoadout}
12
+ * takes any of the three.
13
+ *
14
+ * This is the personal-equipment counterpart of `ships/ship-loadout`, at the scale the
15
+ * domain needs: a suit has no editor, so an import is one frozen record rather than a
16
+ * mutable build. It carries the suit and weapon catalogues and the modification recipes,
17
+ * which is every catalogue an event names.
18
+ *
19
+ * @packageDocumentation
20
+ */
21
+
22
+ /** One weapon entry in a journal suit-loadout event. */
23
+ interface SuitLoadoutModuleEvent {
24
+ /** The mount it occupies, e.g. `"PrimaryWeapon1"`. */
25
+ readonly SlotName: string;
26
+ /** The owned weapon instance's id. */
27
+ readonly SuitModuleID?: number;
28
+ /** The weapon's Frontier symbol, e.g. `"wpn_m_launcher_rocket_sauto"`. */
29
+ readonly ModuleName: string;
30
+ /** The weapon's display name, when the event states one. */
31
+ readonly ModuleName_Localised?: string;
32
+ /** The weapon's Pioneer Supplies grade, 1–5. */
33
+ readonly Class: number;
34
+ /** Each permanent modification on the weapon, in the game's own spelling. */
35
+ readonly WeaponMods?: readonly string[];
36
+ }
37
+ /**
38
+ * A journal `SuitLoadout`, `SwitchSuitLoadout` or `CreateSuitLoadout` event.
39
+ *
40
+ * @remarks
41
+ * `event` and `timestamp` name the journal line rather than the loadout, and the
42
+ * `_Localised` fields are the game's own display text for a locale. {@link
43
+ * parseSuitLoadout} drops all four; `i18n/suits`, `i18n/personal-weapons` and
44
+ * `i18n/personal-modifications` answer for display text in every stored locale.
45
+ */
46
+ interface SuitLoadoutEvent {
47
+ /** The journal event name. Accepted on input, and not part of the loadout. */
48
+ readonly event?: string;
49
+ /** When the game wrote the line. */
50
+ readonly timestamp?: string;
51
+ /** The owned suit instance's id. */
52
+ readonly SuitID?: number;
53
+ /** The suit's grade-specific Frontier symbol, e.g. `"tacticalsuit_class5"`. */
54
+ readonly SuitName: string;
55
+ /** The suit's display name, when the event states one. */
56
+ readonly SuitName_Localised?: string;
57
+ /** Each permanent modification on the suit, in the game's own spelling. */
58
+ readonly SuitMods?: readonly string[];
59
+ /** The saved loadout's id. */
60
+ readonly LoadoutID?: number;
61
+ /** The player-given loadout name, e.g. `"Double Trouble"`. */
62
+ readonly LoadoutName?: string;
63
+ /** The weapon at each occupied mount. */
64
+ readonly Modules?: readonly SuitLoadoutModuleEvent[];
65
+ }
66
+ /** One modification an event states, resolved against the recipe catalogue. */
67
+ interface FittedPersonalModification {
68
+ /** The symbol the event wrote, e.g. `"weapon_range"`. */
69
+ readonly journalSymbol: string;
70
+ /**
71
+ * The recipe key, e.g. `"weapon_range_kinetic"`, ready to index
72
+ * `PERSONAL_MODIFICATIONS` and `PERSONAL_MODIFICATION_COSTS`.
73
+ *
74
+ * @remarks
75
+ * It is {@link journalSymbol} trimmed and lower-cased, which is how both catalogues
76
+ * key a recipe. Greater Range, Headshot Damage and Improved Hip Fire Accuracy carry
77
+ * a Kinetic, a Laser and a Plasma recipe each, and the journal writes one symbol for
78
+ * all three, so there the key also gains the suffix the weapon at the mount settles;
79
+ * `equipment/modification-journal` is that lookup.
80
+ */
81
+ readonly symbol: string;
82
+ /** The recipe itself. */
83
+ readonly modification: PersonalModification;
84
+ }
85
+ /** One weapon an event puts on a suit mount, resolved against the weapon catalogue. */
86
+ interface FittedPersonalWeapon {
87
+ /** The mount, in the catalogue's spelling, whatever spelling the event used. */
88
+ readonly mount: PersonalMountKey;
89
+ /** The owned weapon instance's id, or `null` when the event states none. */
90
+ readonly moduleId: number | null;
91
+ /** The weapon. */
92
+ readonly weapon: PersonalWeapon;
93
+ /** The weapon's grade, from the event's `Class`. */
94
+ readonly grade: EquipmentGrade;
95
+ /**
96
+ * Each modification the catalogues resolved, in the order the event lists them.
97
+ * Anything the event stated and this leaves out is in
98
+ * {@link SuitLoadout.importOutcomes}.
99
+ */
100
+ readonly modifications: readonly FittedPersonalModification[];
101
+ /**
102
+ * Every modifier that acts on this weapon, ready for `applyPersonalModifiers`.
103
+ *
104
+ * @remarks
105
+ * This includes the suit's own modifiers that name a stat the weapon carries: Extra
106
+ * Ammo Capacity is a suit modification and multiplies a *weapon's* `reserveAmmo`, so
107
+ * one list answers for the weapon and a consumer does not have to know which
108
+ * equipment the recipe sits on. That is also why nothing is ever concatenated onto
109
+ * it: adding {@link SuitLoadout.modifiers} multiplies those factors in a second time.
110
+ */
111
+ readonly modifiers: readonly PersonalModifier[];
112
+ /** Whether Reload Speed is fitted, which selects `weapon.reloadTime.upgraded`. */
113
+ readonly reloadSpeed: boolean;
114
+ /** Whether Scope is fitted, which selects `weapon.scopeMagnification.upgraded`. */
115
+ readonly scope: boolean;
116
+ /** What the weapon does per second at this grade, with {@link modifiers} folded in. */
117
+ readonly metrics: PersonalWeaponMetrics;
118
+ }
119
+ /**
120
+ * Something an event states that the import could not use.
121
+ *
122
+ * @remarks
123
+ * An event is taken as far as the catalogues allow. Every outcome reports one entry the
124
+ * import left out — a weapon it does not fit, or a modification it does not apply — so
125
+ * the loadout holds what the catalogues answer for. The suit is the one identity a miss
126
+ * refuses outright, because nothing else in the event stands without it; a malformed
127
+ * event is refused too, and {@link parseSuitLoadout} states what it checks.
128
+ */
129
+ interface SuitLoadoutImportOutcome {
130
+ /**
131
+ * Why the entry is left out:
132
+ *
133
+ * - `unknownWeapon` — no catalogue weapon answers to `ModuleName`.
134
+ * - `unknownMount` — the suit carries no mount by that `SlotName`.
135
+ * - `refusedMount` — the weapon resolves, and the mount does not take its kind: a
136
+ * primary weapon in the secondary mount, or the reverse.
137
+ * - `unknownGrade` — `Class` is not an integer from 1 through 5, so the weapon has
138
+ * no stats to report.
139
+ * - `unknownModification` — no recipe answers to the symbol.
140
+ * - `refusedModification` — the recipe resolves, and it belongs to the other
141
+ * equipment: a suit recipe under `WeaponMods`, or a weapon recipe under `SuitMods`.
142
+ */
143
+ readonly action: 'unknownWeapon' | 'unknownMount' | 'refusedMount' | 'unknownGrade' | 'unknownModification' | 'refusedModification';
144
+ /**
145
+ * The mount the event named, in its own spelling, or `null` for a modification on
146
+ * the suit itself.
147
+ */
148
+ readonly mount: string | null;
149
+ /** The weapon or recipe symbol the event stated. */
150
+ readonly sourceSymbol: string;
151
+ }
152
+ /**
153
+ * One imported suit loadout: the suit, its modifications, and the weapon at each mount.
154
+ *
155
+ * @remarks
156
+ * Every field is a frozen fact the event stated or the catalogues resolved. Read a mount
157
+ * with `loadout.weapons.find((fitted) => fitted.mount === 'PrimaryWeapon1')`; an absent
158
+ * one holds no weapon, which is what the game writes for an empty mount.
159
+ */
160
+ interface SuitLoadout {
161
+ /** The suit model. */
162
+ readonly suit: Suit;
163
+ /** The suit's grade, from its Frontier symbol. */
164
+ readonly grade: EquipmentGrade;
165
+ /** The suit's stats at {@link grade}. */
166
+ readonly stats: SuitGrade;
167
+ /** The owned suit instance's id, or `null` when the event states none. */
168
+ readonly suitId: number | null;
169
+ /** The saved loadout's id, or `null` when the event states none. */
170
+ readonly loadoutId: number | null;
171
+ /** The player-given loadout name, or `null` when the event states none. */
172
+ readonly name: string | null;
173
+ /**
174
+ * Each modification the catalogues resolved, in the order the event lists them.
175
+ * Anything the event stated and this leaves out is in {@link importOutcomes}.
176
+ */
177
+ readonly modifications: readonly FittedPersonalModification[];
178
+ /**
179
+ * Every modifier the suit's modifications carry, ready for `applyPersonalModifiers`.
180
+ *
181
+ * @remarks
182
+ * A modifier here names a stat of whatever the recipe changes. Most name a suit
183
+ * stat; Extra Ammo Capacity names a weapon's `reserveAmmo` and Reduced Tool Battery
184
+ * Consumption names a tool's `toolEnergyDrain`. `applyPersonalModifiers` reads one
185
+ * stat at a time, so pass the base the stat belongs to and the rest are skipped.
186
+ *
187
+ * **Never concatenate this list with a weapon's own.**
188
+ * {@link FittedPersonalWeapon.modifiers} already carries the suit modifiers that act
189
+ * on that weapon, so a joined list multiplies them in twice: the reserve of a weapon
190
+ * behind Extra Ammo Capacity reads 1.5× from either list alone, and 2.25× from both.
191
+ * Use the weapon's list for a weapon stat, and this one for a suit or tool stat.
192
+ */
193
+ readonly modifiers: readonly PersonalModifier[];
194
+ /** The weapon at each occupied mount, in the order the event lists them. */
195
+ readonly weapons: readonly FittedPersonalWeapon[];
196
+ /**
197
+ * Everything the event stated that the import left out, as
198
+ * `ships/ship-loadout` reports its own import changes.
199
+ */
200
+ readonly importOutcomes: readonly SuitLoadoutImportOutcome[];
201
+ }
202
+ /**
203
+ * Import a journal `SuitLoadout`, `SwitchSuitLoadout` or `CreateSuitLoadout` event.
204
+ *
205
+ * @param event - The event object, as the game wrote it.
206
+ * @returns The frozen {@link SuitLoadout}.
207
+ * @remarks
208
+ * A mount name is matched case-insensitively, with surrounding whitespace ignored, and
209
+ * the loadout reports the catalogue's own spelling — so `fitted.mount === 'PrimaryWeapon1'`
210
+ * holds whatever spelling the source used. Weapon and recipe symbols are matched the
211
+ * same way.
212
+ *
213
+ * The suit has to resolve: an unknown `SuitName` is a `TypeError`, because the grade,
214
+ * the mounts and every stat come from it. Everything else the catalogues cannot resolve
215
+ * is left out of the loadout and reported by {@link SuitLoadout.importOutcomes}, so one
216
+ * unknown weapon does not cost a caller the rest of the event.
217
+ *
218
+ * `SuitID`, `SuitModuleID`, `LoadoutID` and `LoadoutName` are kept: they name the items
219
+ * the Commander owns and the loadout slot they sit in, which is what a later
220
+ * `LoadoutEquipModule` event joins to. `event`, `timestamp` and the `_Localised` display
221
+ * text are dropped.
222
+ * @throws {TypeError} If `event` is not shaped like one. `event` must be an object whose
223
+ * `SuitName` is a string naming a catalogued suit; `Modules`, `SuitMods` and `WeaponMods`
224
+ * must be arrays whenever they are present; each module must be an object with a string
225
+ * `SlotName` and `ModuleName`, no two claiming the same mount; and each modification must
226
+ * be a string. Every other field is trusted.
227
+ * @example
228
+ * ```ts
229
+ * import { parseSuitLoadout } from '@elite-dangerous-almanac/core/equipment/suit-loadout';
230
+ *
231
+ * const loadout = parseSuitLoadout({
232
+ * event: 'SwitchSuitLoadout',
233
+ * SuitID: 1700482757598197,
234
+ * SuitName: 'tacticalsuit_class5',
235
+ * SuitMods: ['suit_nightvision', 'suit_increasedammoreserves'],
236
+ * LoadoutID: 4293000007,
237
+ * LoadoutName: 'Double Trouble',
238
+ * Modules: [
239
+ * {
240
+ * SlotName: 'PrimaryWeapon1',
241
+ * SuitModuleID: 1701103603778031,
242
+ * ModuleName: 'wpn_m_launcher_rocket_sauto',
243
+ * Class: 5,
244
+ * WeaponMods: ['weapon_clipsize'],
245
+ * },
246
+ * ],
247
+ * });
248
+ *
249
+ * loadout.suit.name; // -> 'Dominator Suit'
250
+ * loadout.grade; // -> 5
251
+ * loadout.name; // -> 'Double Trouble'
252
+ * loadout.weapons[0]?.weapon.name; // -> 'Karma L-6'
253
+ * loadout.weapons[0]?.metrics.damagePerSecond; // -> 119.2
254
+ * ```
255
+ * @example
256
+ * A stat the game shows on foot is the catalogue's base with the fitted modifiers folded
257
+ * onto it. The suit's Extra Ammo Capacity reaches the weapon that carries the reserve.
258
+ *
259
+ * ```ts
260
+ * import { applyPersonalModifiers } from '@elite-dangerous-almanac/core/equipment/engineering';
261
+ * import { parseSuitLoadout } from '@elite-dangerous-almanac/core/equipment/suit-loadout';
262
+ *
263
+ * const loadout = parseSuitLoadout({
264
+ * SuitName: 'tacticalsuit_class5',
265
+ * SuitMods: ['suit_increasedshieldregen', 'suit_increasedammoreserves'],
266
+ * Modules: [
267
+ * {
268
+ * SlotName: 'PrimaryWeapon1',
269
+ * ModuleName: 'wpn_m_launcher_rocket_sauto',
270
+ * Class: 5,
271
+ * WeaponMods: [],
272
+ * },
273
+ * ],
274
+ * });
275
+ *
276
+ * const fitted = loadout.weapons[0]!;
277
+ * applyPersonalModifiers('shieldRegeneration', loadout.stats.shieldRegeneration, loadout.modifiers);
278
+ * // -> 3.1
279
+ * applyPersonalModifiers('reserveAmmo', fitted.weapon.reserveAmmo, fitted.modifiers); // -> 12
280
+ * ```
281
+ */
282
+ declare function parseSuitLoadout(event: SuitLoadoutEvent): SuitLoadout;
283
+
284
+ export { type FittedPersonalModification, type FittedPersonalWeapon, type SuitLoadout, type SuitLoadoutEvent, type SuitLoadoutImportOutcome, type SuitLoadoutModuleEvent, parseSuitLoadout };
@@ -0,0 +1 @@
1
+ export{parseSuitLoadout}from"../chunk-36I5QLTL.js"; //# sourceMappingURL=suit-loadout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"O"}
@@ -1 +1 @@
1
- export{getBlueprintName}from"../chunk-UI5RROGI.js"; //# sourceMappingURL=blueprints.js.map
1
+ export{getBlueprintName}from"../chunk-KR664YI3.js"; //# sourceMappingURL=blueprints.js.map
@@ -0,0 +1,33 @@
1
+ /** Localized galactic codex region names, isolated from the region footprints. */
2
+ /**
3
+ * Look up a galactic codex region's source-backed display name for a locale.
4
+ *
5
+ * @param id - Region id, 1–42, as `CodexRegion.id` carries it. Id `0` means
6
+ * "outside the mapped region grid" and has no name.
7
+ * @param locale - A BCP 47 language or regional tag, such as `"de"` or `"de-DE"`; see
8
+ * {@link GameLocale} for how a tag is matched.
9
+ * @returns The localized region name; the canonical `CodexRegion.name` for any English
10
+ * tag; or `null` when the id is not 1–42 or the locale is not one of the six this
11
+ * catalogue stores.
12
+ * @remarks
13
+ * The catalogue is keyed by region id rather than by English name, because the id is
14
+ * the region's stable identity while the name is the value being translated.
15
+ *
16
+ * All six stored locales are complete, so a supported locale always answers. The game
17
+ * leaves many regions untranslated in some languages, and spells Izanami, Temple, Mare
18
+ * Somnia, Xibalba and Tenebrae alike in all six. The catalogue stores those source values
19
+ * verbatim rather than treating them as a missing translation.
20
+ * @throws {TypeError} If `locale` is not a string. A nullish or out-of-range `id` is a
21
+ * lookup miss and returns `null`.
22
+ * @example
23
+ * ```ts
24
+ * import { getCodexRegionName } from '@elite-dangerous-almanac/core/i18n/codex-regions';
25
+ *
26
+ * getCodexRegionName(1, 'de-DE'); // -> 'Galaktisches Zentrum'
27
+ * getCodexRegionName(5, 'fr'); // -> 'Bras de la Règle'
28
+ * getCodexRegionName(5, 'it'); // -> null
29
+ * ```
30
+ */
31
+ declare function getCodexRegionName(id: number, locale: string): string | null;
32
+
33
+ export { getCodexRegionName };
@@ -0,0 +1 @@
1
+ export{getCodexRegionName}from"../chunk-O4NIJDL4.js"; //# sourceMappingURL=codex-regions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"O"}
@@ -1,13 +1,13 @@
1
1
  /**
2
2
  * Sparse, source-backed localized display names and descriptions for Elite Dangerous
3
- * outfitting, personal-equipment, engineering, material and market-commodity
4
- * catalogues.
3
+ * outfitting, personal-equipment, engineering, material, market-commodity and galactic
4
+ * codex-region catalogues.
5
5
  *
6
6
  * Each lookup takes the identifier its owning catalogue is keyed by — a Frontier symbol,
7
- * or the library id where the game publishes none, as for a suit tool and a BCP 47
8
- * locale. English is complete: for a name catalogue it is exactly the owning record's
9
- * `name`, and for a description catalogue it is the game's own display prose, which no
10
- * catalogue otherwise publishes.
7
+ * the library id where the game publishes none, as for a suit tool, or the region id for
8
+ * a galactic codex region — and a BCP 47 locale. English is complete: for a name
9
+ * catalogue it is exactly the owning record's `name`, and for a description catalogue it
10
+ * is the game's own display prose, which no catalogue otherwise publishes.
11
11
  * Other locales are intentionally sparse: the function returns `null` when its pinned
12
12
  * sources carry no translation, leaving the application in control of fallback policy.
13
13
  * A source-backed localized spelling can be identical to English; the lookup returns
@@ -28,7 +28,8 @@
28
28
  * <!-- generated by scripts/i18n-coverage.mjs -->
29
29
  * | Lookup | Keys | en | de | es | fr | pt | ru |
30
30
  * | --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: |
31
- * | `getBlueprintName` | 107 | 100 | 100 | 100 | 100 | 100 | 100 |
31
+ * | `getBlueprintName` | 111 | 100 | 100 | 100 | 100 | 100 | 100 |
32
+ * | `getCodexRegionName` | 42 | 100 | 100 | 100 | 100 | 100 | 100 |
32
33
  * | `getCommodityName` | 412 | 100 | 100 | 100 | 100 | 100 | 100 |
33
34
  * | `getExperimentalEffectDescription` | 86 | 100 | 100 | 100 | 100 | 100 | 100 |
34
35
  * | `getExperimentalEffectName` | 86 | 100 | 100 | 100 | 100 | 100 | 100 |
@@ -41,7 +42,7 @@
41
42
  * | `getPersonalWeaponDescription` | 11 | 100 | 100 | 100 | 100 | 100 | 100 |
42
43
  * | `getSuitDescription` | 19 | 100 | 100 | 100 | 100 | 100 | 100 |
43
44
  * | `getSuitName` | 19 | 100 | 100 | 100 | 100 | 100 | 100 |
44
- * | `getPreEngineeredVariantName` | 76 | 100 | 92 | 89 | 89 | 100 | 100 |
45
+ * | `getPreEngineeredVariantName` | 79 | 100 | 92 | 89 | 89 | 100 | 100 |
45
46
  * | `getOutfittingFamilyName` | 77 | 100 | 75 | 75 | 75 | 75 | 75 |
46
47
  * <!-- end generated -->
47
48
  *
@@ -81,6 +82,7 @@ export { getBlueprintName } from './blueprints.js';
81
82
  export { getExperimentalEffectName } from './experimental-effects.js';
82
83
  export { getExperimentalEffectDescription } from './experimental-effect-descriptions.js';
83
84
  export { getCommodityName } from './commodities.js';
85
+ export { getCodexRegionName } from './codex-regions.js';
84
86
  export { getMaterialName } from './materials.js';
85
87
  export { getMicroResourceName } from './micro-resources.js';
86
88
  export { getPersonalMountName, getSuitDescription, getSuitName } from './suits.js';
@@ -1 +1 @@
1
- export{getPersonalModificationDescription,getPersonalModificationName}from"../chunk-SS7HVNP5.js";export{getPersonalToolName}from"../chunk-E2HDF6PJ.js";export{getPersonalWeaponDescription}from"../chunk-7C7NJWCF.js";export{getPreEngineeredVariantName}from"../chunk-T7IQHFQ2.js";export{getLoadoutSlotName,getSlotRestrictionLabel}from"../chunk-ZRG35JSH.js"; export{getPersonalMountName,getSuitDescription,getSuitName}from"../chunk-RA4YJBU5.js";export{getCalculationIssueMessage,getLoadoutEditErrorMessage,getLoadoutIssueMessage,getSlefDiagnosticMessage}from"../chunk-6G6TYW2D.js";export{getExperimentalEffectDescription}from"../chunk-RJ3ZLQRB.js";export{getExperimentalEffectName}from"../chunk-QPT2WJYN.js";export{getMaterialName}from"../chunk-UE22QU7A.js";export{getMicroResourceName}from"../chunk-WZIBBJHA.js";export{getOutfittingFamilyName}from"../chunk-YBE5M27G.js";export{getModuleName}from"../chunk-URRPEUIK.js";export{getBlueprintName}from"../chunk-UI5RROGI.js";export{getCommodityName}from"../chunk-TRGHPX2O.js"; //# sourceMappingURL=index.js.map
1
+ export{getOutfittingFamilyName}from"../chunk-YBE5M27G.js";export{getModuleName}from"../chunk-URRPEUIK.js";export{getPersonalModificationDescription,getPersonalModificationName}from"../chunk-SS7HVNP5.js";export{getPersonalToolName}from"../chunk-E2HDF6PJ.js";export{getPersonalWeaponDescription}from"../chunk-7C7NJWCF.js";export{getPreEngineeredVariantName}from"../chunk-FRG7MKSJ.js";export{getLoadoutSlotName,getSlotRestrictionLabel}from"../chunk-ZRG35JSH.js"; export{getPersonalMountName,getSuitDescription,getSuitName}from"../chunk-RA4YJBU5.js";export{getCodexRegionName}from"../chunk-O4NIJDL4.js";export{getCommodityName}from"../chunk-TRGHPX2O.js";export{getCalculationIssueMessage,getLoadoutEditErrorMessage,getLoadoutIssueMessage,getSlefDiagnosticMessage}from"../chunk-6G6TYW2D.js";export{getExperimentalEffectDescription}from"../chunk-RJ3ZLQRB.js";export{getExperimentalEffectName}from"../chunk-QPT2WJYN.js";export{getMaterialName}from"../chunk-UE22QU7A.js";export{getMicroResourceName}from"../chunk-WZIBBJHA.js";export{getBlueprintName}from"../chunk-KR664YI3.js"; //# sourceMappingURL=index.js.map
@@ -1,4 +1,8 @@
1
1
  import { PreEngineeredAcquisition } from '../ships/pre-engineered.js';
2
+ import '../ships/modules.js';
3
+ import '../ships/engineering-options.js';
4
+ import '../ships/module-families.js';
5
+ import '../ships/slots.js';
2
6
 
3
7
  /** Localized pre-engineered variant names, isolated from module and modifier statistics. */
4
8
 
@@ -1 +1 @@
1
- export{getPreEngineeredVariantName}from"../chunk-T7IQHFQ2.js"; //# sourceMappingURL=pre-engineered.js.map
1
+ export{getPreEngineeredVariantName}from"../chunk-FRG7MKSJ.js"; //# sourceMappingURL=pre-engineered.js.map
@@ -1 +1 @@
1
- export{getMicroResourceByName,getMicroResourceBySymbol,microResourcesInCategory}from"../chunk-X3MXPE7G.js";export{MaterialGrade,MaterialLine,getMaterialByElementSymbol,getMaterialByName,getMaterialBySymbol,materialsByGrade,materialsInCategory,materialsInLine}from"../chunk-ETREYN5U.js";export{ALL_MICRO_RESOURCES}from"../chunk-GVNTKCVF.js";export{ITEM_MICRO_RESOURCES}from"../chunk-WHWFKHV3.js";export{COMPONENT_MICRO_RESOURCES}from"../chunk-HTB52N6S.js";export{CONSUMABLE_MICRO_RESOURCES}from"../chunk-K7L7SMIR.js";export{DATA_MICRO_RESOURCES}from"../chunk-GVLDFJEY.js"; export{ALL_MATERIALS}from"../chunk-FP2TQJZP.js";export{ENCODED_MATERIALS}from"../chunk-A5TCT2AJ.js";export{MANUFACTURED_MATERIALS}from"../chunk-PF3HZ73R.js";export{RAW_MATERIALS}from"../chunk-GZLD7RTK.js"; //# sourceMappingURL=index.js.map
1
+ export{getMicroResourceByName,getMicroResourceBySymbol,microResourcesInCategory}from"../chunk-7UF4XRIR.js";export{MaterialGrade,MaterialLine,getMaterialByElementSymbol,getMaterialByName,getMaterialBySymbol,materialsByGrade,materialsInCategory,materialsInLine}from"../chunk-ETREYN5U.js";export{ALL_MATERIALS}from"../chunk-FP2TQJZP.js";export{ENCODED_MATERIALS}from"../chunk-A5TCT2AJ.js";export{MANUFACTURED_MATERIALS}from"../chunk-PF3HZ73R.js";export{RAW_MATERIALS}from"../chunk-GZLD7RTK.js"; export{ALL_MICRO_RESOURCES}from"../chunk-KLC5XT6F.js";export{CONSUMABLE_MICRO_RESOURCES}from"../chunk-K7L7SMIR.js";export{DATA_MICRO_RESOURCES}from"../chunk-GVLDFJEY.js";export{ITEM_MICRO_RESOURCES}from"../chunk-WHWFKHV3.js";export{COMPONENT_MICRO_RESOURCES}from"../chunk-HTB52N6S.js"; //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- export{ALL_MICRO_RESOURCES}from"../chunk-GVNTKCVF.js"; //# sourceMappingURL=micro-resources-all.js.map
1
+ export{ALL_MICRO_RESOURCES}from"../chunk-KLC5XT6F.js"; //# sourceMappingURL=micro-resources-all.js.map
@@ -1 +1 @@
1
- export{getMicroResourceByName,getMicroResourceBySymbol,microResourcesInCategory}from"../chunk-X3MXPE7G.js"; //# sourceMappingURL=micro-resources.js.map
1
+ export{getMicroResourceByName,getMicroResourceBySymbol,microResourcesInCategory}from"../chunk-7UF4XRIR.js"; //# sourceMappingURL=micro-resources.js.map
@@ -1 +1 @@
1
- export{BLUEPRINT_COSTS,BLUEPRINT_MERC_COIN_COSTS,getBlueprintCost,getBlueprintCosts,getBlueprintGradeCost}from"../chunk-K5JK3XQB.js"; //# sourceMappingURL=blueprint-costs.js.map
1
+ export{BLUEPRINT_COSTS,BLUEPRINT_MERC_COIN_COSTS,getBlueprintCost,getBlueprintCosts,getBlueprintGradeCost}from"../chunk-ARG6ESYB.js"; //# sourceMappingURL=blueprint-costs.js.map
@@ -30,10 +30,9 @@ import './slots.js';
30
30
  * full mechanics catalogue and resolves one against a module.
31
31
  *
32
32
  * Further keys are the **Operations** ids: recipes a module is *sold*
33
- * carrying (`ships/pre-engineered`) and the four Operations recipes a player rolls at an
33
+ * carrying (`ships/pre-engineered`) and the Operations recipes a player rolls at an
34
34
  * engineer (`ships/engineering-options`). No journal spelling has been observed for those
35
35
  * Operations ids — a gap in the evidence, not a claim that the game writes none.
36
- *
37
36
  * **Every recipe is keyed once.** Anti-Guardian Zone Resistance is
38
37
  * `GuardianModule_Sturdy`, the id the game writes on Guardian weapons as well as on
39
38
  * Guardian modules; the Inara registry's `recipe_guardianmodule_sturdy` and
@@ -1 +1 @@
1
- export{BLUEPRINTS,getBlueprint,getBlueprintGrade}from"../chunk-AYAKU4YA.js"; //# sourceMappingURL=blueprints.js.map
1
+ export{BLUEPRINTS,getBlueprint,getBlueprintGrade}from"../chunk-WDAYRHXR.js"; //# sourceMappingURL=blueprints.js.map
@@ -1 +1 @@
1
- export{BuildMetrics}from"../chunk-G7WARJ3X.js"; //# sourceMappingURL=build-metrics.js.map
1
+ export{BuildMetrics}from"../chunk-DEY44PHF.js"; //# sourceMappingURL=build-metrics.js.map
@@ -1 +1 @@
1
- export{LoadoutEditError,ShipLoadout}from"../chunk-HIJR7DOC.js";export{validateLoadout}from"../chunk-3GNYPM6J.js";export{SHIP_MODULE_LIMITS,calculateModuleLimits}from"../chunk-KPETDYQX.js";export{hasFrameShiftDriveJumpStats,hasMassCurveStats,hasPowerDistributorStats,hasPowerGenerationStats,hasShieldRegenerationStats,hasWeaponDamageStats}from"../chunk-JTQVWIGL.js";export{OUTFITTING_FAMILIES}from"../chunk-M6G3UDTX.js";export{SHIP_GUNSIGHTS,getShipGunsight,projectGunsight}from"../chunk-XSN53F7W.js";export{BuildMetrics}from"../chunk-G7WARJ3X.js";export{weaponsCapacitorMetrics}from"../chunk-M4FZRDAH.js";export{shieldCapacitorMetrics}from"../chunk-XQJERZUS.js";export{cellBankSummary,shieldRecovery}from"../chunk-JMAXSXXQ.js"; export{getLoadoutModifier,inspectSlef,parseSlef,stringifySlef,toSlef}from"../chunk-T4MKUKYS.js";export{getSourceModuleValue,sourcePurchaseFromLoadout,sumSourceModuleValues}from"../chunk-NIURLW2F.js";export{armourPiercingFactor,combinedRateOfFire,damageFalloff,damagePerSecond,energyPerSecond,heatPerSecond,splitDamage,sumWeaponMetrics,sustainedDamagePerSecond,sustainedFireFactor,weaponMetrics}from"../chunk-AAU7OM47.js";export{getPreEngineeredJournalModifiers,getPreEngineeredModifiers,getPreEngineeredStats,identifyPreEngineeredVariant,unresolvedModifiers}from"../chunk-C3YZ5KTA.js";export{PRE_ENGINEERED_MODULES,getPreEngineeredVariants,isPreEngineered}from"../chunk-AUBV6S7V.js";export{shieldMassCurveMultiplier,shieldMetrics,shieldStrength}from"../chunk-5VWACBTN.js";export{SHIPS,getShipByName,getShipBySymbol,getShipSlots}from"../chunk-C4FUV6GF.js";export{getBulkheadsForShip,getModuleBySymbol,getModulesByName}from"../chunk-OSMBAFRW.js"; export{powerBudget}from"../chunk-GGQMIQPC.js";export{frameShiftDriveMassFactor,fuelPerJump,singleJumpRange,totalRange}from"../chunk-VTMCSCXV.js";export{calculateCargoCapacity,calculateFuelCapacity,calculatePassengerCapacity,calculateUnladenMass}from"../chunk-C3LLPLLD.js"; export{mobilityCapacitorMetrics}from"../chunk-VEEBJFJ7.js";export{mobilityMetrics,thrusterMassCurveMultiplier}from"../chunk-A4QKXXZD.js"; export{distributorMetrics}from"../chunk-M2TCZKRT.js"; export{EXPERIMENTAL_EFFECTS,getExperimentalEffect}from"../chunk-77I24V6B.js";export{OVERHEAT_HEAT_LEVEL,effectiveWeaponThermalLoad,equilibriumHeatLevel,heatLevelAtTime,heatMetrics,secondsToHeatLevel}from"../chunk-6HA2YIKW.js";export{ammunitionCapacity}from"../chunk-AA3K5XUE.js";export{armourMetrics}from"../chunk-Q5ALV3DI.js";export{effectiveHitPoints,mapDamageTypes,stackArmourResistance,stackShieldResistance,systemsResistance}from"../chunk-F44QX47A.js"; export{computeModifiers,sumMaterials}from"../chunk-U73MBQ45.js"; export{resolveBlueprintForModule}from"../chunk-2J6NNI3Y.js";export{ENGINEERING_OPTION_GROUPS,getBlueprintsForModule,getEngineeringGroup,getExperimentalsForBlueprint,getExperimentalsForModule}from"../chunk-M4STXLXO.js";export{BLUEPRINTS,getBlueprint,getBlueprintGrade}from"../chunk-AYAKU4YA.js"; export{SLOT_RESTRICTION_LABELS,enumerateSlots,parseSlotName}from"../chunk-RAO35XDF.js"; //# sourceMappingURL=index.js.map
1
+ export{LoadoutEditError,ShipLoadout}from"../chunk-25EECUZ2.js";export{hasFrameShiftDriveJumpStats,hasMassCurveStats,hasPowerDistributorStats,hasPowerGenerationStats,hasShieldRegenerationStats,hasWeaponDamageStats}from"../chunk-JTQVWIGL.js";export{OUTFITTING_FAMILIES}from"../chunk-M6G3UDTX.js";export{SHIP_GUNSIGHTS,getShipGunsight,projectGunsight}from"../chunk-XSN53F7W.js";export{validateLoadout}from"../chunk-3GNYPM6J.js";export{SHIP_MODULE_LIMITS,calculateModuleLimits}from"../chunk-KPETDYQX.js";export{BuildMetrics}from"../chunk-DEY44PHF.js"; export{SHIPS,getShipByName,getShipBySymbol,getShipSlots}from"../chunk-C4FUV6GF.js";export{getLoadoutModifier,inspectSlef,parseSlef,stringifySlef,toSlef}from"../chunk-T4MKUKYS.js";export{getSourceModuleValue,sourcePurchaseFromLoadout,sumSourceModuleValues}from"../chunk-NIURLW2F.js";export{weaponsCapacitorMetrics}from"../chunk-M4FZRDAH.js";export{armourPiercingFactor,combinedRateOfFire,damageFalloff,damagePerSecond,energyPerSecond,heatPerSecond,splitDamage,sumWeaponMetrics,sustainedDamagePerSecond,sustainedFireFactor,weaponMetrics}from"../chunk-AAU7OM47.js";export{powerBudget}from"../chunk-GGQMIQPC.js";export{getPreEngineeredJournalModifiers,getPreEngineeredModifiers,getPreEngineeredStats,identifyPreEngineeredVariant,unresolvedModifiers}from"../chunk-P6HCQ2YE.js";export{getBulkheadsForShip,getModuleBySymbol,getModulesByName}from"../chunk-OSMBAFRW.js";export{PRE_ENGINEERED_MODULES,getPreEngineeredVariants,isPreEngineered}from"../chunk-EXHZ4CFB.js";export{shieldCapacitorMetrics}from"../chunk-XQJERZUS.js";export{cellBankSummary,shieldRecovery}from"../chunk-JMAXSXXQ.js";export{shieldMassCurveMultiplier,shieldMetrics,shieldStrength}from"../chunk-DBJKLXLS.js"; export{OVERHEAT_HEAT_LEVEL,effectiveWeaponThermalLoad,equilibriumHeatLevel,heatLevelAtTime,heatMetrics,secondsToHeatLevel}from"../chunk-6HA2YIKW.js";export{frameShiftDriveMassFactor,fuelPerJump,singleJumpRange,totalRange}from"../chunk-VTMCSCXV.js";export{calculateCargoCapacity,calculateFuelCapacity,calculatePassengerCapacity,calculateUnladenMass}from"../chunk-C3LLPLLD.js"; export{mobilityCapacitorMetrics}from"../chunk-VEEBJFJ7.js";export{mobilityMetrics,thrusterMassCurveMultiplier}from"../chunk-A4QKXXZD.js"; export{BLUEPRINTS,getBlueprint,getBlueprintGrade}from"../chunk-WDAYRHXR.js"; export{distributorMetrics}from"../chunk-M2TCZKRT.js"; export{EXPERIMENTAL_EFFECTS,getExperimentalEffect}from"../chunk-77I24V6B.js";export{ammunitionCapacity}from"../chunk-AA3K5XUE.js";export{armourMetrics}from"../chunk-Q5ALV3DI.js";export{effectiveHitPoints,mapDamageTypes,stackArmourResistance,stackShieldResistance,systemsResistance}from"../chunk-F44QX47A.js"; export{computeModifiers,sumMaterials}from"../chunk-U73MBQ45.js"; export{resolveBlueprintForModule}from"../chunk-2J6NNI3Y.js";export{ENGINEERING_OPTION_GROUPS,getBlueprintsForModule,getEngineeringGroup,getExperimentalsForBlueprint,getExperimentalsForModule}from"../chunk-M4STXLXO.js"; export{SLOT_RESTRICTION_LABELS,enumerateSlots,parseSlotName}from"../chunk-RAO35XDF.js"; //# sourceMappingURL=index.js.map
@@ -44,8 +44,7 @@ import './slots.js';
44
44
  *
45
45
  * @param variant - A pre-engineered variant.
46
46
  * @returns One modifier per computable label, or an empty array when the variant carries
47
- * neither a stat block nor a baked effect that moves a stat (a `mercenary` row carries no
48
- * stat block, so only its baked effect contributes) or its symbol is unknown.
47
+ * neither a stat block nor a baked effect that moves a stat, or its symbol is unknown.
49
48
  *
50
49
  * @example
51
50
  * ```ts
@@ -69,9 +68,8 @@ declare function getPreEngineeredModifiers(variant: PreEngineeredVariant): Engin
69
68
  *
70
69
  * @param variant - A pre-engineered variant.
71
70
  * @returns Its computable fixed modifiers in journal representation, or an empty array
72
- * when its symbol is unknown or it moves no stat the catalogue carries. A `mercenary` row
73
- * publishes no stat block, so what its baked experimental effect moves is the whole of
74
- * what it reports — the same block `ShipLoadout.setPreEngineeredVariant` fits.
71
+ * when its symbol is unknown or it moves no stat the catalogue carries. A measured
72
+ * Mercenary row combines its fixed block with its baked experimental effect.
75
73
  *
76
74
  * @example
77
75
  * ```ts
@@ -178,10 +176,8 @@ declare function unresolvedModifiers(variant: PreEngineeredVariant): string[];
178
176
  * Exact damage components scale with an engineered `damage` value so their proportions
179
177
  * and the anti-xeno overlay remain coherent with the resolved scalar.
180
178
  *
181
- * A variant with no stat block (every `mercenary` row) resolves to a copy of the base
182
- * record with only its baked experimental effect applied, which is the honest answer —
183
- * the effect is published, the grade-1 pre-engineering those arrive with is not, so the
184
- * catalogue does not guess at it.
179
+ * A caller-supplied variant with no stat block resolves to a copy of the base record with only
180
+ * its baked experimental effect applied.
185
181
  *
186
182
  * `rateOfFire` follows a moved firing cycle even though no recipe names it: an article
187
183
  * whose burst interval, burst size or within-burst rate moves — by its own stat block or
@@ -1 +1 @@
1
- export{getPreEngineeredJournalModifiers,getPreEngineeredModifiers,getPreEngineeredStats,identifyPreEngineeredVariant,unresolvedModifiers}from"../chunk-C3YZ5KTA.js"; //# sourceMappingURL=pre-engineered-stats.js.map
1
+ export{getPreEngineeredJournalModifiers,getPreEngineeredModifiers,getPreEngineeredStats,identifyPreEngineeredVariant,unresolvedModifiers}from"../chunk-P6HCQ2YE.js"; //# sourceMappingURL=pre-engineered-stats.js.map
@@ -1,3 +1,8 @@
1
+ import { DamageDistribution } from './modules.js';
2
+ import './engineering-options.js';
3
+ import './module-families.js';
4
+ import './slots.js';
5
+
1
6
  /**
2
7
  * The **pre-engineered module catalogue** — the outfitting rows you buy or receive
3
8
  * already modified, each paired with the base module it fits as and the engineering
@@ -18,10 +23,9 @@
18
23
  * grade already applied. Most blueprint ids join to `BLUEPRINTS`; the festive
19
24
  * `Decorative_*` ids instead identify fixed grade-5 reward articles with no craftable
20
25
  * recipe or material cost.
21
- * Mercenary entries are bought at grade 1 and their bespoke recipes start at
22
- * grade 2 price the remaining upgrade with `getBlueprintCost(blueprint, target,
23
- * grade)` from `ships/blueprint-costs`, which answers with the materials and the Merc
24
- * Coin the climb costs.
26
+ * Mercenary entries are bought at grade 1. Measured bespoke recipes start at grade 2.
27
+ * Price a measured upgrade with `getBlueprintCost(blueprint, target, grade)` from
28
+ * `ships/blueprint-costs`. It returns `null` when numeric grades and costs are not measured.
25
29
  * Community-goal and tech-broker entries instead identify fixed reward articles; their
26
30
  * blueprint ids do not grant a recipe to the stock module.
27
31
  *
@@ -41,6 +45,7 @@
41
45
  *
42
46
  * @packageDocumentation
43
47
  */
48
+
44
49
  /**
45
50
  * Where a pre-engineered variant is obtained.
46
51
  *
@@ -130,11 +135,12 @@ interface PreEngineeredVariant {
130
135
  * {@link ships/blueprint-costs!getBlueprintCost | getBlueprintCost}.
131
136
  */
132
137
  readonly mercCoinCost?: number;
138
+ /** The fixed damage-type shares the variant arrives with. */
139
+ readonly damageDistribution?: DamageDistribution;
133
140
  /**
134
141
  * The hand-set stat block the variant arrives with, sorted by `label`.
135
142
  *
136
- * Absent on every `mercenary` row: no registry publishes the grade-1 pre-engineering
137
- * those arrive with. Present on all community-goal, tech-broker and event-reward rows.
143
+ * Every catalogued variant carries this block.
138
144
  */
139
145
  readonly modifiers?: readonly PreEngineeredModifier[];
140
146
  }
@@ -1 +1 @@
1
- export{PRE_ENGINEERED_MODULES,getPreEngineeredVariants,isPreEngineered}from"../chunk-AUBV6S7V.js"; //# sourceMappingURL=pre-engineered.js.map
1
+ export{PRE_ENGINEERED_MODULES,getPreEngineeredVariants,isPreEngineered}from"../chunk-EXHZ4CFB.js"; //# sourceMappingURL=pre-engineered.js.map
@@ -54,7 +54,10 @@ import { DamageResistances, DamageTypeValues, DamageResistanceParams } from './r
54
54
  * An {@link OutfittingModule} record satisfies this as-is, so a catalogue entry can be
55
55
  * passed straight in — the six curve fields and the resistances are exactly what a
56
56
  * generator's record carries. `optMultiplier` is what a Reinforced/Thermic blueprint
57
- * moves. Every field is optional because the type accepts those records; a generator
57
+ * moves, and `optMass` what Enhanced Low Power moves. A recipe names those two alone and
58
+ * the four endpoints follow them, so pass the whole moved curve rather than a moved
59
+ * optimum on stock endpoints. `FittedModule.effectiveStats` carries it already.
60
+ * Every field is optional because the type accepts those records; a generator
58
61
  * **missing** any of the six curve fields cannot be placed on the curve at all, and
59
62
  * raises no shield ({@link shieldMassCurveMultiplier} returns `0`).
60
63
  *
@@ -1 +1 @@
1
- export{shieldMassCurveMultiplier,shieldMetrics,shieldStrength}from"../chunk-5VWACBTN.js"; //# sourceMappingURL=shields.js.map
1
+ export{shieldMassCurveMultiplier,shieldMetrics,shieldStrength}from"../chunk-DBJKLXLS.js"; //# sourceMappingURL=shields.js.map