@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
@@ -93,3 +93,21 @@ e3-26` sits ≈6800 ly beyond every Bleia sphere, and `Praea Aec AA-A b1-1` sits
93
93
  approximate (≈49.35 ly grid resolution); coordinates are quantised to 1/64 ly.
94
94
  - **Grid mapping:** regions sit on a `4096 / 83` ly (≈49.3494 ly) grid over the galactic
95
95
  plane, origin corner at `(x0, y0, z0) = (-49985, -40985, -24105)` ly.
96
+ - **Manual corrections:** one. Region 31 is stored as `The Formidine Rift`. The upstream
97
+ transcription drops the article, and the game's own codex English carries it
98
+ (§`data/i18n/SOURCES.md`, acquired 2026-09-10 UTC). The game is taken as authoritative
99
+ for a region name, because `RegionMap.png` reads the codex names rather than naming the
100
+ regions itself. The Veils, The Conduit, The Abyss and The Void keep their article
101
+ upstream, so this is a transcription slip and not an upstream naming choice. Every
102
+ other region name matches the game's English exactly.
103
+ - **A name lookup answers the game's spelling and not the transcription's.** Resolving
104
+ a region by the name `Formidine Rift` misses, where it hit before the correction.
105
+ That spelling is what the upstream catalogues carry, and it is also the game's own
106
+ Spanish, so a caller holding either has to pass `The Formidine Rift`. A region id is
107
+ unaffected, which is why `data/i18n/codex-region-names.jsonc` is keyed by id.
108
+ - **The game's own region raster is not a second source for the geometry.** The codex
109
+ localisation table acquired for `data/i18n/codex-region-names.jsonc` also carries a
110
+ region raster and per-region border polygons. The raster reproduces
111
+ `galactic-region-cells.jsonc` cell for cell, so it confirms the upstream derivation
112
+ and adds nothing to it. The borders are that raster's outline on cell edges, which the
113
+ cells already state; they are not stored.
@@ -46,7 +46,8 @@ readings are appended, in symbol order, after `curatedcommodity`**: `Bastnasite`
46
46
  - **The category is separately verified in the running game** (2026-09-03 UTC; no
47
47
  immutable revision), exactly as `curatedcommodity`'s is. The registry names a unit and
48
48
  its display name and does not say which market group it belongs to. Every one of these is
49
- `Minerals` except `Helium` and `Helium3`, which are `Chemicals`.
49
+ `Minerals` except `Helium` and `Helium3`, which are `Chemicals`, and `Iridium`, which is
50
+ `Metals`.
50
51
  - **They are stored as standard, not rare.** The registry's English description marks a
51
52
  rare good with the phrase "This rare good". No appended unit carries the marker, no
52
53
  appended unit appears in FDevIDs' `rare_commodity.csv`, and every unit the marker does
@@ -109,7 +109,8 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
109
109
 
110
110
  ## `blueprint-names.jsonc`
111
111
 
112
- - **Acquired:** EDSY 2026-08-14 UTC; the in-game modification names 2026-08-23 UTC.
112
+ - **Acquired:** EDSY 2026-08-14 UTC; in-game modification names 2026-08-23 and
113
+ 2026-09-13 UTC.
113
114
  - **EDSY revision:** commit `e446fbe6e4597dea7ab0bd3105b9a36642388040`;
114
115
  database version `424009901`, last-modified marker `20260810`.
115
116
  - **In-game localisation revision:** none published; the game ships no immutable
@@ -139,6 +140,10 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
139
140
  EDSY carries with the same trailing space) and German `Railgun_LongShot`. The
140
141
  Portuguese `GuardianModule_Sturdy` and `GuardianWeapon_Sturdy` values carry a literal
141
142
  `<br>` line break for the in-game layout, which is stored as a single space.
143
+ - **These Mercenary blueprint names come from direct in-game observation:**
144
+ `BeamLaser_Overloaded`, `BurstLaser_Regenerative`, `Cannon_ForceImpact` and
145
+ `SeekerMissileRackLarge_ExposingMissiles` carry all six observed locales. English uses
146
+ the catalogue's short-name style. The other locales keep the observed strings.
142
147
 
143
148
  ## `experimental-effect-names.jsonc`
144
149
 
@@ -289,7 +294,8 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
289
294
 
290
295
  ## `pre-engineered-variant-names.jsonc`
291
296
 
292
- - **Acquired:** 2026-08-18 UTC; the Merc-shop names 2026-08-22 UTC.
297
+ - **Acquired:** 2026-08-18 UTC; Merc-shop names 2026-08-22, 2026-08-30 and
298
+ 2026-09-13 UTC.
293
299
  - **Derivation:** every compound identity and English name comes from
294
300
  `data/ships/pre-engineered.jsonc`. An identity combines the base module symbol,
295
301
  blueprint, optional experimental effect and acquisition route. When a variant name
@@ -533,6 +539,64 @@ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
533
539
  `"Posavasos Buckyball "` with a trailing space, which is layout and not part of the
534
540
  name; it is stored trimmed. Every other value is verbatim.
535
541
 
542
+ ## `codex-region-names.jsonc`
543
+
544
+ - **Acquired:** 2026-09-10 UTC.
545
+ - **In-game localisation revision:** none published; the game ships no immutable
546
+ identifier for its localisation tables. The acquired table is the evidence, and its
547
+ SHA-256 is
548
+ `b280c66219b2fc6d6e92120f013247fdd2404a8a7614e59c0d79a23f300ae51e`.
549
+ - **Derivation:** every region id and canonical English name comes from
550
+ `data/astro/galactic-regions.jsonc`, which stays authoritative for the id set. Each id
551
+ joins to the in-game codex localisation identity `$Codex_RegionName_<id>;`, which
552
+ carries one name per locale. The join is exact and total: every region resolves, and
553
+ the acquired table names no region the astro catalogue does not carry.
554
+ - **The catalogue is keyed by the region id, not by the English name.** The id is the
555
+ region's stable identity and the name is the value being translated, so a corrected
556
+ English name cannot orphan its translations. The correction below is the reason
557
+ this matters rather than a hypothetical.
558
+ - **The game wins the one English disagreement, against this file's opening rule.** The
559
+ astro catalogue's region names are transcribed from EliteDangerousRegionMap's
560
+ `RegionMap.png`, which reads the game's own codex names rather than naming the regions
561
+ itself, so it is not an independent authority the way a ships or commodities catalogue
562
+ is. The game's English is `The Formidine Rift`; German, Portuguese and Russian repeat
563
+ it, Spanish drops the article and French translates the name. The transcription dropped
564
+ the article, and The Veils, The Conduit, The Abyss and The Void all keep theirs
565
+ upstream. The astro catalogue is corrected to the game's English
566
+ (§`data/astro/SOURCES.md`) and the two agree on every other region.
567
+ - **Coverage:** complete. Every region carries all six locales. French translates most of
568
+ the regions; German, Spanish, Portuguese and Russian translate few and otherwise carry
569
+ the English name, which is the game's own value and not a fallback this project
570
+ manufactured. Izanami, Temple, Mare Somnia, Xibalba and Tenebrae are spelled alike in
571
+ all six, so those are proper nouns the game leaves alone.
572
+ - **Some differences look like defects and are the source's own values.** A locale that
573
+ carries the English name does not always carry it byte for byte:
574
+ - **The possessive apostrophe is mixed.** Newton's Vault, Aquila's Halo, Lyra's Song and
575
+ Kepler's Crest carry `U+2019` in German, Spanish, Portuguese and Russian, against the
576
+ English `U+0027`. This is the position `suit-descriptions.jsonc` already records for
577
+ its own mixed apostrophes.
578
+ - **Achilles's Altar differs by the possessive as well as the glyph.** German, Spanish,
579
+ Portuguese and Russian carry `Achilles’ Altar` — `U+2019` and no trailing `s` —
580
+ against the English `Achilles's Altar`.
581
+ - **Russian carries `Ori-Cygnus Arm` for Orion-Cygnus Arm.** It is the game's string,
582
+ and nothing here expands it.
583
+ A fixture pins one of each, so normalising them fails a test rather than changing the
584
+ data quietly.
585
+ - **The acquired table's region grid is not stored, because this repository already has
586
+ it.** The table carries a run-length region raster and a per-region border polygon
587
+ beside the names. The raster reproduces `data/astro/galactic-region-cells.jsonc`
588
+ cell for cell — the same region ids over the same 2048-by-2048 grid, with the same
589
+ projection — and the borders are that raster's own outline, traced on cell edges and
590
+ quantised to 1/32 light year against the cells' 1/64. Neither carries a fact the cells
591
+ do not, so importing either would be a second copy of one geometry. Re-deriving this
592
+ catalogue must take the names alone.
593
+ - **The `$Codex_RegionName_<id>;` keys are not stored, and that is a decision rather than
594
+ a gap.** The key states the region id inside its own name, so a journal `CodexEntry`
595
+ yields the id by reading the number out of the key. A key column would restate what the
596
+ key already carries, and would have to be re-derived every time this catalogue is.
597
+ Storing the id alone is the smaller record.
598
+ - **Manual corrections:** none. Every value is stored verbatim.
599
+
536
600
  ## Names this repository deliberately does not localize
537
601
 
538
602
  No catalogues are stored for the following names, either because the game does not
@@ -1476,7 +1476,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1476
1476
  `special_plasma_slug` is the id the game writes. This repo follows EDSY: one
1477
1477
  `special_plasma_slug` at damage −10% / ammo −100%, plus the `_cooled` rail-gun variant.
1478
1478
 
1479
- - **Files:** `blueprints.jsonc` (per-blueprint, per-grade stat modifiers),
1479
+ - **Files:** `blueprints.jsonc` (identity, display text and measured per-grade stat modifiers),
1480
1480
  `blueprint-costs.jsonc` (the matching per-grade material requirements),
1481
1481
  `blueprint-merc-coin-costs.jsonc` (the per-roll Merc-Coin amounts the recipes that
1482
1482
  charge a currency bill alongside those materials),
@@ -1585,9 +1585,30 @@ up straight through with no disambiguation at all. Both paths are evidence that
1585
1585
  record of the same recipe is rejected: it is a copy that can drift from the one the
1586
1586
  game names, no observed journal, SLEF export or corpus build carries a prefixed id
1587
1587
  (see above), and nothing else in this catalogue keys one recipe twice.
1588
-
1589
- The registry exposes **one displayed total per grade**, not a roll-bounded range, so each
1590
- feature stores that total as a fixed value (`min == max`).
1588
+ - **Direct in-game observation supplies Mercenary weapon recipes.** It supplies the
1589
+ identities, names, grade roll bounds, materials, and Merc-Coin costs for
1590
+ `BeamLaser_Overloaded`, `BurstLaser_Regenerative`, `Cannon_ForceImpact`, and
1591
+ `SeekerMissileRackLarge_ExposingMissiles`. The observations were acquired
1592
+ 2026-09-13 UTC. The stored decimals remove binary floating-point noise.
1593
+ - **Direct in-game observation also supplies selected existing recipe mechanics.** It
1594
+ supplies the grade bounds for `MultiCannon_Rapid`, `SeekerMissileRack_Drag`, both
1595
+ `SeekerMissileRack*_Lockdown` recipes, and the named ordinary recipes in the same
1596
+ observation. `Sensor_Expanded` includes its power-draw leg. The stored weapon rate
1597
+ derives from the observed burst interval. The observations were acquired
1598
+ 2026-09-13 UTC.
1599
+ - **The large Double Screaming Fragment Cannon grade-5 result is observed directly.**
1600
+ The observation was acquired 2026-09-14 UTC. Its rate is 7.439685 shots per second.
1601
+ Its damage rate is 336.571350 per second. Its range is 1849.624023 metres. These values
1602
+ give the stored `RateOfFire` and `Range` multipliers. Screening Shell supplies the only Reload Time
1603
+ reduction for both Double Screaming recipes. The effect keeps the grade-5 reload at
1604
+ 2.5 seconds, so these recipes contain no separate Reload Time feature.
1605
+ - **The two Lockdown recipes have different Merc-Coin costs.** The medium recipe costs
1606
+ 10, 10, 20, and 40 Merc Coin per roll at grades 2–5. The large recipe costs 10, 15,
1607
+ 25, and 45. Direct in-game observation supplies both sets.
1608
+
1609
+ Where only the registry supplies a recipe, it exposes **one displayed total per grade**.
1610
+ Each such feature stores that total as a fixed value (`min == max`). Direct in-game
1611
+ observations store the observed roll bounds.
1591
1612
  The three Plasma conversion recipes also expose equal and opposite damage-share totals.
1592
1613
  Inara labels those player-facing rows **Thermal** and **Plasma**, not with journal
1593
1614
  modifier labels: Thermal decreases by 3.9, 6.6, 9.4, 12.4 and 15.5 percentage points
@@ -1622,11 +1643,10 @@ up straight through with no disambiguation at all. Both paths are evidence that
1622
1643
  each grade by its roll count.
1623
1644
  - **A minority of recipes charge one.** Inara's blueprint
1624
1645
  index marks a charging recipe by rendering its name in the coin colour, and the marked
1625
- set is exactly the bespoke grade-2–5 recipes a bought Mercenary article climbs plus the
1626
- four Operations recipes an ordinary menu lists at grades 1–5 (`FuelScoop_Efficiency`
1627
- and the three `*Laser_ThermalPlasmaConversion`) 18 marked rows of the 197 the index
1628
- lists, fewer than the ids they price because one published recipe can answer to more
1629
- than one stored id. An ordinary engineer recipe is therefore **absent rather than
1646
+ set is the bespoke grade-2–5 recipes a bought Mercenary article climbs plus the
1647
+ Operations recipes an ordinary menu lists at grades 1–5 (`FuelScoop_Efficiency`
1648
+ and the `*Laser_ThermalPlasmaConversion` recipes). One published recipe can answer to
1649
+ more than one stored id. An ordinary engineer recipe is therefore **absent rather than
1630
1650
  zero**, and `GuardianModule_Sturdy`
1631
1651
  is absent for the same reason. That index is the whole evidence for the negative half
1632
1652
  of the claim: it is a completeness reading of one listing, not 197 pages checked one
@@ -2110,53 +2130,42 @@ base module's name: the Mining Laser and the size-5 Frame Shift Drive.
2110
2130
  - **`acquisition` says where each remaining variant comes from** — `mercenary`,
2111
2131
  `communityGoal` or `techBroker`.
2112
2132
  - **`mercenary`** — the Merc-Coin shop rows. Source: the in-game outfitting and
2113
- blueprint registries, cross-checked against Inara's outfitting and blueprint registries
2114
- acquired 2026-08-07 UTC (no immutable revision exposed) and Frontier's update notes.
2115
- Every one is grade 1, and that is the point: the
2133
+ blueprint panels observed by the repository owner on 2026-09-13 UTC. Every one is
2134
+ grade 1, and that is the point: the
2116
2135
  purchased module already
2117
2136
  contains the grade-1 pre-engineering, which is exactly why these blueprints' own
2118
2137
  recipes start at grade 2 (see the Operations section above). The two facts are
2119
2138
  consistent by construction: material costs for further engineering begin at grade 2.
2120
2139
  - **The large Seeker Missile Rack's Lockdown** is a `mercenary` row on
2121
- `Hpt_BasicMissileRack_Fixed_Large` at **900 MC**, taking the shop total to 13 900 MC.
2122
- Four things agree, none of them a guess about a module symbol: the registry keys
2123
- Lockdown by _size_ and the twin `SeekerMissileRackMedium_Lockdown` binds to the medium
2124
- rack; the large rack is already a Merc row for `SeekerMissileRack_Drag`, so the shop
2125
- stocks it; both Lockdown recipes run grades 2–5, the weapon-reward range that marks a
2126
- module as bought pre-engineered; and it is the only grade-2–5 Operations recipe in the
2127
- file
2128
- that would otherwise have no row, every other one having one. Price and size confirmed
2129
- 2026-08-07 UTC against an index of the Inara outfitting listing, which
2130
- reports the MERC Lockdown Seeker Missile Rack [Fixed] at 900 MC for the 3A and 800 MC
2131
- for the 2B. This is an index reading rather than a pinned page capture. Both halves check
2132
- against rows already here the large rack is 3A and its other Merc row is 900 MC, the
2133
- medium is 2B and its Lockdown row is 800 MC — and that corroboration is what carries
2134
- the weight.
2140
+ `Hpt_BasicMissileRack_Fixed_Large` at **900 MC**. Direct observation supplies its
2141
+ size, price and fixed transformation.
2142
+ - **These shop articles come from direct in-game observation.** The observations were
2143
+ acquired 2026-09-13 UTC. The observed panels supply each Mercenary row's
2144
+ grade-1 fixed transformation. The burst laser's stated damage includes Regeneration
2145
+ Sequence. Its fixed Damage change is therefore +4%, which composes with the effect's
2146
+ −10% to give the observed −6.4%. Force Shell supplies the cannon's −16.7% Shot Speed
2147
+ change. Feedback Cascade supplies the rail gun's Damage and Thermal Load reductions.
2148
+ Screening Shell supplies both fragment cannons' Reload Time reduction. Incendiary
2149
+ Rounds supplies part of the mining laser's Thermal Load increase. FSD Interrupt
2150
+ supplies part of both Lockdown racks' Damage and Rate of Fire reductions. The
2151
+ cannon's fixed damage split is equal parts Kinetic and Explosive. Both cargo racks
2152
+ carry the exact multiplier implied by their observed capacities.
2153
+ Mercenary hardpoints keep the experimental state supplied by the shop. An engineer
2154
+ cannot add, remove or replace their effect. Direct observation acquired 2026-09-14 UTC
2155
+ supplies this rule.
2156
+ - **The large Double Screaming Fragment Cannon uses its exact observed firing rate.**
2157
+ Its grade-1 rate is 2.166787 shots per second. The fixed transformation stores the
2158
+ multiplier that reproduces this rate from the stock firing cycle.
2135
2159
  - **Some Merc rows carry a default experimental effect** applied beside the grade-1
2136
2160
  blueprint, recorded as `experimentalEffectSymbol`: Screening Shell on both Double
2137
2161
  Screaming Fragment Cannons, Incendiary Rounds on the Long Range Mining Laser,
2138
2162
  Phasing Sequence on the Rapid Phase Multi-Cannon, Feedback Cascade on the Enduring
2139
- Feedback Rail Gun, Drag Munitions on both Drag Seeker Missile Racks, Thermal Cascade
2140
- on the Lightweight Thermal Seeker Missile Rack, and FSD Interrupt on both Lockdown
2141
- Seeker Missile Racks. Source: repository-owner in-game observation, recorded
2142
- 2026-08-29 UTC; no registry publishes them. These rows still carry no `modifiers`:
2143
- the effect is recorded, the unpublished grade-1 blueprint transformation is not.
2144
- - **Two independent checks each corroborate all but one, and between them cover
2145
- every row.** The first: the effect is one the stock module's own experimental menu
2146
- offers, so the shop is baking in an effect the module can carry
2147
- (`engineering-options.jsonc`). That covers every row but the Mining Laser, whose
2148
- base module offers no experimental effect at all. The second: the same base module
2149
- already carries the same effect on a catalogued community-goal or tech-broker
2150
- variant. That covers every row but the large Drag Seeker Missile Rack, whose
2151
- corroboration is its medium twin rather than a variant of its own symbol.
2152
- - **The mining laser is the weakest of them.** Incendiary Rounds is outside
2153
- `Hpt_MiningLaser_Fixed_Small`'s experimental menu — it is the only row a shop menu
2154
- could not have offered — so only the twin check speaks for it, and a twin is
2155
- consistency more than evidence. It is recorded because it was observed. The
2156
- blueprint names of the seeker racks and the rail gun do echo their effects
2157
- (`SeekerMissileRack*_Lockdown`, `_LightWeightThermal`, `_Drag`, "Enduring
2158
- Feedback"), but a name is weaker evidence than either check above, and no row
2159
- rests on one.
2163
+ Feedback Rail Gun, Drag Munitions on the Drag Seeker Missile Rack and Exposing
2164
+ Missiles, Thermal Cascade on the Lightweight Thermal Seeker Missile Rack, FSD
2165
+ Interrupt on both Lockdown Seeker Missile Racks, Regeneration Sequence on the
2166
+ Regenerative Burst Laser, and Force Shell on the Force Impact Cannon. Source:
2167
+ repository-owner in-game observation. Every row carries
2168
+ its observed grade-1 transformation in `modifiers`.
2160
2169
  - **`communityGoal`** — modules awarded for taking part in a community goal. Source:
2161
2170
  EDSY's stored-module presets, which record each reward as an encoded module state; the
2162
2171
  blueprint, grade and experimental effect were
@@ -2201,16 +2210,14 @@ base module's name: the Mining Laser and the size-5 Frame Shift Drive.
2201
2210
  Merc Coin is a separate currency with no credit equivalent, which is why it is its own
2202
2211
  field rather than the `cost` modules carry. Tech-broker unlocks have no equivalent
2203
2212
  number: they are paid in materials and commodities, so nothing is stored for them.
2204
- - **`modifiers` is the hand-set stat block a reward variant arrives with** — what makes
2213
+ - **`modifiers` is the hand-set stat block a fixed variant arrives with** — what makes
2205
2214
  these records fittable rather than merely catalogued. Same vocabulary as a blueprint
2206
2215
  feature: a journal Modifier `label`, a `method` (`multiplicative` / `additive` /
2207
2216
  `overwrite`) and a `value`. Decoded from the same EDSY preset state as the blueprint
2208
2217
  and grade, then translated into the Almanac's own vocabulary — EDSY's attribute names
2209
2218
  map to journal Modifier Labels through its own table, and resistances, which EDSY
2210
2219
  stores in a different form from this repo, are converted using the module's base
2211
- resistance. Every row carries one except the `mercenary` rows, because no registry
2212
- publishes the grade-1 pre-engineering they arrive with and a guess is worse than an
2213
- omission.
2220
+ resistance. Each Mercenary row carries its observed grade-1 transformation.
2214
2221
  - **Values are the authored decimals, recovered rather than rounded.** The presets
2215
2222
  encode modifiers in EDSY's custom 20-bit float (1 sign, 5 exponent, 14 mantissa),
2216
2223
  which carries about fifteen significant bits — so decoding a change the game states
package/README.md CHANGED
@@ -49,7 +49,7 @@ The package has six feature areas:
49
49
  bodies with their physics;
50
50
  - `ships`: ships, modules, SLEF loadouts, engineering and build metrics;
51
51
  - `equipment`: Odyssey suits, handheld weapons and their damage per second, suit tools,
52
- grade upgrades and modifications;
52
+ grade upgrades, modifications and journal suit loadouts;
53
53
  - `i18n`: sparse localized catalogue names, descriptions, slot labels and structured
54
54
  diagnostic messages;
55
55
  - `materials`: ship engineering materials and Odyssey micro resources;
@@ -247,8 +247,10 @@ blueprints and experimental effects are keyed by theirs; neither place invents a
247
247
  synthetic id. The journal omits the technology suffix from three weapon modification
248
248
  families, so `resolvePersonalModificationForWeapon` resolves those spellings against the
249
249
  weapon before joining to `PERSONAL_MODIFICATIONS` or `PERSONAL_MODIFICATION_COSTS`.
250
- Material shopping lists live on the separate `equipment/modification-costs` subpath and
251
- consume the
250
+ `parseSuitLoadout` reads a journal `SuitLoadout`, `SwitchSuitLoadout` or
251
+ `CreateSuitLoadout` event into the suit, its grade, its modifications and the weapon at
252
+ each mount, and resolves those spellings on the way. Material shopping lists live on the
253
+ separate `equipment/modification-costs` subpath and consume the
252
254
  micro-resource symbols from the `materials` feature area. Suit tools are the one
253
255
  personal-equipment record with no Frontier symbol — the journal never names a tool — so
254
256
  `PersonalTool.id` is a library key such as `arc-cutter`, and `getPersonalToolName` takes
@@ -277,8 +279,8 @@ that same id.
277
279
 
278
280
  The [repository README](https://github.com/DarkSession/Elite-Dangerous-Almanac#readme)
279
281
  contains the project guide. The generated
280
- [GitHub Wiki](https://github.com/DarkSession/Elite-Dangerous-Almanac/wiki) contains the
281
- complete API reference.
282
+ [TypeScript wiki](https://github.com/DarkSession/Elite-Dangerous-Almanac/wiki/TypeScript)
283
+ contains the guides and the complete API reference.
282
284
 
283
285
  ## Data and credits
284
286
 
@@ -167,7 +167,8 @@ a verbatim copy produced at build time — edit this file, never the copy.
167
167
  Frontier's own **in-game localisation** supplies the outfitting category labels behind
168
168
  the module families and their German, Spanish, French, Brazilian Portuguese and Russian
169
169
  display text, the engineering modification names in the six stored locales, the market
170
- commodity names in `data/i18n/commodity-names.jsonc`, and the personal-equipment
170
+ commodity names in `data/i18n/commodity-names.jsonc`, the galactic codex region names
171
+ in `data/i18n/codex-region-names.jsonc`, and the personal-equipment
171
172
  display text in `data/i18n/`: the suit names and descriptions, the suit tool names, the
172
173
  handheld-weapon descriptions, and the names and descriptions of the engineer-applied
173
174
  suit and weapon modifications. The game's own **commodity registry** supplies the