@elite-dangerous-almanac/core 0.2.9 → 0.2.11

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 (53) hide show
  1. package/PROVENANCE/equipment/SOURCES.md +41 -27
  2. package/PROVENANCE/i18n/SOURCES.md +1 -1
  3. package/README.md +5 -3
  4. package/dist/chunk-36I5QLTL.js +1 -0
  5. package/dist/chunk-36I5QLTL.js.map +1 -0
  6. package/dist/chunk-4WC5NHBJ.js +1 -0
  7. package/dist/chunk-4WC5NHBJ.js.map +1 -0
  8. package/dist/{chunk-HIJR7DOC.js → chunk-53EBUFVU.js} +1 -1
  9. package/dist/{chunk-HIJR7DOC.js.map → chunk-53EBUFVU.js.map} +1 -1
  10. package/dist/chunk-A6QTYK2D.js +1 -0
  11. package/dist/chunk-A6QTYK2D.js.map +1 -0
  12. package/dist/chunk-C6G7IN74.js +1 -0
  13. package/dist/{chunk-UTWZZOSA.js.map → chunk-C6G7IN74.js.map} +1 -1
  14. package/dist/{chunk-5VWACBTN.js → chunk-DBJKLXLS.js} +1 -1
  15. package/dist/{chunk-5VWACBTN.js.map → chunk-DBJKLXLS.js.map} +1 -1
  16. package/dist/{chunk-X3MXPE7G.js → chunk-RA6SY445.js} +1 -1
  17. package/dist/chunk-YI5XKWW2.js +1 -0
  18. package/dist/{chunk-AC3U7LRK.js.map → chunk-YI5XKWW2.js.map} +1 -1
  19. package/dist/{chunk-G7WARJ3X.js → chunk-ZWT5Y3JR.js} +1 -1
  20. package/dist/chunk-ZWT5Y3JR.js.map +1 -0
  21. package/dist/equipment/index.d.ts +8 -1
  22. package/dist/equipment/index.js +1 -1
  23. package/dist/equipment/modifications.js +1 -1
  24. package/dist/equipment/suit-loadout.d.ts +284 -0
  25. package/dist/equipment/suit-loadout.js +1 -0
  26. package/dist/equipment/suit-loadout.js.map +1 -0
  27. package/dist/equipment/suits.d.ts +1 -1
  28. package/dist/equipment/suits.js +1 -1
  29. package/dist/equipment/upgrade-costs.d.ts +1 -1
  30. package/dist/equipment/upgrade-costs.js +1 -1
  31. package/dist/equipment/weapons.d.ts +1 -1
  32. package/dist/i18n/index.d.ts +1 -1
  33. package/dist/i18n/index.js +1 -1
  34. package/dist/i18n/suits.d.ts +1 -1
  35. package/dist/materials/index.js +1 -1
  36. package/dist/materials/micro-resources-all.js +1 -1
  37. package/dist/materials/micro-resources.js +1 -1
  38. package/dist/ships/build-metrics.js +1 -1
  39. package/dist/ships/index.js +1 -1
  40. package/dist/ships/shields.d.ts +4 -1
  41. package/dist/ships/shields.js +1 -1
  42. package/dist/ships/ship-loadout.d.ts +5 -1
  43. package/dist/ships/ship-loadout.js +1 -1
  44. package/dist/{suits-B37rAORs.d.ts → suits-B4sQMLFe.d.ts} +49 -13
  45. package/package.json +5 -1
  46. package/dist/chunk-AC3U7LRK.js +0 -1
  47. package/dist/chunk-G7WARJ3X.js.map +0 -1
  48. package/dist/chunk-GVNTKCVF.js +0 -1
  49. package/dist/chunk-GVNTKCVF.js.map +0 -1
  50. package/dist/chunk-UTWZZOSA.js +0 -1
  51. package/dist/chunk-ZBUTGTZ3.js +0 -1
  52. package/dist/chunk-ZBUTGTZ3.js.map +0 -1
  53. /package/dist/{chunk-X3MXPE7G.js.map → chunk-RA6SY445.js.map} +0 -0
@@ -2,6 +2,12 @@
2
2
  * Elite Dangerous personal equipment: Odyssey suits, handheld weapons, suit tools,
3
3
  * Pioneer Supplies grade progression and engineer-applied modifications.
4
4
  *
5
+ * **Reading a journal suit loadout? Start with {@link parseSuitLoadout}.** It takes a
6
+ * `SuitLoadout`, `SwitchSuitLoadout` or `CreateSuitLoadout` event and answers with the
7
+ * suit, its stats at the grade it states, its modifications and the weapon at each
8
+ * mount. The lookups below are what it resolves an event against, and what an outfitting
9
+ * screen browsing the catalogues calls directly.
10
+ *
5
11
  * Material shopping lists are deliberately leaf-only: import grade-upgrade costs from
6
12
  * `equipment/upgrade-costs` and modification costs from
7
13
  * `equipment/modification-costs`. Keeping them off this barrel lets identity and stat
@@ -9,8 +15,9 @@
9
15
  *
10
16
  * @packageDocumentation
11
17
  */
12
- export { E as EquipmentGrade, P as PERSONAL_WEAPONS, a as PersonalDamageType, b as PersonalFireMode, c as PersonalMount, d as PersonalMountKey, e as PersonalWeapon, f as PersonalWeaponClass, g as PersonalWeaponEngineeringType, h as PersonalWeaponGrade, i as PersonalWeaponMetrics, j as PersonalWeaponSlot, R as ReloadTime, S as SUITS, k as ScopeMagnification, l as Suit, m as SuitGrade, W as WeaponUpgradeGroup, n as getPersonalWeaponByName, o as getPersonalWeaponBySymbol, p as getPersonalWeaponGrade, q as getSuitByFamily, r as getSuitByName, s as getSuitBySymbol, t as getSuitGrade, u as personalWeaponMetrics } from '../suits-B37rAORs.js';
18
+ export { E as EquipmentGrade, P as PERSONAL_WEAPONS, a as PersonalDamageType, b as PersonalFireMode, c as PersonalMount, d as PersonalMountKey, e as PersonalWeapon, f as PersonalWeaponClass, g as PersonalWeaponEngineeringType, h as PersonalWeaponGrade, i as PersonalWeaponMetrics, j as PersonalWeaponSlot, R as ReloadTime, S as SUITS, k as ScopeMagnification, l as Suit, m as SuitGrade, W as WeaponUpgradeGroup, n as getPersonalWeaponByName, o as getPersonalWeaponBySymbol, p as getPersonalWeaponGrade, q as getSuitByFamily, r as getSuitByName, s as getSuitBySymbol, t as getSuitGrade, u as personalWeaponMetrics } from '../suits-B4sQMLFe.js';
13
19
  export { PERSONAL_TOOLS, PersonalTool, getPersonalToolById } from './tools.js';
14
20
  export { PersonalEngineeringIngredient, PersonalModifier, applyPersonalModifiers, sumPersonalEngineeringIngredients } from './engineering.js';
15
21
  export { PERSONAL_MODIFICATIONS, PersonalModification, PersonalModificationTarget, getPersonalModification } from './modifications.js';
16
22
  export { resolvePersonalModificationForWeapon } from './modification-journal.js';
23
+ export { FittedPersonalModification, FittedPersonalWeapon, SuitLoadout, SuitLoadoutEvent, SuitLoadoutImportOutcome, SuitLoadoutModuleEvent, parseSuitLoadout } from './suit-loadout.js';
@@ -1 +1 @@
1
- export{resolvePersonalModificationForWeapon}from"../chunk-R2AEZYX7.js";export{PERSONAL_MODIFICATIONS,getPersonalModification}from"../chunk-AC3U7LRK.js";export{PERSONAL_TOOLS,getPersonalToolById}from"../chunk-CEF7SMB2.js";export{SUITS,getSuitByFamily,getSuitByName,getSuitBySymbol,getSuitGrade}from"../chunk-UTWZZOSA.js";export{PERSONAL_WEAPONS,getPersonalWeaponByName,getPersonalWeaponBySymbol,getPersonalWeaponGrade,personalWeaponMetrics}from"../chunk-PIU24HRN.js"; export{applyPersonalModifiers,sumPersonalEngineeringIngredients}from"../chunk-SIL356HB.js"; //# sourceMappingURL=index.js.map
1
+ export{parseSuitLoadout}from"../chunk-36I5QLTL.js";export{resolvePersonalModificationForWeapon}from"../chunk-R2AEZYX7.js";export{PERSONAL_MODIFICATIONS,getPersonalModification}from"../chunk-YI5XKWW2.js";export{PERSONAL_TOOLS,getPersonalToolById}from"../chunk-CEF7SMB2.js";export{SUITS,getSuitByFamily,getSuitByName,getSuitBySymbol,getSuitGrade}from"../chunk-C6G7IN74.js";export{PERSONAL_WEAPONS,getPersonalWeaponByName,getPersonalWeaponBySymbol,getPersonalWeaponGrade,personalWeaponMetrics}from"../chunk-PIU24HRN.js"; export{applyPersonalModifiers,sumPersonalEngineeringIngredients}from"../chunk-SIL356HB.js"; //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- export{PERSONAL_MODIFICATIONS,getPersonalModification}from"../chunk-AC3U7LRK.js"; //# sourceMappingURL=modifications.js.map
1
+ export{PERSONAL_MODIFICATIONS,getPersonalModification}from"../chunk-YI5XKWW2.js"; //# sourceMappingURL=modifications.js.map
@@ -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,2 +1,2 @@
1
- export { E as EquipmentGrade, c as PersonalMount, d as PersonalMountKey, S as SUITS, l as Suit, m as SuitGrade, q as getSuitByFamily, r as getSuitByName, s as getSuitBySymbol, t as getSuitGrade } from '../suits-B37rAORs.js';
1
+ export { E as EquipmentGrade, c as PersonalMount, d as PersonalMountKey, S as SUITS, l as Suit, m as SuitGrade, q as getSuitByFamily, r as getSuitByName, s as getSuitBySymbol, t as getSuitGrade } from '../suits-B4sQMLFe.js';
2
2
  import './engineering.js';
@@ -1 +1 @@
1
- export{SUITS,getSuitByFamily,getSuitByName,getSuitBySymbol,getSuitGrade}from"../chunk-UTWZZOSA.js"; //# sourceMappingURL=suits.js.map
1
+ export{SUITS,getSuitByFamily,getSuitByName,getSuitBySymbol,getSuitGrade}from"../chunk-C6G7IN74.js"; //# sourceMappingURL=suits.js.map
@@ -1,4 +1,4 @@
1
- import { W as WeaponUpgradeGroup } from '../suits-B37rAORs.js';
1
+ import { W as WeaponUpgradeGroup } from '../suits-B4sQMLFe.js';
2
2
  import { PersonalEngineeringIngredient } from './engineering.js';
3
3
 
4
4
  /**
@@ -1 +1 @@
1
- import{getSuitByFamily}from"../chunk-UTWZZOSA.js";import{getPersonalWeaponBySymbol}from"../chunk-PIU24HRN.js"; import{sumPersonalEngineeringIngredients}from"../chunk-SIL356HB.js"; import{deepFreeze}from"../chunk-DURKO7JU.js";var upgrade_costs_default={suits:{utilitysuit:{2:[{symbol:"suitschematic",count:1},{symbol:"healthmonitor",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"carbonfibreplating",count:2},{symbol:"graphene",count:2}],3:[{symbol:"suitschematic",count:2},{symbol:"healthmonitor",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"carbonfibreplating",count:5},{symbol:"graphene",count:5}],4:[{symbol:"suitschematic",count:4},{symbol:"healthmonitor",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"carbonfibreplating",count:9},{symbol:"graphene",count:9}],5:[{symbol:"suitschematic",count:5},{symbol:"healthmonitor",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"carbonfibreplating",count:12},{symbol:"graphene",count:12}]},tacticalsuit:{2:[{symbol:"suitschematic",count:1},{symbol:"healthmonitor",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"titaniumplating",count:2},{symbol:"graphene",count:2}],3:[{symbol:"suitschematic",count:2},{symbol:"healthmonitor",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"titaniumplating",count:5},{symbol:"graphene",count:5}],4:[{symbol:"suitschematic",count:4},{symbol:"healthmonitor",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"titaniumplating",count:9},{symbol:"graphene",count:9}],5:[{symbol:"suitschematic",count:5},{symbol:"healthmonitor",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"titaniumplating",count:12},{symbol:"graphene",count:12}]},explorationsuit:{2:[{symbol:"suitschematic",count:1},{symbol:"healthmonitor",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"aerogel",count:2},{symbol:"graphene",count:2}],3:[{symbol:"suitschematic",count:2},{symbol:"healthmonitor",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"aerogel",count:5},{symbol:"graphene",count:5}],4:[{symbol:"suitschematic",count:4},{symbol:"healthmonitor",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"aerogel",count:9},{symbol:"graphene",count:9}],5:[{symbol:"suitschematic",count:5},{symbol:"healthmonitor",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"aerogel",count:12},{symbol:"graphene",count:12}]}},weaponGroups:{takada:{2:[{symbol:"weaponschematic",count:1},{symbol:"ionisedgas",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"microelectrode",count:2},{symbol:"opticalfibre",count:2}],3:[{symbol:"weaponschematic",count:2},{symbol:"ionisedgas",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"microelectrode",count:5},{symbol:"opticalfibre",count:5}],4:[{symbol:"weaponschematic",count:4},{symbol:"ionisedgas",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"microelectrode",count:9},{symbol:"opticalfibre",count:9}],5:[{symbol:"weaponschematic",count:5},{symbol:"ionisedgas",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"microelectrode",count:12},{symbol:"opticalfibre",count:12}]},manticore:{2:[{symbol:"weaponschematic",count:1},{symbol:"ionisedgas",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"microelectrode",count:2},{symbol:"chemicalsuperbase",count:2}],3:[{symbol:"weaponschematic",count:2},{symbol:"ionisedgas",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"microelectrode",count:5},{symbol:"chemicalsuperbase",count:5}],4:[{symbol:"weaponschematic",count:4},{symbol:"ionisedgas",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"microelectrode",count:9},{symbol:"chemicalsuperbase",count:9}],5:[{symbol:"weaponschematic",count:5},{symbol:"ionisedgas",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"microelectrode",count:12},{symbol:"chemicalsuperbase",count:12}]},karma:{2:[{symbol:"weaponschematic",count:1},{symbol:"compressionliquefiedgas",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"weaponcomponent",count:2},{symbol:"tungstencarbide",count:2}],3:[{symbol:"weaponschematic",count:2},{symbol:"compressionliquefiedgas",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"weaponcomponent",count:5},{symbol:"tungstencarbide",count:5}],4:[{symbol:"weaponschematic",count:4},{symbol:"compressionliquefiedgas",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"weaponcomponent",count:9},{symbol:"tungstencarbide",count:9}],5:[{symbol:"weaponschematic",count:5},{symbol:"compressionliquefiedgas",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"weaponcomponent",count:12},{symbol:"tungstencarbide",count:12}]}}};var PERSONAL_UPGRADE_COSTS=deepFreeze(upgrade_costs_default);function getSuitUpgradeStepCost(family,targetGrade){assertTargetGrade(targetGrade,"getSuitUpgradeStepCost");const costs=getSuitUpgradeCosts(family);return costs?.[String(targetGrade)]??null}function getSuitUpgradeCost(family,targetGrade,currentGrade=1){assertGrade(targetGrade,"getSuitUpgradeCost: targetGrade");assertGrade(currentGrade,"getSuitUpgradeCost: currentGrade");const costs=getSuitUpgradeCosts(family);if(!costs)return null;return totalCosts(costs,targetGrade,currentGrade)}function getPersonalWeaponUpgradeStepCost(symbol,targetGrade){assertTargetGrade(targetGrade,"getPersonalWeaponUpgradeStepCost");const weapon=getPersonalWeaponBySymbol(symbol);if(!weapon)return null;return PERSONAL_UPGRADE_COSTS.weaponGroups[weapon.upgradeGroup][String(targetGrade)]??null}function getPersonalWeaponUpgradeCost(symbol,targetGrade,currentGrade=1){assertGrade(targetGrade,"getPersonalWeaponUpgradeCost: targetGrade");assertGrade(currentGrade,"getPersonalWeaponUpgradeCost: currentGrade");const weapon=getPersonalWeaponBySymbol(symbol);if(!weapon)return null;return totalCosts(PERSONAL_UPGRADE_COSTS.weaponGroups[weapon.upgradeGroup],targetGrade,currentGrade)}function totalCosts(costs,targetGrade,currentGrade){const steps=[];for(let grade=currentGrade+1;grade<=targetGrade;grade++){steps.push(costs[String(grade)])}return sumPersonalEngineeringIngredients(...steps)}function getSuitUpgradeCosts(family){const suit=getSuitByFamily(family);if(!suit||!Object.hasOwn(PERSONAL_UPGRADE_COSTS.suits,suit.family))return null;return PERSONAL_UPGRADE_COSTS.suits[suit.family]}function assertTargetGrade(grade,functionName){if(!Number.isInteger(grade)||grade<2||grade>5){throw new RangeError(`${functionName}: targetGrade must be an integer in [2, 5]`)}}function assertGrade(grade,label){if(!Number.isInteger(grade)||grade<1||grade>5){throw new RangeError(`${label} must be an integer in [1, 5]`)}}export{PERSONAL_UPGRADE_COSTS,getPersonalWeaponUpgradeCost,getPersonalWeaponUpgradeStepCost,getSuitUpgradeCost,getSuitUpgradeStepCost};//# sourceMappingURL=upgrade-costs.js.map
1
+ import{getSuitByFamily}from"../chunk-C6G7IN74.js";import{getPersonalWeaponBySymbol}from"../chunk-PIU24HRN.js"; import{sumPersonalEngineeringIngredients}from"../chunk-SIL356HB.js"; import{deepFreeze}from"../chunk-DURKO7JU.js";var upgrade_costs_default={suits:{utilitysuit:{2:[{symbol:"suitschematic",count:1},{symbol:"healthmonitor",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"carbonfibreplating",count:2},{symbol:"graphene",count:2}],3:[{symbol:"suitschematic",count:2},{symbol:"healthmonitor",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"carbonfibreplating",count:5},{symbol:"graphene",count:5}],4:[{symbol:"suitschematic",count:4},{symbol:"healthmonitor",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"carbonfibreplating",count:9},{symbol:"graphene",count:9}],5:[{symbol:"suitschematic",count:5},{symbol:"healthmonitor",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"carbonfibreplating",count:12},{symbol:"graphene",count:12}]},tacticalsuit:{2:[{symbol:"suitschematic",count:1},{symbol:"healthmonitor",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"titaniumplating",count:2},{symbol:"graphene",count:2}],3:[{symbol:"suitschematic",count:2},{symbol:"healthmonitor",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"titaniumplating",count:5},{symbol:"graphene",count:5}],4:[{symbol:"suitschematic",count:4},{symbol:"healthmonitor",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"titaniumplating",count:9},{symbol:"graphene",count:9}],5:[{symbol:"suitschematic",count:5},{symbol:"healthmonitor",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"titaniumplating",count:12},{symbol:"graphene",count:12}]},explorationsuit:{2:[{symbol:"suitschematic",count:1},{symbol:"healthmonitor",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"aerogel",count:2},{symbol:"graphene",count:2}],3:[{symbol:"suitschematic",count:2},{symbol:"healthmonitor",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"aerogel",count:5},{symbol:"graphene",count:5}],4:[{symbol:"suitschematic",count:4},{symbol:"healthmonitor",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"aerogel",count:9},{symbol:"graphene",count:9}],5:[{symbol:"suitschematic",count:5},{symbol:"healthmonitor",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"aerogel",count:12},{symbol:"graphene",count:12}]}},weaponGroups:{takada:{2:[{symbol:"weaponschematic",count:1},{symbol:"ionisedgas",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"microelectrode",count:2},{symbol:"opticalfibre",count:2}],3:[{symbol:"weaponschematic",count:2},{symbol:"ionisedgas",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"microelectrode",count:5},{symbol:"opticalfibre",count:5}],4:[{symbol:"weaponschematic",count:4},{symbol:"ionisedgas",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"microelectrode",count:9},{symbol:"opticalfibre",count:9}],5:[{symbol:"weaponschematic",count:5},{symbol:"ionisedgas",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"microelectrode",count:12},{symbol:"opticalfibre",count:12}]},manticore:{2:[{symbol:"weaponschematic",count:1},{symbol:"ionisedgas",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"microelectrode",count:2},{symbol:"chemicalsuperbase",count:2}],3:[{symbol:"weaponschematic",count:2},{symbol:"ionisedgas",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"microelectrode",count:5},{symbol:"chemicalsuperbase",count:5}],4:[{symbol:"weaponschematic",count:4},{symbol:"ionisedgas",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"microelectrode",count:9},{symbol:"chemicalsuperbase",count:9}],5:[{symbol:"weaponschematic",count:5},{symbol:"ionisedgas",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"microelectrode",count:12},{symbol:"chemicalsuperbase",count:12}]},karma:{2:[{symbol:"weaponschematic",count:1},{symbol:"compressionliquefiedgas",count:1},{symbol:"manufacturinginstructions",count:1},{symbol:"weaponcomponent",count:2},{symbol:"tungstencarbide",count:2}],3:[{symbol:"weaponschematic",count:2},{symbol:"compressionliquefiedgas",count:2},{symbol:"manufacturinginstructions",count:2},{symbol:"weaponcomponent",count:5},{symbol:"tungstencarbide",count:5}],4:[{symbol:"weaponschematic",count:4},{symbol:"compressionliquefiedgas",count:4},{symbol:"manufacturinginstructions",count:4},{symbol:"weaponcomponent",count:9},{symbol:"tungstencarbide",count:9}],5:[{symbol:"weaponschematic",count:5},{symbol:"compressionliquefiedgas",count:5},{symbol:"manufacturinginstructions",count:5},{symbol:"weaponcomponent",count:12},{symbol:"tungstencarbide",count:12}]}}};var PERSONAL_UPGRADE_COSTS=deepFreeze(upgrade_costs_default);function getSuitUpgradeStepCost(family,targetGrade){assertTargetGrade(targetGrade,"getSuitUpgradeStepCost");const costs=getSuitUpgradeCosts(family);return costs?.[String(targetGrade)]??null}function getSuitUpgradeCost(family,targetGrade,currentGrade=1){assertGrade(targetGrade,"getSuitUpgradeCost: targetGrade");assertGrade(currentGrade,"getSuitUpgradeCost: currentGrade");const costs=getSuitUpgradeCosts(family);if(!costs)return null;return totalCosts(costs,targetGrade,currentGrade)}function getPersonalWeaponUpgradeStepCost(symbol,targetGrade){assertTargetGrade(targetGrade,"getPersonalWeaponUpgradeStepCost");const weapon=getPersonalWeaponBySymbol(symbol);if(!weapon)return null;return PERSONAL_UPGRADE_COSTS.weaponGroups[weapon.upgradeGroup][String(targetGrade)]??null}function getPersonalWeaponUpgradeCost(symbol,targetGrade,currentGrade=1){assertGrade(targetGrade,"getPersonalWeaponUpgradeCost: targetGrade");assertGrade(currentGrade,"getPersonalWeaponUpgradeCost: currentGrade");const weapon=getPersonalWeaponBySymbol(symbol);if(!weapon)return null;return totalCosts(PERSONAL_UPGRADE_COSTS.weaponGroups[weapon.upgradeGroup],targetGrade,currentGrade)}function totalCosts(costs,targetGrade,currentGrade){const steps=[];for(let grade=currentGrade+1;grade<=targetGrade;grade++){steps.push(costs[String(grade)])}return sumPersonalEngineeringIngredients(...steps)}function getSuitUpgradeCosts(family){const suit=getSuitByFamily(family);if(!suit||!Object.hasOwn(PERSONAL_UPGRADE_COSTS.suits,suit.family))return null;return PERSONAL_UPGRADE_COSTS.suits[suit.family]}function assertTargetGrade(grade,functionName){if(!Number.isInteger(grade)||grade<2||grade>5){throw new RangeError(`${functionName}: targetGrade must be an integer in [2, 5]`)}}function assertGrade(grade,label){if(!Number.isInteger(grade)||grade<1||grade>5){throw new RangeError(`${label} must be an integer in [1, 5]`)}}export{PERSONAL_UPGRADE_COSTS,getPersonalWeaponUpgradeCost,getPersonalWeaponUpgradeStepCost,getSuitUpgradeCost,getSuitUpgradeStepCost};//# sourceMappingURL=upgrade-costs.js.map
@@ -1,2 +1,2 @@
1
1
  import './engineering.js';
2
- export { P as PERSONAL_WEAPONS, a as PersonalDamageType, b as PersonalFireMode, e as PersonalWeapon, f as PersonalWeaponClass, g as PersonalWeaponEngineeringType, h as PersonalWeaponGrade, i as PersonalWeaponMetrics, j as PersonalWeaponSlot, R as ReloadTime, k as ScopeMagnification, W as WeaponUpgradeGroup, n as getPersonalWeaponByName, o as getPersonalWeaponBySymbol, p as getPersonalWeaponGrade, u as personalWeaponMetrics } from '../suits-B37rAORs.js';
2
+ export { P as PERSONAL_WEAPONS, a as PersonalDamageType, b as PersonalFireMode, e as PersonalWeapon, f as PersonalWeaponClass, g as PersonalWeaponEngineeringType, h as PersonalWeaponGrade, i as PersonalWeaponMetrics, j as PersonalWeaponSlot, R as ReloadTime, k as ScopeMagnification, W as WeaponUpgradeGroup, n as getPersonalWeaponByName, o as getPersonalWeaponBySymbol, p as getPersonalWeaponGrade, u as personalWeaponMetrics } from '../suits-B4sQMLFe.js';
@@ -90,7 +90,7 @@ export { getPersonalModificationDescription, getPersonalModificationName } from
90
90
  export { getLoadoutSlotName, getSlotRestrictionLabel } from './slots.js';
91
91
  export { getCalculationIssueMessage, getLoadoutEditErrorMessage, getLoadoutIssueMessage, getSlefDiagnosticMessage } from './diagnostics.js';
92
92
  export { PreEngineeredVariantIdentity, getPreEngineeredVariantName } from './pre-engineered.js';
93
- import '../suits-B37rAORs.js';
93
+ import '../suits-B4sQMLFe.js';
94
94
  import '../equipment/engineering.js';
95
95
  import '../ships/slots.js';
96
96
  import '../ships/loadout-calculations.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{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-T7IQHFQ2.js";export{getLoadoutSlotName,getSlotRestrictionLabel}from"../chunk-ZRG35JSH.js"; export{getPersonalMountName,getSuitDescription,getSuitName}from"../chunk-RA4YJBU5.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{getOutfittingFamilyName}from"../chunk-YBE5M27G.js";export{getBlueprintName}from"../chunk-UI5RROGI.js"; //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import { c as PersonalMount } from '../suits-B37rAORs.js';
1
+ import { c as PersonalMount } from '../suits-B4sQMLFe.js';
2
2
  import '../equipment/engineering.js';
3
3
 
4
4
  /**
@@ -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-RA6SY445.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-4WC5NHBJ.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";export{CONSUMABLE_MICRO_RESOURCES}from"../chunk-K7L7SMIR.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-4WC5NHBJ.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-RA6SY445.js"; //# sourceMappingURL=micro-resources.js.map
@@ -1 +1 @@
1
- export{BuildMetrics}from"../chunk-G7WARJ3X.js"; //# sourceMappingURL=build-metrics.js.map
1
+ export{BuildMetrics}from"../chunk-ZWT5Y3JR.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-53EBUFVU.js";export{OUTFITTING_FAMILIES}from"../chunk-M6G3UDTX.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{BuildMetrics}from"../chunk-ZWT5Y3JR.js";export{weaponsCapacitorMetrics}from"../chunk-M4FZRDAH.js";export{powerBudget}from"../chunk-GGQMIQPC.js";export{shieldCapacitorMetrics}from"../chunk-XQJERZUS.js";export{cellBankSummary,shieldRecovery}from"../chunk-JMAXSXXQ.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{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-DBJKLXLS.js";export{getBulkheadsForShip,getModuleBySymbol,getModulesByName}from"../chunk-OSMBAFRW.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{distributorMetrics}from"../chunk-M2TCZKRT.js"; export{EXPERIMENTAL_EFFECTS,getExperimentalEffect}from"../chunk-77I24V6B.js";export{SHIP_GUNSIGHTS,getShipGunsight,projectGunsight}from"../chunk-XSN53F7W.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
@@ -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
@@ -72,7 +72,11 @@ interface FittedModule {
72
72
  * A module engineered through {@link ShipLoadout.applyBlueprint} also retains
73
73
  * recipe-only burst values that its journal-shaped modifier block does not serialize.
74
74
  * A festive variant fitted through {@link ShipLoadout.setPreEngineeredVariant} uses
75
- * its fixed modifier block.
75
+ * its fixed modifier block. A thruster's or shield generator's mass curve moves as a
76
+ * whole. A recipe names the optimal mass and the optimal multiplier, and the four
77
+ * endpoints follow them. A generator's maximum mass is the exception: a lightened
78
+ * optimum leaves it where it was. So this record carries the curve the build's own
79
+ * metrics read.
76
80
  */
77
81
  readonly effectiveStats: OutfittingModule | null;
78
82
  /** Fully rearmed ammunition capacity, or `null` for modules without ammunition. */
@@ -1 +1 @@
1
- export{LoadoutEditError,ShipLoadout}from"../chunk-HIJR7DOC.js"; //# sourceMappingURL=ship-loadout.js.map
1
+ export{LoadoutEditError,ShipLoadout}from"../chunk-53EBUFVU.js"; //# sourceMappingURL=ship-loadout.js.map
@@ -229,8 +229,9 @@ declare function personalWeaponMetrics(weapon: PersonalWeapon, grade: number, mo
229
229
  }): PersonalWeaponMetrics | null;
230
230
 
231
231
  /**
232
- * Odyssey personal suits: their journal identifiers, the suit-wide component stats every
233
- * grade shares, and the grade-dependent defensive stats.
232
+ * Odyssey personal suits: their journal identifiers, the suit-wide stats every grade
233
+ * shares, including the shield resistances, and the grade-dependent armour resistances
234
+ * and shield figures.
234
235
  *
235
236
  * @packageDocumentation
236
237
  */
@@ -270,7 +271,24 @@ interface PersonalMount {
270
271
  /** Which weapons the mount takes; a weapon whose `slot` equals it fits here. */
271
272
  readonly kind: PersonalWeaponSlot;
272
273
  }
273
- /** The stats of one suit at one equipment grade. */
274
+ /**
275
+ * The stats of one suit at one equipment grade.
276
+ *
277
+ * @remarks
278
+ * A suit defends in two layers, and each layer has its own four resistances. The four
279
+ * here are the armour's: they apply to the {@link Suit.health} pool, and the Damage
280
+ * Resistance modification moves them. The shield's four sit on {@link Suit}, because a
281
+ * grade leaves them alone.
282
+ * @example
283
+ * ```ts
284
+ * import { getSuitByFamily, getSuitGrade } from '@elite-dangerous-almanac/core/equipment/suits';
285
+ *
286
+ * const suit = getSuitByFamily('tacticalsuit')!;
287
+ * // The shield is weak against a laser; the armour behind it is strong.
288
+ * suit.shieldThermalResistance; // -> -0.5
289
+ * getSuitGrade(suit, 5)!.armourThermalResistance; // -> 0.8
290
+ * ```
291
+ */
274
292
  interface SuitGrade {
275
293
  /** Frontier item symbol for this exact suit and grade. */
276
294
  readonly symbol: string;
@@ -280,14 +298,14 @@ interface SuitGrade {
280
298
  readonly shieldStrength: number;
281
299
  /** Shield points regenerated per second. */
282
300
  readonly shieldRegeneration: number;
283
- /** Kinetic damage resistance as a fraction; negative values increase damage. */
284
- readonly kineticResistance: number;
285
- /** Thermal damage resistance as a fraction. */
286
- readonly thermalResistance: number;
287
- /** Plasma damage resistance as a fraction; negative values increase damage. */
288
- readonly plasmaResistance: number;
289
- /** Explosive damage resistance as a fraction. */
290
- readonly explosiveResistance: number;
301
+ /** Armour kinetic damage resistance as a fraction; negative values increase damage. */
302
+ readonly armourKineticResistance: number;
303
+ /** Armour thermal damage resistance as a fraction. */
304
+ readonly armourThermalResistance: number;
305
+ /** Armour plasma damage resistance as a fraction; negative values increase damage. */
306
+ readonly armourPlasmaResistance: number;
307
+ /** Armour explosive damage resistance as a fraction. */
308
+ readonly armourExplosiveResistance: number;
291
309
  }
292
310
  /** One personal suit model sold by Pioneer Supplies. */
293
311
  interface Suit {
@@ -306,6 +324,23 @@ interface Suit {
306
324
  readonly mounts: readonly PersonalMount[];
307
325
  /** Suit health in health points, the pool the shield protects. */
308
326
  readonly health: number;
327
+ /**
328
+ * Shield kinetic damage resistance as a fraction.
329
+ *
330
+ * @remarks
331
+ * The shield takes the damage first, and the armour under it takes what gets
332
+ * through, so the two layers carry separate resistances. The four here are the same
333
+ * at every grade, so they are stored once per family, like every other stat a grade
334
+ * leaves alone. A grade changes the shield's strength and its regeneration, both on
335
+ * {@link SuitGrade}, and it changes the armour's four resistances there as well.
336
+ */
337
+ readonly shieldKineticResistance: number;
338
+ /** Shield thermal damage resistance as a fraction; negative values increase damage. */
339
+ readonly shieldThermalResistance: number;
340
+ /** Shield plasma damage resistance as a fraction. */
341
+ readonly shieldPlasmaResistance: number;
342
+ /** Shield explosive damage resistance as a fraction. */
343
+ readonly shieldExplosiveResistance: number;
309
344
  /** Suit mass in kilograms. */
310
345
  readonly mass: number;
311
346
  /** Battery capacity in energy units, the pool the suit's tools draw from. */
@@ -330,8 +365,9 @@ interface Suit {
330
365
  * Available grade records, keyed by `"1"` through `"5"`.
331
366
  *
332
367
  * @remarks
333
- * A grade changes exactly what {@link SuitGrade} carries — the four resistances,
334
- * shield strength, shield regeneration, the modification slots and the item symbol.
368
+ * A grade changes exactly what {@link SuitGrade} carries — the four armour
369
+ * resistances, shield strength, shield regeneration, the modification slots and the
370
+ * item symbol.
335
371
  * Every stat above is a property of the suit family and is the same at all five.
336
372
  */
337
373
  readonly grades: Readonly<Partial<Record<`${EquipmentGrade}`, SuitGrade>>>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elite-dangerous-almanac/core",
3
- "version": "0.2.9",
3
+ "version": "0.2.11",
4
4
  "description": "Elite Dangerous static data and calculations: astronomy, ships and outfitting, personal equipment and engineering, materials, and market commodities.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -186,6 +186,10 @@
186
186
  "types": "./dist/equipment/modifications.d.ts",
187
187
  "import": "./dist/equipment/modifications.js"
188
188
  },
189
+ "./equipment/suit-loadout": {
190
+ "types": "./dist/equipment/suit-loadout.d.ts",
191
+ "import": "./dist/equipment/suit-loadout.js"
192
+ },
189
193
  "./equipment/suits": {
190
194
  "types": "./dist/equipment/suits.d.ts",
191
195
  "import": "./dist/equipment/suits.js"