@elite-dangerous-almanac/core 0.1.4 → 0.1.6

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 (180) hide show
  1. package/PROVENANCE/i18n/SOURCES.md +40 -41
  2. package/PROVENANCE/ships/SOURCES.md +71 -9
  3. package/README.md +11 -5
  4. package/THIRD_PARTY_NOTICES.md +4 -3
  5. package/assets/ships/Adder/gunsight.svg +17 -0
  6. package/assets/ships/Anaconda/gunsight.svg +32 -0
  7. package/assets/ships/Asp/gunsight.svg +26 -0
  8. package/assets/ships/Asp_Scout/gunsight.svg +20 -0
  9. package/assets/ships/BelugaLiner/gunsight.svg +23 -0
  10. package/assets/ships/CobraMkIII/gunsight.svg +20 -0
  11. package/assets/ships/CobraMkIV/gunsight.svg +23 -0
  12. package/assets/ships/CobraMkV/gunsight.svg +23 -0
  13. package/assets/ships/Corsair/gunsight.svg +26 -0
  14. package/assets/ships/Cutter/gunsight.svg +29 -0
  15. package/assets/ships/DiamondBack/gunsight.svg +20 -0
  16. package/assets/ships/DiamondBackXL/gunsight.svg +17 -0
  17. package/assets/ships/Dolphin/gunsight.svg +14 -0
  18. package/assets/ships/Eagle/gunsight.svg +17 -0
  19. package/assets/ships/Empire_Courier/gunsight.svg +17 -0
  20. package/assets/ships/Empire_Eagle/gunsight.svg +17 -0
  21. package/assets/ships/Empire_Trader/gunsight.svg +20 -0
  22. package/assets/ships/Explorer_NX/gunsight.svg +29 -0
  23. package/assets/ships/Federation_Corvette/gunsight.svg +29 -0
  24. package/assets/ships/Federation_Corvette/schematic-bottom.svg +5 -5
  25. package/assets/ships/Federation_Corvette/schematic-top.svg +14 -14
  26. package/assets/ships/Federation_Dropship/gunsight.svg +23 -0
  27. package/assets/ships/Federation_Dropship_MkII/gunsight.svg +20 -0
  28. package/assets/ships/Federation_Gunship/gunsight.svg +29 -0
  29. package/assets/ships/FerDeLance/gunsight.svg +23 -0
  30. package/assets/ships/Hauler/gunsight.svg +11 -0
  31. package/assets/ships/Independant_Trader/gunsight.svg +20 -0
  32. package/assets/ships/Krait_Light/gunsight.svg +20 -0
  33. package/assets/ships/Krait_MkII/gunsight.svg +23 -0
  34. package/assets/ships/LakonMiner/gunsight.svg +32 -0
  35. package/assets/ships/Mamba/gunsight.svg +23 -0
  36. package/assets/ships/Mandalay/gunsight.svg +26 -0
  37. package/assets/ships/MediumTransport01/gunsight.svg +23 -0
  38. package/assets/ships/Orca/gunsight.svg +17 -0
  39. package/assets/ships/PantherMkII/gunsight.svg +38 -0
  40. package/assets/ships/Python/gunsight.svg +23 -0
  41. package/assets/ships/Python_NX/gunsight.svg +26 -0
  42. package/assets/ships/SideWinder/gunsight.svg +14 -0
  43. package/assets/ships/SmallCombat01_NX/gunsight.svg +23 -0
  44. package/assets/ships/Type6/gunsight.svg +14 -0
  45. package/assets/ships/Type7/gunsight.svg +20 -0
  46. package/assets/ships/Type8/gunsight.svg +26 -0
  47. package/assets/ships/Type9/gunsight.svg +23 -0
  48. package/assets/ships/Type9_Military/gunsight.svg +35 -0
  49. package/assets/ships/TypeX/gunsight.svg +26 -0
  50. package/assets/ships/TypeX_2/gunsight.svg +26 -0
  51. package/assets/ships/TypeX_3/gunsight.svg +29 -0
  52. package/assets/ships/Viper/gunsight.svg +20 -0
  53. package/assets/ships/Viper_MkIV/gunsight.svg +20 -0
  54. package/assets/ships/Vulture/gunsight.svg +14 -0
  55. package/dist/chunk-2VPVZELZ.js +1 -0
  56. package/dist/{chunk-EU42PAV4.js.map → chunk-2VPVZELZ.js.map} +1 -1
  57. package/dist/{chunk-O72KI7RP.js → chunk-3EO7PTAP.js} +1 -1
  58. package/dist/{chunk-XT6KKGSE.js → chunk-3MPLVD2R.js} +1 -1
  59. package/dist/chunk-5V4OXZLE.js +1 -0
  60. package/dist/{chunk-CTJQPQRA.js.map → chunk-5V4OXZLE.js.map} +1 -1
  61. package/dist/chunk-6FKBZPI6.js +1 -0
  62. package/dist/{chunk-3IMWUYXJ.js.map → chunk-6FKBZPI6.js.map} +1 -1
  63. package/dist/{chunk-MGT52MJM.js → chunk-BZDTEXXM.js} +1 -1
  64. package/dist/{chunk-UBYO7VZR.js → chunk-DBGXZF7O.js} +1 -1
  65. package/dist/{chunk-SVZARHWP.js → chunk-DYPOL3CI.js} +1 -1
  66. package/dist/{chunk-SVZARHWP.js.map → chunk-DYPOL3CI.js.map} +1 -1
  67. package/dist/chunk-EVEFYI7K.js +1 -0
  68. package/dist/{chunk-GKDEI2SQ.js.map → chunk-EVEFYI7K.js.map} +1 -1
  69. package/dist/{chunk-6RLMBSXE.js → chunk-EWAS7KMF.js} +1 -1
  70. package/dist/chunk-JKWV3CZN.js +1 -0
  71. package/dist/{chunk-XN6Q7LWU.js.map → chunk-JKWV3CZN.js.map} +1 -1
  72. package/dist/{chunk-PHPLZEFS.js → chunk-JPBMRJFC.js} +1 -1
  73. package/dist/{chunk-PHPLZEFS.js.map → chunk-JPBMRJFC.js.map} +1 -1
  74. package/dist/chunk-JXLCRQH5.js +1 -0
  75. package/dist/{chunk-EKWLAHRG.js.map → chunk-JXLCRQH5.js.map} +1 -1
  76. package/dist/chunk-NCKOVFBJ.js +1 -0
  77. package/dist/{chunk-TFPIPIMU.js.map → chunk-NCKOVFBJ.js.map} +1 -1
  78. package/dist/chunk-NEFUW32I.js +1 -0
  79. package/dist/{chunk-2J2UV4ZX.js.map → chunk-NEFUW32I.js.map} +1 -1
  80. package/dist/chunk-NWBWTJM3.js +1 -0
  81. package/dist/chunk-NWBWTJM3.js.map +1 -0
  82. package/dist/chunk-PEHOKSSD.js +1 -0
  83. package/dist/chunk-PYV7VI6I.js +1 -0
  84. package/dist/{chunk-EJMNNQIS.js.map → chunk-PYV7VI6I.js.map} +1 -1
  85. package/dist/{chunk-QI22FKBG.js → chunk-Q3QCLNVG.js} +1 -1
  86. package/dist/{chunk-QI22FKBG.js.map → chunk-Q3QCLNVG.js.map} +1 -1
  87. package/dist/chunk-QGAZWX7G.js +1 -0
  88. package/dist/{chunk-HRVIHQ4A.js.map → chunk-QGAZWX7G.js.map} +1 -1
  89. package/dist/{chunk-FGNJ7EVM.js → chunk-RC6F6RAU.js} +1 -1
  90. package/dist/{chunk-FGNJ7EVM.js.map → chunk-RC6F6RAU.js.map} +1 -1
  91. package/dist/chunk-SNADUQSJ.js +1 -0
  92. package/dist/chunk-SNADUQSJ.js.map +1 -0
  93. package/dist/chunk-SU352DIW.js +1 -0
  94. package/dist/chunk-SU352DIW.js.map +1 -0
  95. package/dist/{chunk-VB3XZGIB.js → chunk-T4CV4CDF.js} +1 -1
  96. package/dist/chunk-TEOJCBSG.js +1 -0
  97. package/dist/chunk-TEOJCBSG.js.map +1 -0
  98. package/dist/{chunk-QMFBL5XO.js → chunk-UPUC5X2C.js} +1 -1
  99. package/dist/{chunk-QMFBL5XO.js.map → chunk-UPUC5X2C.js.map} +1 -1
  100. package/dist/chunk-WHAU3C4E.js +1 -0
  101. package/dist/{chunk-H3HMVGEY.js.map → chunk-WHAU3C4E.js.map} +1 -1
  102. package/dist/chunk-ZKU7CMAH.js +1 -0
  103. package/dist/chunk-ZKU7CMAH.js.map +1 -0
  104. package/dist/equipment/index.js +1 -1
  105. package/dist/equipment/upgrade-costs.js +1 -1
  106. package/dist/equipment/upgrade-costs.js.map +1 -1
  107. package/dist/i18n/blueprints.js +1 -1
  108. package/dist/i18n/diagnostics.d.ts +1 -0
  109. package/dist/i18n/diagnostics.js +1 -1
  110. package/dist/i18n/engineering-groups.d.ts +2 -2
  111. package/dist/i18n/engineering-groups.js +1 -1
  112. package/dist/i18n/experimental-effect-descriptions.js +1 -1
  113. package/dist/i18n/experimental-effects.js +1 -1
  114. package/dist/i18n/index.d.ts +29 -1
  115. package/dist/i18n/index.js +1 -1
  116. package/dist/i18n/materials.d.ts +2 -3
  117. package/dist/i18n/materials.js +1 -1
  118. package/dist/i18n/micro-resources.d.ts +2 -3
  119. package/dist/i18n/micro-resources.js +1 -1
  120. package/dist/i18n/modules.d.ts +3 -4
  121. package/dist/i18n/modules.js +1 -1
  122. package/dist/i18n/pre-engineered.js +1 -1
  123. package/dist/i18n/ships.js +1 -1
  124. package/dist/i18n/slots.js +1 -1
  125. package/dist/ships/blueprint-costs.d.ts +112 -22
  126. package/dist/ships/blueprint-costs.js +1 -1
  127. package/dist/ships/blueprint-costs.js.map +1 -1
  128. package/dist/ships/blueprints.d.ts +3 -1
  129. package/dist/ships/blueprints.js +1 -1
  130. package/dist/ships/engineering.d.ts +5 -4
  131. package/dist/ships/engineering.js +1 -1
  132. package/dist/ships/experimental-effect-costs.d.ts +7 -2
  133. package/dist/ships/experimental-effect-costs.js +1 -1
  134. package/dist/ships/experimental-effect-costs.js.map +1 -1
  135. package/dist/ships/experimental-effects.d.ts +2 -1
  136. package/dist/ships/experimental-effects.js +1 -1
  137. package/dist/ships/gunsights.js +1 -1
  138. package/dist/ships/index.d.ts +6 -3
  139. package/dist/ships/index.js +1 -1
  140. package/dist/ships/modules-all.js +1 -1
  141. package/dist/ships/modules-core.js +1 -1
  142. package/dist/ships/modules-hardpoint.d.ts +1 -0
  143. package/dist/ships/modules-hardpoint.js +1 -1
  144. package/dist/ships/modules-internal.d.ts +1 -0
  145. package/dist/ships/modules-internal.js +1 -1
  146. package/dist/ships/modules-utility.d.ts +1 -0
  147. package/dist/ships/modules-utility.js +1 -1
  148. package/dist/ships/modules.d.ts +22 -5
  149. package/dist/ships/modules.js +1 -1
  150. package/dist/ships/pre-engineered-stats.js +1 -1
  151. package/dist/ships/pre-engineered.d.ts +9 -3
  152. package/dist/ships/pre-engineered.js +1 -1
  153. package/dist/ships/ship-loadout.d.ts +72 -27
  154. package/dist/ships/ship-loadout.js +1 -1
  155. package/package.json +1 -1
  156. package/dist/chunk-2J2UV4ZX.js +0 -1
  157. package/dist/chunk-3IMWUYXJ.js +0 -1
  158. package/dist/chunk-7XXNVKAB.js +0 -1
  159. package/dist/chunk-7XXNVKAB.js.map +0 -1
  160. package/dist/chunk-CTJQPQRA.js +0 -1
  161. package/dist/chunk-E45EDCYH.js +0 -1
  162. package/dist/chunk-E45EDCYH.js.map +0 -1
  163. package/dist/chunk-EJMNNQIS.js +0 -1
  164. package/dist/chunk-EKWLAHRG.js +0 -1
  165. package/dist/chunk-EU42PAV4.js +0 -1
  166. package/dist/chunk-GKDEI2SQ.js +0 -1
  167. package/dist/chunk-H3HMVGEY.js +0 -1
  168. package/dist/chunk-HRVIHQ4A.js +0 -1
  169. package/dist/chunk-M5IBENCW.js +0 -1
  170. package/dist/chunk-M5IBENCW.js.map +0 -1
  171. package/dist/chunk-PNZCLQDJ.js +0 -1
  172. package/dist/chunk-TFPIPIMU.js +0 -1
  173. package/dist/chunk-XN6Q7LWU.js +0 -1
  174. /package/dist/{chunk-O72KI7RP.js.map → chunk-3EO7PTAP.js.map} +0 -0
  175. /package/dist/{chunk-XT6KKGSE.js.map → chunk-3MPLVD2R.js.map} +0 -0
  176. /package/dist/{chunk-MGT52MJM.js.map → chunk-BZDTEXXM.js.map} +0 -0
  177. /package/dist/{chunk-UBYO7VZR.js.map → chunk-DBGXZF7O.js.map} +0 -0
  178. /package/dist/{chunk-6RLMBSXE.js.map → chunk-EWAS7KMF.js.map} +0 -0
  179. /package/dist/{chunk-PNZCLQDJ.js.map → chunk-PEHOKSSD.js.map} +0 -0
  180. /package/dist/{chunk-VB3XZGIB.js.map → chunk-T4CV4CDF.js.map} +0 -0
@@ -6,6 +6,14 @@ They are deliberately sparse: absence means that no accepted source carried a va
6
6
  the lookup API returns `null` for that locale rather than treating English as a
7
7
  translation.
8
8
 
9
+ **Five locales are stored: `en`, `de`, `es`, `fr` and `ru`.** Several accepted sources
10
+ publish more — Portuguese, Brazilian Portuguese, Italian, Hungarian, Georgian and
11
+ Simplified Chinese among them — and those values are deliberately not carried: the
12
+ project supports those five languages and no others. That is a decision about this
13
+ catalogue, not a gap in any source, so re-deriving a catalogue from its source must drop
14
+ the other columns again rather than restore them. Every locale is stored under a bare
15
+ language tag; a regional or script tag resolves to its language.
16
+
9
17
  ## `module-names.jsonc`
10
18
 
11
19
  - **Acquired:** 2026-08-14 UTC.
@@ -19,13 +27,11 @@ translation.
19
27
  Almanac's canonical English name. This prevents broad EDDI families such as
20
28
  `CargoRack`, `MissileRack` and `PlanetaryApproachSuite` from erasing the distinct Mk II,
21
29
  seeker and advanced names the Almanac carries. EDSY's module `fdname` and effective
22
- `namekey` fill a missing `de`, `es`, `fr`, `pt` or `ru` value only when EDSY's English
30
+ `namekey` fill a missing `de`, `es`, `fr` or `ru` value only when EDSY's English
23
31
  module name also exactly equals the canonical name. Values shared by modules with one
24
32
  canonical name are retained only when they agree, then stored once under that name.
25
33
  - **Coverage:** English covers all 1,199 symbols. The explicit translations cover 1,120
26
- in German, 1,090 in Spanish, 1,088 in French, 767 in Hungarian, 1,028 in Italian,
27
- 822 in Portuguese, 1,029 in Brazilian Portuguese, 1,153 in Russian and 1,028 in
28
- Simplified Chinese.
34
+ in German, 1,090 in Spanish, 1,088 in French and 1,153 in Russian.
29
35
  - **Manual corrections:** none.
30
36
 
31
37
  ## `blueprint-names.jsonc`
@@ -39,7 +45,7 @@ translation.
39
45
  each language file. Names remain keyed per blueprint because a single English phrase
40
46
  can have different grammatical translations for different module families.
41
47
  - **Coverage:** English covers all 107 blueprints; EDSY covers 55 in German and 59 each
42
- in Spanish, French, Portuguese and Russian. The remaining recipes include Operations
48
+ in Spanish, French and Russian. The remaining recipes include Operations
43
49
  and other newer records EDSY does not identify or translate.
44
50
  - **Manual corrections:** EDSY's French `FSD_FastBoot` value ends in one accidental
45
51
  ASCII space; the stored display name removes it so a successful lookup is already
@@ -55,7 +61,7 @@ translation.
55
61
  EDSY's `expeffect.fdname`; that record's id selects an explicit `expeffect-<id>` entry
56
62
  from each language file.
57
63
  - **Coverage:** English covers all 86 effects; EDSY covers 84 in German and 85 each in
58
- Spanish, French, Portuguese and Russian.
64
+ Spanish, French and Russian.
59
65
  - **Manual corrections:** none.
60
66
 
61
67
  ## `material-names.jsonc`
@@ -73,11 +79,7 @@ translation.
73
79
  parenthetical Guardian and Thargoid category labels where the owning catalogue does;
74
80
  localized columns remain verbatim source values.
75
81
  - **Coverage:** English, Spanish and Russian cover all 146 materials. The explicit
76
- translations cover 128 in German, 140 in French, 140 in Portuguese and 28 in
77
- Georgian. Fourteen of the source's Georgian values are byte-for-byte equal to the
78
- canonical English spelling and are retained verbatim; they are explicit source values,
79
- not lookup-generated fallbacks. The pinned source carries no Simplified Chinese
80
- material names.
82
+ translations cover 128 in German and 140 in French.
81
83
  - **Manual corrections:** none.
82
84
 
83
85
  ## `micro-resource-names.jsonc`
@@ -94,18 +96,11 @@ translation.
94
96
  localized columns are copied. Twenty-eight of the 30 in-game-backed records also have
95
97
  rows in Odyssey Materials Helper, while `PowerVirus` and
96
98
  `SmallCapacityPowerRegulator` do not. All 30 take the explicit in-game `name` values for
97
- German, Spanish, French, Brazilian Portuguese and Russian. The Brazilian Portuguese
98
- values are stored under `pt`, matching the existing catalogue values described below.
99
- In both cases the owning catalogue remains authoritative for canonical English names.
99
+ German, Spanish, French and Russian. In both cases the owning catalogue remains
100
+ authoritative for canonical English names.
100
101
  - **Coverage:** English, Spanish and Russian cover all 226 micro resources. The explicit
101
- translations cover 218 in German and Portuguese, 225 in French, 6 in Simplified Chinese
102
- and 10 in Georgian. Five of the source's Georgian values are byte-for-byte equal to the
103
- canonical English spelling and are retained verbatim; they are explicit source values,
104
- not lookup-generated fallbacks.
105
- - **Manual corrections:** the 30 in-game values labelled Brazilian Portuguese are stored
106
- under `pt`, matching the 188 existing Portuguese entries because both sets contain the
107
- same Brazilian Portuguese game text. `pt-BR` lookups resolve these values through the
108
- regional-to-language fallback.
102
+ translations cover 218 in German and 225 in French.
103
+ - **Manual corrections:** none.
109
104
 
110
105
  ## `ship-names.jsonc`
111
106
 
@@ -121,9 +116,8 @@ translation.
121
116
  Helper's `ships.name.*` key after removing punctuation and folding case. EDSY's
122
117
  `eddb.js` `ship.fdname` supplies the second join, with explicit `ship-<id>` language
123
118
  entries filling locales absent from the CSV. The resulting source-backed coverage is
124
- 48 ships in Spanish, 44 in French, 38 in Portuguese, 48 in Russian, 48 in
125
- Simplified Chinese and 47 in Georgian;
126
- no accepted source carries a German ship-name table.
119
+ 48 ships in Spanish, 44 in French and 48 in Russian; no accepted source carries a
120
+ German ship-name table.
127
121
  - **Standing conclusion:** every source-backed non-English value is byte-for-byte equal
128
122
  to the canonical English ship name. The explicit values remain in the catalogue so a
129
123
  lookup distinguishes a source-backed same spelling from an unavailable translation.
@@ -144,21 +138,19 @@ translation.
144
138
 
145
139
  - **Acquired:** 2026-08-18 UTC.
146
140
  - **EDSY revision:** commit `e446fbe6e4597dea7ab0bd3105b9a36642388040`;
147
- database version `424009901`, last-modified marker `20260810`; `lang-en.json`,
148
- `lang-pt.json` and `lang-ru.json` have Git blob ids
149
- `9b199db635f7b968b75c8e9a14bdce68e37e4120`,
150
- `493fa09c4d4a11f0282e1e4076a67fed8d7f317e` and
141
+ database version `424009901`, last-modified marker `20260810`; `lang-en.json` and
142
+ `lang-ru.json` have Git blob ids `9b199db635f7b968b75c8e9a14bdce68e37e4120` and
151
143
  `36496372d056754c34da03ca6836e27987c96b6a` respectively.
152
144
  - **Derivation:** each of the 48 group ids and its canonical English name is projected
153
145
  from `data/ships/engineering-options.jsonc`. That catalogue derives its group menus
154
146
  from EDSY, with the supplemental sources and corrections recorded in
155
147
  `data/ships/SOURCES.md`. Where a canonical English name matches an EDSY `mtype-*`
156
148
  value in `lang-en.json` byte-for-byte and uniquely, explicit values with the same key
157
- are copied from `lang-pt.json` and `lang-ru.json`.
158
- - **Coverage:** canonical English covers every engineering option group. Portuguese and
159
- Russian each cover 44 of 48. The Guardian power-plant, power-distributor and
160
- hull-reinforcement groups have no distinct EDSY label, and EDSY carries no Portuguese
161
- or Russian value for `frameShiftDrivesSCO`.
149
+ are copied from `lang-ru.json`.
150
+ - **Coverage:** canonical English covers every engineering option group; Russian covers
151
+ 44 of 48. The Guardian power-plant, power-distributor and hull-reinforcement groups
152
+ have no distinct EDSY label, and EDSY carries no Russian value for
153
+ `frameShiftDrivesSCO`.
162
154
  - **Manual corrections:** none.
163
155
 
164
156
  ## `experimental-effect-descriptions.jsonc`
@@ -175,22 +167,29 @@ translation.
175
167
 
176
168
  ## `pre-engineered-variant-names.jsonc`
177
169
 
178
- - **Acquired:** 2026-08-18 UTC.
170
+ - **Acquired:** 2026-08-18 UTC; the Merc-shop names 2026-08-22 UTC.
179
171
  - **Derivation:** all 76 compound identities and English names come from
180
172
  `data/ships/pre-engineered.jsonc`. An identity combines the base module symbol,
181
173
  blueprint, optional experimental effect and acquisition route. When a variant name
182
174
  exactly matches its base module's canonical name, it reuses that record from
183
- `module-names.jsonc`; the 28 distinct display records are stored once. Fixed reward
175
+ `module-names.jsonc`; the 41 distinct display records are stored once. Fixed reward
184
176
  names such as the three `Decorative_*` festive launchers remain canonical English.
177
+ - **The 22 Merc-shop rows carry the shop's own names**, in 14 distinct records — the shop
178
+ sells a "Far-Reaching Abrasion Blaster", not an Abrasion Blaster — so they do not reuse
179
+ their base module's record. English and the German, Spanish, French and Russian values
180
+ are supplied by the repository owner from the in-game shop listing; no registry
181
+ publishes them.
185
182
  - **Coverage:** English covers every variant. Ordinary names inherit the explicit
186
- localized values available for their base module; fixed reward names have no accepted
187
- translation source.
183
+ localized values available for their base module; the Merc-shop names carry all five
184
+ stored locales; fixed reward names have no accepted translation source.
188
185
  - **Manual corrections:** none.
189
186
 
190
187
  ## Known gaps
191
188
 
192
189
  Localized coverage follows the accepted sources and is not complete for every catalogue or
193
- locale. The accepted sources carry only canonical English for some engineering-group labels,
194
- slot and restriction labels, fixed reward names, and structured loadout, calculation, SLEF
195
- and edit messages. Missing source-backed translations remain tracked by
190
+ stored locale. A language absent from all ten catalogues is the locale decision recorded
191
+ above rather than a gap. The accepted sources carry only canonical English for
192
+ outfitting-family labels and some engineering-group labels, slot and restriction labels,
193
+ fixed reward names, and structured loadout, calculation, SLEF and edit messages. Missing
194
+ source-backed translations remain tracked by
196
195
  [#320](https://github.com/DarkSession/Elite-Dangerous-Almanac/issues/320).
@@ -130,8 +130,6 @@ identity from FDevIDs, stats and slots from coriolis-data, joined on `symbol`.
130
130
  ### Gunsights
131
131
 
132
132
  - **File:** `gunsights.jsonc` (48 player-flyable hulls, 234 weapon hardpoints).
133
- - **Source:** in-game gunsight observations from the in-game verification snapshot
134
- pinned above.
135
133
  - **Derivation:** each observation is joined to `ships.jsonc` by case-insensitive hull
136
134
  symbol. Its hardpoints are joined by exact journal slot key to the hardpoints returned
137
135
  by `enumerateSlots`, then written in the existing `Ship.hardpoints` order. One observed
@@ -387,6 +385,20 @@ FDevIDs, stats from coriolis-data and EDSY, joined on `symbol`.
387
385
  The group source, derivation, split
388
386
  Guardian families and coverage are documented under Engineering options below; this
389
387
  field is a projection of that map, not a separate classification source.
388
+ - **`family` groups the three variable-slot outfitting lists.** Every internal,
389
+ hardpoint and utility record carries one stable descriptive English label: 484
390
+ internal modules in 35 families, 159 hardpoints in 29, and 35 utility fittings in
391
+ 12. The 521 core records carry none because their existing `slot` is already the
392
+ grouping the core-internals screen uses; public loaders normalize that deliberate
393
+ absence to `null`. Labels are derived from the canonical `name` identities above and
394
+ the module kind represented by each record, then pluralized for display. Variants
395
+ remain with the base family rather than fragmenting a list: Bi-Weave and Prismatic
396
+ generators are `Shield Generators`; corrosion-resistant and Mk II racks are
397
+ `Cargo Racks`; Powerplay weapons stay with their base weapon; Mk I/Mk II cabins and
398
+ vessel hangars share `Passenger Cabins` and `Vessel Hangars`. Guardian/AX and
399
+ specialist mining weapons retain their distinct kind where their function differs.
400
+ A re-derivation must carry these labels in the normalized identity arrays; no
401
+ upstream column publishes this display classification.
390
402
  - **Stats source:** coriolis-data `modules/**` for the mechanical, defence, power and
391
403
  weapon stats; EDSY `eddb.js` for mass, integrity, power draw, boot time and the
392
404
  engineering base stats coriolis does not carry; and in-game verification for the
@@ -1095,14 +1107,17 @@ up straight through with no disambiguation at all. Both paths are evidence that
1095
1107
 
1096
1108
  - **Files:** `blueprints.jsonc` (per-blueprint, per-grade stat modifiers),
1097
1109
  `blueprint-costs.jsonc` (the matching per-grade material requirements),
1110
+ `blueprint-merc-coin-costs.jsonc` (the per-roll Merc-Coin amounts the 25 recipes that
1111
+ charge a currency bill alongside those materials),
1098
1112
  `blueprint-journal-names.jsonc` (the three recipe ids whose journal spelling collides
1099
1113
  with another recipe), `experimental-effects.jsonc` (special-effect stat modifiers and
1100
1114
  qualitative descriptions), and `experimental-effect-costs.jsonc` (the matching
1101
1115
  one-application material costs).
1102
1116
  Stored modifier labels use journal `Modifier` **Labels**. Each blueprint is `{ name, grades }`
1103
- (each grade `{ features, damageDistribution? }`). The cost file uses the same ids and
1104
- grades for the craftable subset; fixed reward identities without an ordinary cost are
1105
- absent. Each experimental effect is
1117
+ (each grade `{ features, damageDistribution? }`). The material cost file uses the same
1118
+ ids and grades for the craftable subset; fixed reward identities without an ordinary
1119
+ cost are absent. The Merc-Coin file is a subset of that subset, with the same ids and
1120
+ the same grades again — a recipe charging no currency is absent rather than zero. Each experimental effect is
1106
1121
  `{ name, modifiers, damageDistribution?, description? }`, with its cost file keyed by
1107
1122
  the same effect ids.
1108
1123
  - **Display names:** each blueprint and experimental effect carries its `name`.
@@ -1216,8 +1231,11 @@ up straight through with no disambiguation at all. Both paths are evidence that
1216
1231
  grade 5. Inara does not publish journal spellings for the damage members, and the
1217
1232
  repository contains no raw `Loadout` capture of this blueprint.
1218
1233
  Their per-roll `materials` are from the same registry (resolved to Frontier material
1219
- `symbol`s against the `materials` domain); the per-roll **Merc-Coin** amount is also
1220
- charged but is a currency, not a material, so it is not stored. Some totals are
1234
+ `symbol`s against the `materials` domain). Where that same crafting-cost table lists a
1235
+ per-roll **Merc-Coin** amount beside them on the 25 recipes named under "Merc-Coin
1236
+ crafting cost" below, which is every recipe in this bullet except the Anti-Guardian one
1237
+ — the amount is a currency rather than a material, so it is stored separately, in
1238
+ `blueprint-merc-coin-costs.jsonc`. Some totals are
1221
1239
  non-monotonic (pre-engineered UI values, not primitive weights — notably the
1222
1240
  Enduring-feedback rail-gun damage and the Balanced-distributor G4 mass) and are
1223
1241
  **preserved as published, not silently "corrected"**. The Merc-Coin **weapon-reward**
@@ -1225,6 +1243,39 @@ up straight through with no disambiguation at all. Both paths are evidence that
1225
1243
  pre-engineering; the general/core/optional recipes (fuel scoop, laser plasma-conversion)
1226
1244
  span grades 1–5, and the Anti-Guardian recipe is grade 1 only.
1227
1245
 
1246
+ - **Merc-Coin crafting cost — `blueprint-merc-coin-costs.jsonc`.** A recipe that charges a
1247
+ currency lists it in the same Inara crafting-cost box as its materials, on a `Merc Coin`
1248
+ line carrying an amount and no material link. That amount is stored in its own file, per
1249
+ blueprint and per grade, because it is a currency and not a material: folding it into an
1250
+ `EngineeringMaterial` list would put something with no `symbol` in the materials domain.
1251
+ Amounts are **per roll**, exactly as the material recipes are, so pricing a climb weights
1252
+ each grade by its roll count.
1253
+ - **25 recipes charge one, and no other blueprint does.** Inara's blueprint index marks
1254
+ a charging recipe by rendering its name in the coin colour, and the marked set is
1255
+ exactly the 21 bespoke grade-2–5 recipes a bought Mercenary article climbs plus the
1256
+ four Operations recipes an ordinary menu lists at grades 1–5 (`FuelScoop_Efficiency`
1257
+ and the three `*Laser_ThermalPlasmaConversion`) — 18 marked rows of the 197 the index
1258
+ lists, because one published recipe can answer to more than one stored id. An ordinary
1259
+ engineer recipe is therefore **absent rather than zero**, and `GuardianModule_Sturdy`
1260
+ is absent for the same reason. That index is the whole evidence for the negative half
1261
+ of the claim: it is a completeness reading of one listing, not 197 pages checked one
1262
+ by one. Acquired 2026-08-22 UTC; the pages are live and expose no immutable revision.
1263
+ - **Every row is joined to its `fdname` by its own material recipe, not by name.** Inara
1264
+ publishes one page per recipe, keyed by its display name; each of the 18 pages' per-grade
1265
+ material lists was compared against `blueprint-costs.jsonc` before its Merc-Coin figures
1266
+ were taken, and all 25 rows agree on every grade, every material and every count. That is what
1267
+ binds "Rail Gun — Enduring feedback" to `RailGun_LongShot` rather than a guess at the
1268
+ display name.
1269
+ - **One published recipe, several stored ids, one set of amounts.** Inara publishes a
1270
+ single page for Cargo Rack — Extended, Power Distributor — Support focused, Fragment
1271
+ Cannon — Double screaming and Seeker Missile Rack — Lockdown, while this repository
1272
+ keys each as two or five per-SKU ids (see "Seven of these keys are almost certainly not
1273
+ journal ids" above). Those ids already carry **identical material recipes** at every
1274
+ grade, from that same one page; their Merc-Coin amounts are identical for the same
1275
+ reason, and are not a claim that the sizes were separately observed to cost the same.
1276
+ - **A pre-engineered article's shop price is a different number** and stays on the variant
1277
+ as `mercCoinCost`: that buys the article at grade 1, while these amounts buy the climb
1278
+ above it.
1228
1279
  - **Anti-Guardian Zone Resistance is keyed once, as the game spells it.**
1229
1280
  `blueprints.jsonc` stores the one player-facing blueprint under
1230
1281
  **`GuardianModule_Sturdy`** — the id a journal writes, and the only one any engineering
@@ -1285,8 +1336,12 @@ up straight through with no disambiguation at all. Both paths are evidence that
1285
1336
  magnitudes carry them (e.g. Force Shell shot speed −16.6667%, FSD Interrupt damage −30%
1286
1337
  / burst interval +50%). A fixed damage-type conversion is carried separately as
1287
1338
  `damageDistribution`, because it is a nested split rather than a scalar modifier.
1288
- Their one-application `materials` are from the same in-game / Inara registry (a
1289
- Merc-Coin amount is also charged but is not stored). Every one is a weapon effect, and
1339
+ Their one-application `materials` are the whole cost. **No experimental effect charges
1340
+ Merc Coin**, so nothing is missing beside them: repository-owner in-game confirmation,
1341
+ 2026-08-22 UTC, no immutable upstream revision. The currency is charged by 25
1342
+ **blueprints** and by no effect, so an effect's empty currency cost is a fact about the
1343
+ game rather than an omission here — those blueprint amounts are carried, under
1344
+ "Merc-Coin crafting cost" above. Every one is a weapon effect, and
1290
1345
  the weapon groups' menus list them.
1291
1346
  - **Three effects state a fixed converted damage type.** High Yield Shell, Inertial
1292
1347
  Impact and Overload Munitions produce 50/50 kinetic/explosive, kinetic/thermal and
@@ -1689,6 +1744,13 @@ up straight through with no disambiguation at all. Both paths are evidence that
1689
1744
  and several rows are annotated as having been obtainable both ways — the six SCO "V1"
1690
1745
  drives most obviously. `acquisition` records the tag; it is not a claim that no other
1691
1746
  route ever existed.
1747
+ - **`name` is the base module's name, except on the Merc-shop rows.** A community-goal or
1748
+ tech-broker article is listed under the module it fits as, so those rows carry the
1749
+ catalogue name verbatim. The 22 `mercenary` rows do not: the shop sells the
1750
+ "Far-Reaching Abrasion Blaster" and the "Support Focused Power Distributor" under those
1751
+ names, 14 distinct ones over the 22 rows. Supplied by the repository owner from the
1752
+ in-game shop listing, acquired 2026-08-22 UTC; the registries carry the transformation,
1753
+ not the label. Their localized values are recorded in `data/i18n/SOURCES.md`.
1692
1754
  - **`engineeringLocked: true` marks 12 final weapon rows:** the seven pre-engineered
1693
1755
  Guardian weapons and the five fixed Enzyme/AX articles. Their evidence is recorded once
1694
1756
  under Engineering options.
package/README.md CHANGED
@@ -55,9 +55,10 @@ The package has six feature areas:
55
55
 
56
56
  ## Ship assets
57
57
 
58
- Every catalogued hull includes three `1200 × 800` SVG files in the installed package:
58
+ Every catalogued hull includes four SVG files in the installed package:
59
59
 
60
60
  ```text
61
+ assets/ships/<symbol>/gunsight.svg
61
62
  assets/ships/<symbol>/illustration.svg
62
63
  assets/ships/<symbol>/schematic-top.svg
63
64
  assets/ships/<symbol>/schematic-bottom.svg
@@ -67,6 +68,11 @@ assets/ships/<symbol>/schematic-bottom.svg
67
68
  package files rather than JavaScript subpath exports, so applications can copy them from
68
69
  the installed package into their own public or bundled asset directory.
69
70
 
71
+ `gunsight.svg` is a `600 × 600` frontal plot of the fixed-weapon aim points at a nominal
72
+ 1,000-metre target range. Each weapon group under `#weapon-dots` carries the same
73
+ `data-journal-slot` key used by the hull's hardpoint layout. The illustration and both
74
+ schematics use a `1200 × 800` canvas.
75
+
70
76
  The two schematics expose a stable annotation contract for hull-anatomy interfaces:
71
77
 
72
78
  - Each annotated feature is a `<g>` group carrying a `data-feature` category. The
@@ -170,10 +176,10 @@ getEngineeringGroupName('frameShiftDrives', 'de'); // -> null
170
176
  ```
171
177
 
172
178
  The functions return an explicit source value verbatim, so a source-backed spelling may
173
- happen to equal English; the library itself never supplies an English fallback.
174
- Unqualified `zh` selects the source's Simplified Chinese (`zh-CN`) names. Explicitly
175
- different Chinese scripts or regions such as `zh-TW` do not fall back to Simplified
176
- Chinese and return `null` unless a matching source is added.
179
+ happen to equal English; the library itself never supplies an English fallback. The
180
+ catalogues carry English, French, German, Russian and Spanish, each stored under a bare
181
+ language tag: a regional or script subtag is dropped (`de-DE` `de`), and any other
182
+ language returns `null`.
177
183
 
178
184
  The same contract covers ship manufacturers, pre-engineered variant names, engineering
179
185
  group names, experimental-effect descriptions, loadout-slot and restriction labels, and
@@ -90,9 +90,10 @@ a verbatim copy produced at build time — edit this file, never the copy.
90
90
  for its code — its module definitions and resource tables supply localized outfitting
91
91
  names. The names are factual Elite Dangerous game data; no EDDI code is incorporated.
92
92
  - **[Inara](https://inara.cz/)** — the blueprint and outfitting registries behind the
93
- Operations pre-engineered blueprints and shop rows, the ship pages used to corroborate
94
- hull layouts, and the component pages that grade the Thargoid caustic / Titan materials
95
- absent from FDevIDs and classify Power Megaship Data as an Odyssey data resource.
93
+ Operations pre-engineered blueprints, shop rows and the per-roll Merc-Coin crafting
94
+ costs, the ship pages used to corroborate hull layouts, and the component pages that
95
+ grade the Thargoid caustic / Titan materials absent from FDevIDs and classify Power
96
+ Megaship Data as an Odyssey data resource.
96
97
  - **[EliteDangerousRegionMap](https://github.com/klightspeed/EliteDangerousRegionMap)** by
97
98
  **Ben Peddell** ([klightspeed](https://github.com/klightspeed)), **MIT** — the 42
98
99
  galactic codex regions, their ids and their lookup geometry. Original region-boundary
@@ -0,0 +1,17 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600" data-identity="adder" data-target-range-metres="1000" data-half-span-tangent="0.08">
2
+ <g id="gunsight" fill="none" stroke="#22333b" stroke-width="2">
3
+ <circle cx="300" cy="300" r="12"/>
4
+ <circle cx="300" cy="300" r="2" fill="#22333b" stroke="none"/>
5
+ </g>
6
+ <g id="weapon-dots" fill="#e63946" stroke="#ffffff" stroke-width="1.5">
7
+ <g id="hardpoint-01" data-name="MediumHardpoint1" data-journal-slot="MediumHardpoint1" data-socket="!Hardpoint0" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="7.95e-08" data-offset-y-metres="2.476220131">
8
+ <circle cx="300.000000" cy="290.714175" r="5"/>
9
+ </g>
10
+ <g id="hardpoint-02" data-name="SmallHardpoint1" data-journal-slot="SmallHardpoint1" data-socket="!Hardpoint1" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="4.803110899" data-offset-y-metres="-3.305289984">
11
+ <circle cx="318.011666" cy="312.394837" r="5"/>
12
+ </g>
13
+ <g id="hardpoint-03" data-name="SmallHardpoint2" data-journal-slot="SmallHardpoint2" data-socket="!Hardpoint2" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-4.81071919" data-offset-y-metres="-3.305160046">
14
+ <circle cx="281.959803" cy="312.394350" r="5"/>
15
+ </g>
16
+ </g>
17
+ </svg>
@@ -0,0 +1,32 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600" data-identity="anaconda" data-target-range-metres="1000" data-half-span-tangent="0.08">
2
+ <g id="gunsight" fill="none" stroke="#22333b" stroke-width="2">
3
+ <circle cx="300" cy="300" r="12"/>
4
+ <circle cx="300" cy="300" r="2" fill="#22333b" stroke="none"/>
5
+ </g>
6
+ <g id="weapon-dots" fill="#e63946" stroke="#ffffff" stroke-width="1.5">
7
+ <g id="hardpoint-01" data-name="LargeHardpoint1" data-journal-slot="LargeHardpoint1" data-socket="!Hardpoint0" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-0.0676546022" data-offset-y-metres="-16.49276972">
8
+ <circle cx="299.746295" cy="361.847886" r="5"/>
9
+ </g>
10
+ <g id="hardpoint-02" data-name="HugeHardpoint1" data-journal-slot="HugeHardpoint1" data-socket="!Hardpoint1" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-0.0500994027" data-offset-y-metres="-20.85164976">
11
+ <circle cx="299.812127" cy="378.193687" r="5"/>
12
+ </g>
13
+ <g id="hardpoint-03" data-name="LargeHardpoint2" data-journal-slot="LargeHardpoint2" data-socket="!Hardpoint2" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-6.395654671" data-offset-y-metres="-6.012909889">
14
+ <circle cx="276.016295" cy="322.548412" r="5"/>
15
+ </g>
16
+ <g id="hardpoint-04" data-name="LargeHardpoint3" data-journal-slot="LargeHardpoint3" data-socket="!Hardpoint3" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="6.260495193" data-offset-y-metres="-6.012919426">
17
+ <circle cx="323.476857" cy="322.548448" r="5"/>
18
+ </g>
19
+ <g id="hardpoint-05" data-name="MediumHardpoint2" data-journal-slot="MediumHardpoint2" data-socket="!Hardpoint4" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="8.197345741" data-offset-y-metres="-10.42525959">
20
+ <circle cx="330.740047" cy="339.094723" r="5"/>
21
+ </g>
22
+ <g id="hardpoint-06" data-name="MediumHardpoint1" data-journal-slot="MediumHardpoint1" data-socket="!Hardpoint5" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-8.332314484" data-offset-y-metres="-10.4250598">
23
+ <circle cx="268.753821" cy="339.093974" r="5"/>
24
+ </g>
25
+ <g id="hardpoint-07" data-name="SmallHardpoint2" data-journal-slot="SmallHardpoint2" data-socket="!Hardpoint7" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="1.396265395" data-offset-y-metres="-27.17289925">
26
+ <circle cx="305.235995" cy="401.898372" r="5"/>
27
+ </g>
28
+ <g id="hardpoint-08" data-name="SmallHardpoint1" data-journal-slot="SmallHardpoint1" data-socket="!Hardpoint8" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-1.532654636" data-offset-y-metres="-27.17029953">
29
+ <circle cx="294.252545" cy="401.888623" r="5"/>
30
+ </g>
31
+ </g>
32
+ </svg>
@@ -0,0 +1,26 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600" data-identity="asp" data-target-range-metres="1000" data-half-span-tangent="0.08">
2
+ <g id="gunsight" fill="none" stroke="#22333b" stroke-width="2">
3
+ <circle cx="300" cy="300" r="12"/>
4
+ <circle cx="300" cy="300" r="2" fill="#22333b" stroke="none"/>
5
+ </g>
6
+ <g id="weapon-dots" fill="#e63946" stroke="#ffffff" stroke-width="1.5">
7
+ <g id="hardpoint-01" data-name="SmallHardpoint1" data-journal-slot="SmallHardpoint1" data-socket="!Hardpoint4" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="4.393425578" data-offset-y-metres="-3.852212012">
8
+ <circle cx="316.475346" cy="314.445795" r="5"/>
9
+ </g>
10
+ <g id="hardpoint-02" data-name="SmallHardpoint2" data-journal-slot="SmallHardpoint2" data-socket="!Hardpoint5" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-4.393014318" data-offset-y-metres="-3.852212012">
11
+ <circle cx="283.526196" cy="314.445795" r="5"/>
12
+ </g>
13
+ <g id="hardpoint-03" data-name="SmallHardpoint3" data-journal-slot="SmallHardpoint3" data-socket="!Hardpoint6" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="0.8882707894" data-offset-y-metres="-5.805761874">
14
+ <circle cx="303.331015" cy="321.771607" r="5"/>
15
+ </g>
16
+ <g id="hardpoint-04" data-name="SmallHardpoint4" data-journal-slot="SmallHardpoint4" data-socket="!Hardpoint7" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-0.8607862056" data-offset-y-metres="-5.805761874">
17
+ <circle cx="296.772052" cy="321.771607" r="5"/>
18
+ </g>
19
+ <g id="hardpoint-05" data-name="MediumHardpoint1" data-journal-slot="MediumHardpoint1" data-socket="!Hardpoint8" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="4.019735926" data-offset-y-metres="-0.2208419442">
20
+ <circle cx="315.074010" cy="300.828157" r="5"/>
21
+ </g>
22
+ <g id="hardpoint-06" data-name="MediumHardpoint2" data-journal-slot="MediumHardpoint2" data-socket="!Hardpoint9" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-4.01976431" data-offset-y-metres="-0.2208419442">
23
+ <circle cx="284.925884" cy="300.828157" r="5"/>
24
+ </g>
25
+ </g>
26
+ </svg>
@@ -0,0 +1,20 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600" data-identity="asp_scout" data-target-range-metres="1000" data-half-span-tangent="0.08">
2
+ <g id="gunsight" fill="none" stroke="#22333b" stroke-width="2">
3
+ <circle cx="300" cy="300" r="12"/>
4
+ <circle cx="300" cy="300" r="2" fill="#22333b" stroke="none"/>
5
+ </g>
6
+ <g id="weapon-dots" fill="#e63946" stroke="#ffffff" stroke-width="1.5">
7
+ <g id="hardpoint-01" data-name="SmallHardpoint1" data-journal-slot="SmallHardpoint1" data-socket="!Hardpoint6" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="0.8882707894" data-offset-y-metres="-5.805761874">
8
+ <circle cx="303.331015" cy="321.771607" r="5"/>
9
+ </g>
10
+ <g id="hardpoint-02" data-name="SmallHardpoint2" data-journal-slot="SmallHardpoint2" data-socket="!Hardpoint7" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-0.8607862056" data-offset-y-metres="-5.805761874">
11
+ <circle cx="296.772052" cy="321.771607" r="5"/>
12
+ </g>
13
+ <g id="hardpoint-03" data-name="MediumHardpoint1" data-journal-slot="MediumHardpoint1" data-socket="!Hardpoint8" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="4.019735926" data-offset-y-metres="-0.2208419442">
14
+ <circle cx="315.074010" cy="300.828157" r="5"/>
15
+ </g>
16
+ <g id="hardpoint-04" data-name="MediumHardpoint2" data-journal-slot="MediumHardpoint2" data-socket="!Hardpoint9" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-4.01976431" data-offset-y-metres="-0.2208419442">
17
+ <circle cx="284.925884" cy="300.828157" r="5"/>
18
+ </g>
19
+ </g>
20
+ </svg>
@@ -0,0 +1,23 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600" data-identity="belugaliner" data-target-range-metres="1000" data-half-span-tangent="0.08">
2
+ <g id="gunsight" fill="none" stroke="#22333b" stroke-width="2">
3
+ <circle cx="300" cy="300" r="12"/>
4
+ <circle cx="300" cy="300" r="2" fill="#22333b" stroke="none"/>
5
+ </g>
6
+ <g id="weapon-dots" fill="#e63946" stroke="#ffffff" stroke-width="1.5">
7
+ <g id="hardpoint-01" data-name="MediumHardpoint1" data-journal-slot="MediumHardpoint1" data-socket="!Hardpoint6" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-3.867887652" data-offset-y-metres="19.74544048">
8
+ <circle cx="285.495421" cy="225.954598" r="5"/>
9
+ </g>
10
+ <g id="hardpoint-02" data-name="MediumHardpoint2" data-journal-slot="MediumHardpoint2" data-socket="!Hardpoint7" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="3.86789211" data-offset-y-metres="19.74544048">
11
+ <circle cx="314.504595" cy="225.954598" r="5"/>
12
+ </g>
13
+ <g id="hardpoint-03" data-name="MediumHardpoint3" data-journal-slot="MediumHardpoint3" data-socket="!Hardpoint8" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="3.1204e-06" data-offset-y-metres="-12.56546021">
14
+ <circle cx="300.000012" cy="347.120476" r="5"/>
15
+ </g>
16
+ <g id="hardpoint-04" data-name="MediumHardpoint4" data-journal-slot="MediumHardpoint4" data-socket="!Hardpoint11" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="9.956502282" data-offset-y-metres="-13.03135967">
17
+ <circle cx="337.336884" cy="348.867599" r="5"/>
18
+ </g>
19
+ <g id="hardpoint-05" data-name="MediumHardpoint5" data-journal-slot="MediumHardpoint5" data-socket="!Hardpoint12" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-10.04569784" data-offset-y-metres="-13.03135967">
20
+ <circle cx="262.328633" cy="348.867599" r="5"/>
21
+ </g>
22
+ </g>
23
+ </svg>
@@ -0,0 +1,20 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600" data-identity="cobramkiii" data-target-range-metres="1000" data-half-span-tangent="0.08">
2
+ <g id="gunsight" fill="none" stroke="#22333b" stroke-width="2">
3
+ <circle cx="300" cy="300" r="12"/>
4
+ <circle cx="300" cy="300" r="2" fill="#22333b" stroke="none"/>
5
+ </g>
6
+ <g id="weapon-dots" fill="#e63946" stroke="#ffffff" stroke-width="1.5">
7
+ <g id="hardpoint-01" data-name="MediumHardpoint1" data-journal-slot="MediumHardpoint1" data-socket="!Hardpoint0" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-2.725256026" data-offset-y-metres="-2.219459772">
8
+ <circle cx="289.780290" cy="308.322974" r="5"/>
9
+ </g>
10
+ <g id="hardpoint-02" data-name="MediumHardpoint2" data-journal-slot="MediumHardpoint2" data-socket="!Hardpoint1" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="4.300404012" data-offset-y-metres="-2.219459772">
11
+ <circle cx="316.126515" cy="308.322974" r="5"/>
12
+ </g>
13
+ <g id="hardpoint-03" data-name="SmallHardpoint2" data-journal-slot="SmallHardpoint2" data-socket="!Hardpoint2" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="19.62892336" data-offset-y-metres="-4.274562851">
14
+ <circle cx="373.608463" cy="316.029611" r="5"/>
15
+ </g>
16
+ <g id="hardpoint-04" data-name="SmallHardpoint1" data-journal-slot="SmallHardpoint1" data-socket="!Hardpoint3" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-18.16507536" data-offset-y-metres="-4.274562851">
17
+ <circle cx="231.880967" cy="316.029611" r="5"/>
18
+ </g>
19
+ </g>
20
+ </svg>
@@ -0,0 +1,23 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600" data-identity="cobramkiv" data-target-range-metres="1000" data-half-span-tangent="0.08">
2
+ <g id="gunsight" fill="none" stroke="#22333b" stroke-width="2">
3
+ <circle cx="300" cy="300" r="12"/>
4
+ <circle cx="300" cy="300" r="2" fill="#22333b" stroke="none"/>
5
+ </g>
6
+ <g id="weapon-dots" fill="#e63946" stroke="#ffffff" stroke-width="1.5">
7
+ <g id="hardpoint-01" data-name="MediumHardpoint1" data-journal-slot="MediumHardpoint1" data-socket="!Hardpoint0" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-2.725256026" data-offset-y-metres="-2.219459772">
8
+ <circle cx="289.780290" cy="308.322974" r="5"/>
9
+ </g>
10
+ <g id="hardpoint-02" data-name="MediumHardpoint2" data-journal-slot="MediumHardpoint2" data-socket="!Hardpoint1" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="4.300404012" data-offset-y-metres="-2.219459772">
11
+ <circle cx="316.126515" cy="308.322974" r="5"/>
12
+ </g>
13
+ <g id="hardpoint-03" data-name="SmallHardpoint2" data-journal-slot="SmallHardpoint2" data-socket="!Hardpoint2" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="3.627923906" data-offset-y-metres="1.653739929">
14
+ <circle cx="313.604715" cy="293.798475" r="5"/>
15
+ </g>
16
+ <g id="hardpoint-04" data-name="SmallHardpoint1" data-journal-slot="SmallHardpoint1" data-socket="!Hardpoint3" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-2.16423589" data-offset-y-metres="1.653739929">
17
+ <circle cx="291.884115" cy="293.798475" r="5"/>
18
+ </g>
19
+ <g id="hardpoint-05" data-name="SmallHardpoint3" data-journal-slot="SmallHardpoint3" data-socket="!Hardpoint8" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="0.7319211364" data-offset-y-metres="1.53098011">
20
+ <circle cx="302.744704" cy="294.258825" r="5"/>
21
+ </g>
22
+ </g>
23
+ </svg>
@@ -0,0 +1,23 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600" data-identity="cobramkv" data-target-range-metres="1000" data-half-span-tangent="0.08">
2
+ <g id="gunsight" fill="none" stroke="#22333b" stroke-width="2">
3
+ <circle cx="300" cy="300" r="12"/>
4
+ <circle cx="300" cy="300" r="2" fill="#22333b" stroke="none"/>
5
+ </g>
6
+ <g id="weapon-dots" fill="#e63946" stroke="#ffffff" stroke-width="1.5">
7
+ <g id="hardpoint-01" data-name="MediumHardpoint1" data-journal-slot="MediumHardpoint1" data-socket="!Hardpoint0" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-6.025300026" data-offset-y-metres="-2.749541938">
8
+ <circle cx="277.405125" cy="310.310782" r="5"/>
9
+ </g>
10
+ <g id="hardpoint-02" data-name="MediumHardpoint2" data-journal-slot="MediumHardpoint2" data-socket="!Hardpoint1" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="6.025300026" data-offset-y-metres="-2.749541938">
11
+ <circle cx="322.594875" cy="310.310782" r="5"/>
12
+ </g>
13
+ <g id="hardpoint-03" data-name="SmallHardpoint2" data-journal-slot="SmallHardpoint2" data-socket="!Hardpoint2" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="8.157999992" data-offset-y-metres="-1.031039953">
14
+ <circle cx="330.592500" cy="303.866400" r="5"/>
15
+ </g>
16
+ <g id="hardpoint-04" data-name="SmallHardpoint1" data-journal-slot="SmallHardpoint1" data-socket="!Hardpoint3" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-8.157670021" data-offset-y-metres="-1.031039953">
17
+ <circle cx="269.408737" cy="303.866400" r="5"/>
18
+ </g>
19
+ <g id="hardpoint-05" data-name="MediumHardpoint3" data-journal-slot="MediumHardpoint3" data-socket="!Hardpoint8" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="0" data-offset-y-metres="3.086419821">
20
+ <circle cx="300.000000" cy="288.425926" r="5"/>
21
+ </g>
22
+ </g>
23
+ </svg>
@@ -0,0 +1,26 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 600" data-identity="corsair" data-target-range-metres="1000" data-half-span-tangent="0.08">
2
+ <g id="gunsight" fill="none" stroke="#22333b" stroke-width="2">
3
+ <circle cx="300" cy="300" r="12"/>
4
+ <circle cx="300" cy="300" r="2" fill="#22333b" stroke="none"/>
5
+ </g>
6
+ <g id="weapon-dots" fill="#e63946" stroke="#ffffff" stroke-width="1.5">
7
+ <g id="hardpoint-01" data-name="LargeHardpoint1" data-journal-slot="LargeHardpoint1" data-socket="!Hardpoint0" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-0.000246232" data-offset-y-metres="1.928740025">
8
+ <circle cx="299.999077" cy="292.767225" r="5"/>
9
+ </g>
10
+ <g id="hardpoint-02" data-name="LargeHardpoint2" data-journal-slot="LargeHardpoint2" data-socket="!Hardpoint1" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-3.847556298" data-offset-y-metres="-5.660593912">
11
+ <circle cx="285.571664" cy="321.227227" r="5"/>
12
+ </g>
13
+ <g id="hardpoint-03" data-name="LargeHardpoint3" data-journal-slot="LargeHardpoint3" data-socket="!Hardpoint2" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="3.846753652" data-offset-y-metres="-5.660593912">
14
+ <circle cx="314.425326" cy="321.227227" r="5"/>
15
+ </g>
16
+ <g id="hardpoint-04" data-name="MediumHardpoint3" data-journal-slot="MediumHardpoint3" data-socket="!Hardpoint3" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-0.000246232" data-offset-y-metres="-12.9786396">
17
+ <circle cx="299.999077" cy="348.669899" r="5"/>
18
+ </g>
19
+ <g id="hardpoint-05" data-name="MediumHardpoint2" data-journal-slot="MediumHardpoint2" data-socket="!Hardpoint4" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="-3.895796245" data-offset-y-metres="0.2843203545">
20
+ <circle cx="285.390764" cy="298.933799" r="5"/>
21
+ </g>
22
+ <g id="hardpoint-06" data-name="MediumHardpoint1" data-journal-slot="MediumHardpoint1" data-socket="!Hardpoint5" data-direction-ratio-x="0" data-direction-ratio-y="0" data-offset-x-metres="3.895303781" data-offset-y-metres="0.2843203545">
23
+ <circle cx="314.607389" cy="298.933799" r="5"/>
24
+ </g>
25
+ </g>
26
+ </svg>