@elite-dangerous-almanac/core 0.2.11 → 0.2.13

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 (116) 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 +119 -67
  5. package/README.md +2 -2
  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-OSMBAFRW.js → chunk-2GVJNKFW.js} +1 -1
  12. package/dist/{chunk-OSMBAFRW.js.map → chunk-2GVJNKFW.js.map} +1 -1
  13. package/dist/{chunk-Q5ALV3DI.js → chunk-3I2I5KG4.js} +1 -1
  14. package/dist/chunk-55R4MYWV.js +1 -0
  15. package/dist/chunk-55R4MYWV.js.map +1 -0
  16. package/dist/{chunk-2TY42PTF.js → chunk-6MQOPQAA.js} +1 -1
  17. package/dist/{chunk-RA6SY445.js → chunk-7UF4XRIR.js} +1 -1
  18. package/dist/{chunk-K5JK3XQB.js → chunk-ARG6ESYB.js} +1 -1
  19. package/dist/{chunk-K5JK3XQB.js.map → chunk-ARG6ESYB.js.map} +1 -1
  20. package/dist/{chunk-ADLVPKUV.js → chunk-ATD32GCX.js} +1 -1
  21. package/dist/{chunk-ADLVPKUV.js.map → chunk-ATD32GCX.js.map} +1 -1
  22. package/dist/{chunk-UVX7RCMP.js → chunk-BI3EFLQ7.js} +1 -1
  23. package/dist/{chunk-SFEQXUIA.js → chunk-CCJPWDMA.js} +1 -1
  24. package/dist/chunk-EXHZ4CFB.js +1 -0
  25. package/dist/{chunk-AUBV6S7V.js.map → chunk-EXHZ4CFB.js.map} +1 -1
  26. package/dist/chunk-FRG7MKSJ.js +1 -0
  27. package/dist/{chunk-T7IQHFQ2.js.map → chunk-FRG7MKSJ.js.map} +1 -1
  28. package/dist/chunk-HE4XE3WR.js +1 -0
  29. package/dist/chunk-HE4XE3WR.js.map +1 -0
  30. package/dist/{chunk-XQJERZUS.js → chunk-HWOP7QWK.js} +1 -1
  31. package/dist/{chunk-ZWT5Y3JR.js → chunk-JEHKGTP2.js} +1 -1
  32. package/dist/chunk-JEHKGTP2.js.map +1 -0
  33. package/dist/chunk-KLC5XT6F.js +1 -0
  34. package/dist/chunk-KLC5XT6F.js.map +1 -0
  35. package/dist/chunk-KR664YI3.js +1 -0
  36. package/dist/{chunk-UI5RROGI.js.map → chunk-KR664YI3.js.map} +1 -1
  37. package/dist/{chunk-Q647OXON.js → chunk-LOWKWUNS.js} +1 -1
  38. package/dist/{chunk-Q647OXON.js.map → chunk-LOWKWUNS.js.map} +1 -1
  39. package/dist/chunk-O4NIJDL4.js +1 -0
  40. package/dist/chunk-O4NIJDL4.js.map +1 -0
  41. package/dist/{chunk-4T3TTYUT.js → chunk-P3DGQUID.js} +1 -1
  42. package/dist/{chunk-4T3TTYUT.js.map → chunk-P3DGQUID.js.map} +1 -1
  43. package/dist/{chunk-F44QX47A.js → chunk-Q75JSMU6.js} +1 -1
  44. package/dist/{chunk-F44QX47A.js.map → chunk-Q75JSMU6.js.map} +1 -1
  45. package/dist/chunk-QQFZEOPB.js +1 -0
  46. package/dist/chunk-QQFZEOPB.js.map +1 -0
  47. package/dist/{chunk-DBJKLXLS.js → chunk-SRPCHXW2.js} +1 -1
  48. package/dist/{chunk-3GNYPM6J.js → chunk-T6BIFKPU.js} +1 -1
  49. package/dist/{chunk-3GNYPM6J.js.map → chunk-T6BIFKPU.js.map} +1 -1
  50. package/dist/chunk-WDAYRHXR.js +1 -0
  51. package/dist/{chunk-AYAKU4YA.js.map → chunk-WDAYRHXR.js.map} +1 -1
  52. package/dist/chunk-ZBB7Q3OZ.js +1 -0
  53. package/dist/chunk-ZBB7Q3OZ.js.map +1 -0
  54. package/dist/commodities/commodities-all.js +1 -1
  55. package/dist/commodities/commodities-standard.d.ts +1 -1
  56. package/dist/commodities/commodities-standard.js +1 -1
  57. package/dist/commodities/commodities.js +1 -1
  58. package/dist/commodities/index.js +1 -1
  59. package/dist/i18n/blueprints.js +1 -1
  60. package/dist/i18n/codex-regions.d.ts +33 -0
  61. package/dist/i18n/codex-regions.js +1 -0
  62. package/dist/i18n/codex-regions.js.map +1 -0
  63. package/dist/i18n/index.d.ts +10 -8
  64. package/dist/i18n/index.js +1 -1
  65. package/dist/i18n/pre-engineered.d.ts +4 -0
  66. package/dist/i18n/pre-engineered.js +1 -1
  67. package/dist/materials/index.js +1 -1
  68. package/dist/materials/micro-resources-all.js +1 -1
  69. package/dist/materials/micro-resources.js +1 -1
  70. package/dist/ships/armour.js +1 -1
  71. package/dist/ships/blueprint-costs.js +1 -1
  72. package/dist/ships/blueprints.d.ts +1 -2
  73. package/dist/ships/blueprints.js +1 -1
  74. package/dist/ships/build-metrics.js +1 -1
  75. package/dist/ships/index.js +1 -1
  76. package/dist/ships/loadout-validation.d.ts +1 -1
  77. package/dist/ships/loadout-validation.js +1 -1
  78. package/dist/ships/modules-all.js +1 -1
  79. package/dist/ships/modules-hardpoint.js +1 -1
  80. package/dist/ships/modules.d.ts +26 -13
  81. package/dist/ships/modules.js +1 -1
  82. package/dist/ships/pre-engineered-stats.d.ts +5 -9
  83. package/dist/ships/pre-engineered-stats.js +1 -1
  84. package/dist/ships/pre-engineered.d.ts +12 -6
  85. package/dist/ships/pre-engineered.js +1 -1
  86. package/dist/ships/resistances.d.ts +3 -2
  87. package/dist/ships/resistances.js +1 -1
  88. package/dist/ships/shield-capacitor.js +1 -1
  89. package/dist/ships/shields.js +1 -1
  90. package/dist/ships/ship-loadout.d.ts +16 -18
  91. package/dist/ships/ship-loadout.js +1 -1
  92. package/dist/ships/weapons.d.ts +2 -0
  93. package/dist/ships/weapons.js +1 -1
  94. package/package.json +10 -5
  95. package/dist/chunk-4WC5NHBJ.js +0 -1
  96. package/dist/chunk-4WC5NHBJ.js.map +0 -1
  97. package/dist/chunk-53EBUFVU.js +0 -1
  98. package/dist/chunk-53EBUFVU.js.map +0 -1
  99. package/dist/chunk-A6QTYK2D.js +0 -1
  100. package/dist/chunk-A6QTYK2D.js.map +0 -1
  101. package/dist/chunk-AAU7OM47.js +0 -1
  102. package/dist/chunk-AAU7OM47.js.map +0 -1
  103. package/dist/chunk-AUBV6S7V.js +0 -1
  104. package/dist/chunk-AYAKU4YA.js +0 -1
  105. package/dist/chunk-C3YZ5KTA.js +0 -1
  106. package/dist/chunk-C3YZ5KTA.js.map +0 -1
  107. package/dist/chunk-T7IQHFQ2.js +0 -1
  108. package/dist/chunk-UI5RROGI.js +0 -1
  109. package/dist/chunk-ZWT5Y3JR.js.map +0 -1
  110. /package/dist/{chunk-Q5ALV3DI.js.map → chunk-3I2I5KG4.js.map} +0 -0
  111. /package/dist/{chunk-2TY42PTF.js.map → chunk-6MQOPQAA.js.map} +0 -0
  112. /package/dist/{chunk-RA6SY445.js.map → chunk-7UF4XRIR.js.map} +0 -0
  113. /package/dist/{chunk-UVX7RCMP.js.map → chunk-BI3EFLQ7.js.map} +0 -0
  114. /package/dist/{chunk-SFEQXUIA.js.map → chunk-CCJPWDMA.js.map} +0 -0
  115. /package/dist/{chunk-XQJERZUS.js.map → chunk-HWOP7QWK.js.map} +0 -0
  116. /package/dist/{chunk-DBJKLXLS.js.map → chunk-SRPCHXW2.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
@@ -18,6 +18,7 @@ Referred to throughout by source name; the pin is here, once.
18
18
  | Elite Dangerous in-game verification | game version `4.4.0.3`; direct in-game observation | 2026-08-14 UTC |
19
19
  | Elite Dangerous in-game purchase capture | no game version recorded; nine `ModuleBuyAndStore` journal entries from market `128666762`, 17:34-17:37, at a 10% and a 2.5% outfitting discount | 2026-08-30 UTC |
20
20
  | Elite Dangerous in-game outfitting observation | no game version recorded; direct in-game observation that outfitting offers no non-SCO size-8 frame shift drive | 2026-08-30 UTC |
21
+ | Elite Dangerous in-game SCO outfitting observation | no game version recorded; direct in-game observation that outfitting offers no SCO frame shift drive below the size of the mount being outfitted | 2026-09-17 UTC |
21
22
  | Elite Dangerous Large Planetary Vehicle Hangar readings | **unreleased** — observation of the modules an unreleased update adds, plus outfitting and journal `ModuleBuy` readings at a 10% and 2.5% discount | 2026-09-02 UTC |
22
23
 
23
24
  Every `eddb.js` derivation uses the baseline snapshot unless its catalogue note names
@@ -434,17 +435,29 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
434
435
  in the symbol and the display name.
435
436
  - **Derivation:** the symbol family is the classification, exactly as it is for `slot`
436
437
  above, and it is applied once here so that consumers read a datum instead of
437
- matching `Int_Hyperdrive_Overcharge` themselves which a pre-engineered or fitted
438
- article's symbol does not always let them do. Stored as a sparse flag rather than a
439
- `true`/`false` pair on every drive, following `alwaysPowered` and
440
- `guardianZoneResistance`.
441
- - **Nothing else is derived from it.** The two lines share every jump constant this
442
- catalogue carries (`optMass`, `maxFuel`, `fuelMul`, `fuelPower`, and the
443
- `fsdHeatRate`, which is a function of a drive's size alone — 10, 14, 18, 27, 37, 43
444
- and 50 for sizes 2 to 8, identical on the plain and SCO lines at every size), so no
445
- calculation reads the flag; the
446
- overcharged supercruise behaviour the drives are named for has no published figures
447
- and none are stored.
438
+ matching `Int_Hyperdrive_Overcharge` themselves. Every record carrying the flag has
439
+ `Overcharge` in its symbol today and no other record does, so the two agree; stating
440
+ the capability keeps that agreement from being something a consumer has to rely on.
441
+ Stored as a sparse flag rather than a `true`/`false` pair on every drive, following
442
+ `alwaysPowered` and `guardianZoneResistance`.
443
+ - **The two lines share every jump constant this catalogue carries** `optMass`,
444
+ `maxFuel`, `fuelMul`, `fuelPower`, and the `fsdHeatRate`, which is a function of a
445
+ drive's size alone: 10, 14, 18, 27, 37, 43 and 50 for sizes 2 to 8, and where both
446
+ lines offer a size they state the same value. The overcharged supercruise behaviour
447
+ the drives are named for has no published figures and none are stored. The plain line
448
+ runs from size 2 to 7 and the SCO line from 2 to 8, so size 8 is stated on the SCO
449
+ line alone.
450
+ - **An SCO drive is sold only at the size of the mount being outfitted.** Outfitting
451
+ offers a class-4 SCO drive for a class-4 frame shift drive mount and not for a
452
+ class-5 one, where it does offer a class-4 plain drive — an SCO drive cannot be
453
+ underfitted.
454
+ - **Source:** Elite Dangerous in-game SCO outfitting observation, pinned above.
455
+ - **Derivation:** none; the observation is recorded as stated. No catalogue field
456
+ carries it — the drives are exactly the records `supercruiseOvercharge` already
457
+ marks, and every one of them states a `class` matching the `Size` token in its
458
+ symbol, so the flag and the class are together sufficient to state the rule.
459
+ Neither registry source carries a field stating such a restriction, so the
460
+ observation is the only evidence for it.
448
461
  - **`cabinCapacity` — a passenger cabin's berths.** The `passengerCabins` records
449
462
  carry it; every other record in all four catalogues omits it, and no cabin carries a
450
463
  zero. It is the module's own seat count, not the ship's.
@@ -732,10 +745,11 @@ the armour modules, blueprint grade rolls and crafting costs remain unverified t
732
745
  It also did not unambiguously settle the shield-generator resistances, shield-booster
733
746
  properties or probe radius. Those values are not changed on guesswork. For the
734
747
  anti-xeno, Guardian and special weapons whose damage observed in-game does not reduce honestly
735
- to one conventional scalar, `damageComponents` preserves the exact amounts. The two
736
- channel types not established by in-game verification remain `unclassified`. The
737
- projectile-limited hardpoints carry their boundary parameters observed in-game in
738
- `projectileRange`; those parameters are not presented as effective ranges.
748
+ to one conventional scalar, `damageComponents` preserves the exact amounts. It read the
749
+ Enzyme Missile Rack's two channels as amounts without settling the minor one's type; that
750
+ type is caustic, and the note below records the correction. The projectile-limited
751
+ hardpoints carry their boundary parameters observed in-game in `projectileRange`; those
752
+ parameters are not presented as effective ranges.
739
753
 
740
754
  **A journal capture is a third source, and it reaches fields in-game verification does
741
755
  not.** Every engineered module in a `Loadout` states its own _unmodified_ value beside
@@ -847,7 +861,7 @@ Resource Siphon, the corrections are:
847
861
  | Beam Laser, Cannon, Fragment Cannon, Multi-Cannon, Plasma Accelerator, Rail Gun, Shock Cannon and Point Defence records | damage / thermal load | `damage` and `thermalLoad` read from the module panel per symbol |
848
862
  | Advanced Plasma Accelerator, Imperial Hammer, Shock Cannons and Mk II Plasma Shock Accelerator | burst interval / combined rate of fire | exact cycle values derived with the catalogue's documented formula |
849
863
  | mining, utility and Guardian hardpoints | clip, distributor draw, reload, jitter, falloff and maximum range | observed values per symbol |
850
- | anti-xeno, Guardian and special weapons | scalar, distribution and exact damage components | one component record per weapon |
864
+ | anti-xeno, Guardian and special weapons | scalar, distribution and exact damage components | a component record wherever the damage needs more than a share |
851
865
  | AX missiles, subsurface displacement missiles and seismic charge launchers | projectile boundary parameters; misleading ordinary ranges absent | `projectileRange` stored; `maximumRange` and `falloffRange` absent |
852
866
 
853
867
  In-game verification gives the integer thruster/FSD masses, 1.1/1.2 enhanced-thruster
@@ -879,6 +893,37 @@ EDSY's 40 / 70. The catalogue stores the displayed values without further deriva
879
893
  applies the same correction to their exact thermal and anti-xeno components. The two
880
894
  panel readings have no upstream immutable revision.
881
895
 
896
+ **The Mk II Plasma Shock Accelerator's damage type is Plasma, and it is stored as
897
+ `absolute`.** Plasma is a type of its own, not a second name for absolute damage, and the
898
+ stored share is not a claim that Frontier calls the channel absolute. What the two types
899
+ share is the only property a damage calculation reads from either: nothing resists them.
900
+ No shield generator, armour or hull reinforcement carries a Plasma resistance any more
901
+ than it carries an absolute one, so the whole of this weapon's output lands whatever the
902
+ target has fitted, and a share stored as `absolute` computes its effect exactly. The same
903
+ reading already stores the Operations Plasma conversion's Plasma share as `absolute`,
904
+ under "Engineering (blueprints and experimental effects)" below. What the storage costs is
905
+ the distinction itself, which is why it is written down here: should Frontier ever give a
906
+ defensive module a Plasma resistance, the two types stop agreeing, and this weapon and
907
+ that blueprint are the records to revisit.
908
+
909
+ Its `damageComponents` record goes with the `unclassified` spelling it replaces.
910
+ `damageComponents` preserves amounts a fractional split cannot state honestly — an
911
+ anti-xeno overlay, or a channel whose type is not established — and one conventional type
912
+ at the full scalar is neither.
913
+
914
+ **The Enzyme Missile Rack's minor damage channel is Caustic.** Of the 5 damage its round
915
+ carries, 4 are explosive and 1 is caustic. The amounts are what in-game verification
916
+ established; the minor channel's type it did not, and the share was stored as
917
+ `unclassified` for exactly as long as that was the whole of what was known. The type is
918
+ caustic, and the catalogue's own vocabulary says so twice over: Frontier's symbol for the
919
+ weapon is `Hpt_CausticMissile_Fixed_Medium`, and the enzyme it delivers is the damage the
920
+ Caustic Sink Launcher exists to shed. This is not the Mk II's situation above. Caustic is
921
+ a type the defensive side of the catalogue already names — `causticResistance` on the
922
+ armour and hull reinforcement records meets it, and it is one of the four resistances a build carries —
923
+ so the spelling decides whether a defender's caustic resistance reaches this weapon's
924
+ minor channel at all. `unclassified` would have kept it out of that arithmetic on a point
925
+ the game does settle.
926
+
882
927
  **Values that look wrong and are not.** Three records break the pattern their family
883
928
  follows and are confirmed outright by EDSY. Recorded so the "breaks its family's curve"
884
929
  heuristic does not keep rediscovering them:
@@ -1476,7 +1521,7 @@ up straight through with no disambiguation at all. Both paths are evidence that
1476
1521
  `special_plasma_slug` is the id the game writes. This repo follows EDSY: one
1477
1522
  `special_plasma_slug` at damage −10% / ammo −100%, plus the `_cooled` rail-gun variant.
1478
1523
 
1479
- - **Files:** `blueprints.jsonc` (per-blueprint, per-grade stat modifiers),
1524
+ - **Files:** `blueprints.jsonc` (identity, display text and measured per-grade stat modifiers),
1480
1525
  `blueprint-costs.jsonc` (the matching per-grade material requirements),
1481
1526
  `blueprint-merc-coin-costs.jsonc` (the per-roll Merc-Coin amounts the recipes that
1482
1527
  charge a currency bill alongside those materials),
@@ -1585,9 +1630,30 @@ up straight through with no disambiguation at all. Both paths are evidence that
1585
1630
  record of the same recipe is rejected: it is a copy that can drift from the one the
1586
1631
  game names, no observed journal, SLEF export or corpus build carries a prefixed id
1587
1632
  (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`).
1633
+ - **Direct in-game observation supplies Mercenary weapon recipes.** It supplies the
1634
+ identities, names, grade roll bounds, materials, and Merc-Coin costs for
1635
+ `BeamLaser_Overloaded`, `BurstLaser_Regenerative`, `Cannon_ForceImpact`, and
1636
+ `SeekerMissileRackLarge_ExposingMissiles`. The observations were acquired
1637
+ 2026-09-13 UTC. The stored decimals remove binary floating-point noise.
1638
+ - **Direct in-game observation also supplies selected existing recipe mechanics.** It
1639
+ supplies the grade bounds for `MultiCannon_Rapid`, `SeekerMissileRack_Drag`, both
1640
+ `SeekerMissileRack*_Lockdown` recipes, and the named ordinary recipes in the same
1641
+ observation. `Sensor_Expanded` includes its power-draw leg. The stored weapon rate
1642
+ derives from the observed burst interval. The observations were acquired
1643
+ 2026-09-13 UTC.
1644
+ - **The large Double Screaming Fragment Cannon grade-5 result is observed directly.**
1645
+ The observation was acquired 2026-09-14 UTC. Its rate is 7.439685 shots per second.
1646
+ Its damage rate is 336.571350 per second. Its range is 1849.624023 metres. These values
1647
+ give the stored `RateOfFire` and `Range` multipliers. Screening Shell supplies the only Reload Time
1648
+ reduction for both Double Screaming recipes. The effect keeps the grade-5 reload at
1649
+ 2.5 seconds, so these recipes contain no separate Reload Time feature.
1650
+ - **The two Lockdown recipes have different Merc-Coin costs.** The medium recipe costs
1651
+ 10, 10, 20, and 40 Merc Coin per roll at grades 2–5. The large recipe costs 10, 15,
1652
+ 25, and 45. Direct in-game observation supplies both sets.
1653
+
1654
+ Where only the registry supplies a recipe, it exposes **one displayed total per grade**.
1655
+ Each such feature stores that total as a fixed value (`min == max`). Direct in-game
1656
+ observations store the observed roll bounds.
1591
1657
  The three Plasma conversion recipes also expose equal and opposite damage-share totals.
1592
1658
  Inara labels those player-facing rows **Thermal** and **Plasma**, not with journal
1593
1659
  modifier labels: Thermal decreases by 3.9, 6.6, 9.4, 12.4 and 15.5 percentage points
@@ -1622,11 +1688,10 @@ up straight through with no disambiguation at all. Both paths are evidence that
1622
1688
  each grade by its roll count.
1623
1689
  - **A minority of recipes charge one.** Inara's blueprint
1624
1690
  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
1691
+ set is the bespoke grade-2–5 recipes a bought Mercenary article climbs plus the
1692
+ Operations recipes an ordinary menu lists at grades 1–5 (`FuelScoop_Efficiency`
1693
+ and the `*Laser_ThermalPlasmaConversion` recipes). One published recipe can answer to
1694
+ more than one stored id. An ordinary engineer recipe is therefore **absent rather than
1630
1695
  zero**, and `GuardianModule_Sturdy`
1631
1696
  is absent for the same reason. That index is the whole evidence for the negative half
1632
1697
  of the claim: it is a completeness reading of one listing, not 197 pages checked one
@@ -2110,53 +2175,42 @@ base module's name: the Mining Laser and the size-5 Frame Shift Drive.
2110
2175
  - **`acquisition` says where each remaining variant comes from** — `mercenary`,
2111
2176
  `communityGoal` or `techBroker`.
2112
2177
  - **`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
2178
+ blueprint panels observed by the repository owner on 2026-09-13 UTC. Every one is
2179
+ grade 1, and that is the point: the
2116
2180
  purchased module already
2117
2181
  contains the grade-1 pre-engineering, which is exactly why these blueprints' own
2118
2182
  recipes start at grade 2 (see the Operations section above). The two facts are
2119
2183
  consistent by construction: material costs for further engineering begin at grade 2.
2120
2184
  - **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.
2185
+ `Hpt_BasicMissileRack_Fixed_Large` at **900 MC**. Direct observation supplies its
2186
+ size, price and fixed transformation.
2187
+ - **These shop articles come from direct in-game observation.** The observations were
2188
+ acquired 2026-09-13 UTC. The observed panels supply each Mercenary row's
2189
+ grade-1 fixed transformation. The burst laser's stated damage includes Regeneration
2190
+ Sequence. Its fixed Damage change is therefore +4%, which composes with the effect's
2191
+ −10% to give the observed −6.4%. Force Shell supplies the cannon's −16.7% Shot Speed
2192
+ change. Feedback Cascade supplies the rail gun's Damage and Thermal Load reductions.
2193
+ Screening Shell supplies both fragment cannons' Reload Time reduction. Incendiary
2194
+ Rounds supplies part of the mining laser's Thermal Load increase. FSD Interrupt
2195
+ supplies part of both Lockdown racks' Damage and Rate of Fire reductions. The
2196
+ cannon's fixed damage split is equal parts Kinetic and Explosive. Both cargo racks
2197
+ carry the exact multiplier implied by their observed capacities.
2198
+ Mercenary hardpoints keep the experimental state supplied by the shop. An engineer
2199
+ cannot add, remove or replace their effect. Direct observation acquired 2026-09-14 UTC
2200
+ supplies this rule.
2201
+ - **The large Double Screaming Fragment Cannon uses its exact observed firing rate.**
2202
+ Its grade-1 rate is 2.166787 shots per second. The fixed transformation stores the
2203
+ multiplier that reproduces this rate from the stock firing cycle.
2135
2204
  - **Some Merc rows carry a default experimental effect** applied beside the grade-1
2136
2205
  blueprint, recorded as `experimentalEffectSymbol`: Screening Shell on both Double
2137
2206
  Screaming Fragment Cannons, Incendiary Rounds on the Long Range Mining Laser,
2138
2207
  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.
2208
+ Feedback Rail Gun, Drag Munitions on the Drag Seeker Missile Rack and Exposing
2209
+ Missiles, Thermal Cascade on the Lightweight Thermal Seeker Missile Rack, FSD
2210
+ Interrupt on both Lockdown Seeker Missile Racks, Regeneration Sequence on the
2211
+ Regenerative Burst Laser, and Force Shell on the Force Impact Cannon. Source:
2212
+ repository-owner in-game observation. Every row carries
2213
+ its observed grade-1 transformation in `modifiers`.
2160
2214
  - **`communityGoal`** — modules awarded for taking part in a community goal. Source:
2161
2215
  EDSY's stored-module presets, which record each reward as an encoded module state; the
2162
2216
  blueprint, grade and experimental effect were
@@ -2201,16 +2255,14 @@ base module's name: the Mining Laser and the size-5 Frame Shift Drive.
2201
2255
  Merc Coin is a separate currency with no credit equivalent, which is why it is its own
2202
2256
  field rather than the `cost` modules carry. Tech-broker unlocks have no equivalent
2203
2257
  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
2258
+ - **`modifiers` is the hand-set stat block a fixed variant arrives with** — what makes
2205
2259
  these records fittable rather than merely catalogued. Same vocabulary as a blueprint
2206
2260
  feature: a journal Modifier `label`, a `method` (`multiplicative` / `additive` /
2207
2261
  `overwrite`) and a `value`. Decoded from the same EDSY preset state as the blueprint
2208
2262
  and grade, then translated into the Almanac's own vocabulary — EDSY's attribute names
2209
2263
  map to journal Modifier Labels through its own table, and resistances, which EDSY
2210
2264
  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.
2265
+ resistance. Each Mercenary row carries its observed grade-1 transformation.
2214
2266
  - **Values are the authored decimals, recovered rather than rounded.** The presets
2215
2267
  encode modifiers in EDSY's custom 20-bit float (1 sign, 5 exponent, 14 mantissa),
2216
2268
  which carries about fifteen significant bits — so decoding a change the game states
package/README.md CHANGED
@@ -279,8 +279,8 @@ that same id.
279
279
 
280
280
  The [repository README](https://github.com/DarkSession/Elite-Dangerous-Almanac#readme)
281
281
  contains the project guide. The generated
282
- [GitHub Wiki](https://github.com/DarkSession/Elite-Dangerous-Almanac/wiki) contains the
283
- complete API reference.
282
+ [TypeScript wiki](https://github.com/DarkSession/Elite-Dangerous-Almanac/wiki/TypeScript)
283
+ contains the guides and the complete API reference.
284
284
 
285
285
  ## Data and credits
286
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