@elite-dangerous-almanac/core 0.1.5 → 0.1.7

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 (204) hide show
  1. package/PROVENANCE/i18n/SOURCES.md +107 -51
  2. package/PROVENANCE/ships/SOURCES.md +43 -2
  3. package/README.md +11 -5
  4. package/THIRD_PARTY_NOTICES.md +3 -0
  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-MTAGULIO.js.map → chunk-2VPVZELZ.js.map} +1 -1
  57. package/dist/{chunk-6RLMBSXE.js → chunk-4S6WB7QR.js} +1 -1
  58. package/dist/chunk-4TFAZX73.js +1 -0
  59. package/dist/{chunk-EJMNNQIS.js.map → chunk-4TFAZX73.js.map} +1 -1
  60. package/dist/chunk-4ZGUSHTP.js +1 -0
  61. package/dist/{chunk-CTJQPQRA.js.map → chunk-4ZGUSHTP.js.map} +1 -1
  62. package/dist/{chunk-XT6KKGSE.js → chunk-6G6TYW2D.js} +1 -1
  63. package/dist/chunk-AFS6HN3D.js +1 -0
  64. package/dist/chunk-AFS6HN3D.js.map +1 -0
  65. package/dist/{chunk-XN6Q7LWU.js → chunk-CJWFY6OX.js} +1 -1
  66. package/dist/{chunk-UBYO7VZR.js → chunk-DBGXZF7O.js} +1 -1
  67. package/dist/{chunk-H3HMVGEY.js → chunk-EKQCVCMK.js} +1 -1
  68. package/dist/chunk-ELT3FEA4.js +1 -0
  69. package/dist/{chunk-3IMWUYXJ.js.map → chunk-ELT3FEA4.js.map} +1 -1
  70. package/dist/chunk-EXVCRIDP.js +1 -0
  71. package/dist/chunk-EXVCRIDP.js.map +1 -0
  72. package/dist/{chunk-EKWLAHRG.js → chunk-GRSNX36B.js} +1 -1
  73. package/dist/{chunk-EKWLAHRG.js.map → chunk-GRSNX36B.js.map} +1 -1
  74. package/dist/chunk-GVNTKCVF.js +1 -0
  75. package/dist/chunk-GVNTKCVF.js.map +1 -0
  76. package/dist/{chunk-FEER4ERG.js → chunk-IOJXLDJN.js} +1 -1
  77. package/dist/chunk-J42ZXLBL.js +1 -0
  78. package/dist/{chunk-GKDEI2SQ.js.map → chunk-J42ZXLBL.js.map} +1 -1
  79. package/dist/{chunk-PHPLZEFS.js → chunk-JPBMRJFC.js} +1 -1
  80. package/dist/{chunk-PHPLZEFS.js.map → chunk-JPBMRJFC.js.map} +1 -1
  81. package/dist/chunk-KJFUNIIY.js +1 -0
  82. package/dist/{chunk-TFPIPIMU.js.map → chunk-KJFUNIIY.js.map} +1 -1
  83. package/dist/{chunk-QMFBL5XO.js → chunk-LLHGSBPI.js} +1 -1
  84. package/dist/{chunk-QMFBL5XO.js.map → chunk-LLHGSBPI.js.map} +1 -1
  85. package/dist/{chunk-FGNJ7EVM.js → chunk-LZYHBFJC.js} +1 -1
  86. package/dist/{chunk-FGNJ7EVM.js.map → chunk-LZYHBFJC.js.map} +1 -1
  87. package/dist/chunk-M6G3UDTX.js +1 -0
  88. package/dist/chunk-M6G3UDTX.js.map +1 -0
  89. package/dist/{chunk-DLLBARN5.js → chunk-MKGJPVPS.js} +1 -1
  90. package/dist/{chunk-QI22FKBG.js → chunk-Q3QCLNVG.js} +1 -1
  91. package/dist/{chunk-QI22FKBG.js.map → chunk-Q3QCLNVG.js.map} +1 -1
  92. package/dist/chunk-RVIYOHYF.js +1 -0
  93. package/dist/chunk-RVIYOHYF.js.map +1 -0
  94. package/dist/chunk-SD6GNFDX.js +1 -0
  95. package/dist/chunk-SD6GNFDX.js.map +1 -0
  96. package/dist/chunk-SNADUQSJ.js +1 -0
  97. package/dist/chunk-SNADUQSJ.js.map +1 -0
  98. package/dist/chunk-TEOJCBSG.js +1 -0
  99. package/dist/chunk-TEOJCBSG.js.map +1 -0
  100. package/dist/chunk-TW7LUBHD.js +1 -0
  101. package/dist/{chunk-HRVIHQ4A.js.map → chunk-TW7LUBHD.js.map} +1 -1
  102. package/dist/{chunk-O72KI7RP.js → chunk-UHSNB5SV.js} +1 -1
  103. package/dist/chunk-V4C6FIE2.js +1 -0
  104. package/dist/{chunk-TLA6LHLN.js.map → chunk-V4C6FIE2.js.map} +1 -1
  105. package/dist/chunk-VDVFJXX5.js +1 -0
  106. package/dist/{chunk-PNZCLQDJ.js.map → chunk-VDVFJXX5.js.map} +1 -1
  107. package/dist/chunk-Z6XMXMVI.js +1 -0
  108. package/dist/{chunk-2J2UV4ZX.js.map → chunk-Z6XMXMVI.js.map} +1 -1
  109. package/dist/{chunk-VB3XZGIB.js → chunk-ZRG35JSH.js} +1 -1
  110. package/dist/{chunk-77QR33ON.js → chunk-ZZT2PQZ5.js} +1 -1
  111. package/dist/i18n/blueprints.d.ts +2 -1
  112. package/dist/i18n/blueprints.js +1 -1
  113. package/dist/i18n/diagnostics.d.ts +2 -0
  114. package/dist/i18n/diagnostics.js +1 -1
  115. package/dist/i18n/engineering-groups.d.ts +2 -2
  116. package/dist/i18n/engineering-groups.js +1 -1
  117. package/dist/i18n/experimental-effect-descriptions.js +1 -1
  118. package/dist/i18n/experimental-effects.js +1 -1
  119. package/dist/i18n/index.d.ts +32 -1
  120. package/dist/i18n/index.js +1 -1
  121. package/dist/i18n/materials.d.ts +2 -3
  122. package/dist/i18n/materials.js +1 -1
  123. package/dist/i18n/micro-resources.d.ts +2 -3
  124. package/dist/i18n/micro-resources.js +1 -1
  125. package/dist/i18n/module-families.d.ts +32 -0
  126. package/dist/i18n/module-families.js +1 -0
  127. package/dist/i18n/module-families.js.map +1 -0
  128. package/dist/i18n/modules.d.ts +3 -4
  129. package/dist/i18n/modules.js +1 -1
  130. package/dist/i18n/pre-engineered.js +1 -1
  131. package/dist/i18n/ships.js +1 -1
  132. package/dist/i18n/slots.js +1 -1
  133. package/dist/materials/index.js +1 -1
  134. package/dist/materials/materials-all.js +1 -1
  135. package/dist/materials/materials.js +1 -1
  136. package/dist/materials/micro-resources-all.js +1 -1
  137. package/dist/materials/micro-resources.js +1 -1
  138. package/dist/ships/blueprint-costs.d.ts +3 -1
  139. package/dist/ships/blueprint-costs.js +1 -1
  140. package/dist/ships/blueprint-costs.js.map +1 -1
  141. package/dist/ships/blueprints.d.ts +4 -1
  142. package/dist/ships/blueprints.js +1 -1
  143. package/dist/ships/engineering.d.ts +1 -0
  144. package/dist/ships/experimental-effect-costs.d.ts +3 -2
  145. package/dist/ships/experimental-effect-costs.js +1 -1
  146. package/dist/ships/experimental-effect-costs.js.map +1 -1
  147. package/dist/ships/experimental-effects.d.ts +3 -1
  148. package/dist/ships/experimental-effects.js +1 -1
  149. package/dist/ships/gunsights.js +1 -1
  150. package/dist/ships/index.d.ts +7 -5
  151. package/dist/ships/index.js +1 -1
  152. package/dist/ships/loadout-validation.d.ts +1 -0
  153. package/dist/ships/module-capabilities.d.ts +1 -0
  154. package/dist/ships/module-families.d.ts +49 -0
  155. package/dist/ships/module-families.js +1 -0
  156. package/dist/ships/module-families.js.map +1 -0
  157. package/dist/ships/module-limits.d.ts +1 -0
  158. package/dist/ships/modules-all.d.ts +1 -0
  159. package/dist/ships/modules-all.js +1 -1
  160. package/dist/ships/modules-core.d.ts +1 -0
  161. package/dist/ships/modules-core.js +1 -1
  162. package/dist/ships/modules-hardpoint.d.ts +2 -0
  163. package/dist/ships/modules-hardpoint.js +1 -1
  164. package/dist/ships/modules-internal.d.ts +2 -0
  165. package/dist/ships/modules-internal.js +1 -1
  166. package/dist/ships/modules-utility.d.ts +2 -0
  167. package/dist/ships/modules-utility.js +1 -1
  168. package/dist/ships/modules.d.ts +23 -5
  169. package/dist/ships/modules.js +1 -1
  170. package/dist/ships/pre-engineered-stats.d.ts +1 -0
  171. package/dist/ships/pre-engineered-stats.js +1 -1
  172. package/dist/ships/pre-engineered.js +1 -1
  173. package/dist/ships/ship-loadout.d.ts +73 -32
  174. package/dist/ships/ship-loadout.js +1 -1
  175. package/dist/ships/weapons.d.ts +1 -0
  176. package/package.json +9 -1
  177. package/dist/chunk-2J2UV4ZX.js +0 -1
  178. package/dist/chunk-3IMWUYXJ.js +0 -1
  179. package/dist/chunk-CTJQPQRA.js +0 -1
  180. package/dist/chunk-DAQ3PJ4R.js +0 -1
  181. package/dist/chunk-DAQ3PJ4R.js.map +0 -1
  182. package/dist/chunk-E45EDCYH.js +0 -1
  183. package/dist/chunk-E45EDCYH.js.map +0 -1
  184. package/dist/chunk-EJMNNQIS.js +0 -1
  185. package/dist/chunk-GKDEI2SQ.js +0 -1
  186. package/dist/chunk-HRVIHQ4A.js +0 -1
  187. package/dist/chunk-M5IBENCW.js +0 -1
  188. package/dist/chunk-M5IBENCW.js.map +0 -1
  189. package/dist/chunk-MTAGULIO.js +0 -1
  190. package/dist/chunk-PNZCLQDJ.js +0 -1
  191. package/dist/chunk-TFPIPIMU.js +0 -1
  192. package/dist/chunk-TLA6LHLN.js +0 -1
  193. package/dist/chunk-XULHGGG4.js +0 -1
  194. package/dist/chunk-XULHGGG4.js.map +0 -1
  195. /package/dist/{chunk-6RLMBSXE.js.map → chunk-4S6WB7QR.js.map} +0 -0
  196. /package/dist/{chunk-XT6KKGSE.js.map → chunk-6G6TYW2D.js.map} +0 -0
  197. /package/dist/{chunk-XN6Q7LWU.js.map → chunk-CJWFY6OX.js.map} +0 -0
  198. /package/dist/{chunk-UBYO7VZR.js.map → chunk-DBGXZF7O.js.map} +0 -0
  199. /package/dist/{chunk-H3HMVGEY.js.map → chunk-EKQCVCMK.js.map} +0 -0
  200. /package/dist/{chunk-FEER4ERG.js.map → chunk-IOJXLDJN.js.map} +0 -0
  201. /package/dist/{chunk-DLLBARN5.js.map → chunk-MKGJPVPS.js.map} +0 -0
  202. /package/dist/{chunk-O72KI7RP.js.map → chunk-UHSNB5SV.js.map} +0 -0
  203. /package/dist/{chunk-VB3XZGIB.js.map → chunk-ZRG35JSH.js.map} +0 -0
  204. /package/dist/{chunk-77QR33ON.js.map → chunk-ZZT2PQZ5.js.map} +0 -0
@@ -6,6 +6,21 @@ 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
+ **Six locales are stored: `en`, `de`, `es`, `fr`, `pt` and `ru`.** Several accepted
10
+ sources publish more — Italian, Hungarian, Georgian and Simplified Chinese among them —
11
+ and those values are deliberately not carried: the project supports those six languages
12
+ and no others. That is a decision about this catalogue, not a gap in any source, so
13
+ re-deriving a catalogue from its source must drop the other columns again rather than
14
+ restore them. Every locale is stored under a bare language tag; a regional or script tag
15
+ resolves to its language.
16
+
17
+ **`pt` is Brazilian Portuguese.** Every accepted source publishes exactly one Portuguese
18
+ column and it is the Brazilian one: Odyssey Materials Helper's CSVs and EDSY's
19
+ `lang-pt.json` carry Brazilian spellings, EDDI's only populated Portuguese resource file
20
+ is `Modules.pt-BR.resx` (its `pt-PT` sibling is an empty stub), and Frontier's own
21
+ in-game localisation ships pt-BR and no European Portuguese. Storing it under the bare
22
+ tag follows the rule above, so `pt-PT` resolves to Brazilian Portuguese.
23
+
9
24
  ## `module-names.jsonc`
10
25
 
11
26
  - **Acquired:** 2026-08-14 UTC.
@@ -19,31 +34,47 @@ translation.
19
34
  Almanac's canonical English name. This prevents broad EDDI families such as
20
35
  `CargoRack`, `MissileRack` and `PlanetaryApproachSuite` from erasing the distinct Mk II,
21
36
  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
37
+ `namekey` fill a missing `de`, `es`, `fr` or `ru` value only when EDSY's English
23
38
  module name also exactly equals the canonical name. Values shared by modules with one
24
39
  canonical name are retained only when they agree, then stored once under that name.
25
40
  - **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.
41
+ in German, 1,090 in Spanish, 1,088 in French, 1,155 in Brazilian Portuguese and 1,153
42
+ in Russian. Portuguese comes from the same two joins, reading EDDI's
43
+ `Modules.pt-BR.resx` and EDSY's `lang-pt.json`.
29
44
  - **Manual corrections:** none.
30
45
 
31
46
  ## `blueprint-names.jsonc`
32
47
 
33
- - **Acquired:** 2026-08-14 UTC.
48
+ - **Acquired:** EDSY 2026-08-14 UTC; the in-game modification names 2026-08-23 UTC.
34
49
  - **EDSY revision:** commit `e446fbe6e4597dea7ab0bd3105b9a36642388040`;
35
50
  database version `424009901`, last-modified marker `20260810`.
51
+ - **In-game localisation revision:** none published; the game ships no immutable
52
+ identifier for its localisation tables. The acquired table is the evidence.
36
53
  - **Derivation:** each of the 107 current keys and its English name comes from
37
- `data/ships/blueprints.jsonc`. The Frontier `fdname` joins directly to EDSY's
38
- `blueprint.fdname`; that record's id selects an explicit `blueprint-<id>` entry from
39
- each language file. Names remain keyed per blueprint because a single English phrase
40
- can have different grammatical translations for different module families.
41
- - **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
43
- and other newer records EDSY does not identify or translate.
44
- - **Manual corrections:** EDSY's French `FSD_FastBoot` value ends in one accidental
45
- ASCII space; the stored display name removes it so a successful lookup is already
46
- trimmed like every other catalogue name.
54
+ `data/ships/blueprints.jsonc`. Names remain keyed per blueprint because a single
55
+ English phrase can have different grammatical translations for different module
56
+ families. The Frontier `fdname` joins case-insensitively to the in-game modification
57
+ name table, which supplies every locale for the 90 recipes it names. The remaining 17
58
+ are ids this repository keys separately because their numbers differ, where the game
59
+ offers only the generic recipe's menu entry and so publishes only its name: each takes
60
+ the locales of the generic id it shadows `AFM_Shielded`, `Refineries_Shielded` and
61
+ the four limpet-controller Shielded recipes from `Misc_Shielded`, the four
62
+ `LightWeight` and four `Reinforced` limpet recipes from `Misc_LightWeight` and
63
+ `Misc_Reinforced`, `MC_Overcharged` from `Weapon_Overcharged`, and `Scanner_LongRange`
64
+ and `Scanner_WideAngle` from `Sensor_LongRange` and `Sensor_WideAngle`. The last three
65
+ of those pairs are the same shadowing `blueprint-journal-names.jsonc` already records,
66
+ where the game writes the generic id for a recipe this repository keys specifically.
67
+ Only the English differs between a shadowing id and its generic: the Almanac's own
68
+ canonical name is kept, as it is for every other blueprint. Where EDSY and the in-game
69
+ table disagree the in-game value is kept, as everywhere else in this repository: it
70
+ differs for ten values across four locales, all of them wording, none of them meaning.
71
+ - **Coverage:** complete. All 107 blueprints carry all six locales.
72
+ - **Manual corrections:** two values in the in-game table carry a stray leading or
73
+ trailing ASCII space, marked in the acquired table and removed here so a successful
74
+ lookup is already trimmed like every other catalogue name: French `FSD_FastBoot` (which
75
+ EDSY carries with the same trailing space) and German `Railgun_LongShot`. The
76
+ Portuguese `GuardianModule_Sturdy` and `GuardianWeapon_Sturdy` values carry a literal
77
+ `<br>` line break for the in-game layout, which is stored as a single space.
47
78
 
48
79
  ## `experimental-effect-names.jsonc`
49
80
 
@@ -55,7 +86,7 @@ translation.
55
86
  EDSY's `expeffect.fdname`; that record's id selects an explicit `expeffect-<id>` entry
56
87
  from each language file.
57
88
  - **Coverage:** English covers all 86 effects; EDSY covers 84 in German and 85 each in
58
- Spanish, French, Portuguese and Russian.
89
+ Spanish, French, Brazilian Portuguese and Russian.
59
90
  - **Manual corrections:** none.
60
91
 
61
92
  ## `material-names.jsonc`
@@ -73,11 +104,7 @@ translation.
73
104
  parenthetical Guardian and Thargoid category labels where the owning catalogue does;
74
105
  localized columns remain verbatim source values.
75
106
  - **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.
107
+ translations cover 128 in German, and 140 each in French and Brazilian Portuguese.
81
108
  - **Manual corrections:** none.
82
109
 
83
110
  ## `micro-resource-names.jsonc`
@@ -94,18 +121,14 @@ translation.
94
121
  localized columns are copied. Twenty-eight of the 30 in-game-backed records also have
95
122
  rows in Odyssey Materials Helper, while `PowerVirus` and
96
123
  `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.
124
+ German, Spanish, French and Russian. In both cases the owning catalogue remains
125
+ authoritative for canonical English names.
100
126
  - **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.
127
+ translations cover 218 in German, 225 in French and 188 in Brazilian Portuguese. The
128
+ 30 in-game-backed records take Portuguese from Odyssey Materials Helper where it has a
129
+ row, because the in-game capture supplied no Portuguese; `PowerVirus` and
130
+ `SmallCapacityPowerRegulator`, which the source does not carry at all, have none.
131
+ - **Manual corrections:** none.
109
132
 
110
133
  ## `ship-names.jsonc`
111
134
 
@@ -120,10 +143,12 @@ translation.
120
143
  from `data/ships/ships.jsonc`. The symbol is joined to Odyssey Materials
121
144
  Helper's `ships.name.*` key after removing punctuation and folding case. EDSY's
122
145
  `eddb.js` `ship.fdname` supplies the second join, with explicit `ship-<id>` language
123
- 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.
146
+ entries filling locales absent from the CSV. The CSV keys a row by the ship's display
147
+ name rather than its symbol, which differ for the four hulls whose name carries a mark
148
+ the symbol omits (`Viper` is `ships.name.viper_mk_iii`), so the name is tried first and
149
+ the symbol second. The resulting source-backed coverage is 48 ships in Spanish, 44 in
150
+ French, 38 in Brazilian Portuguese and 48 in Russian; no accepted source carries a
151
+ German ship-name table.
127
152
  - **Standing conclusion:** every source-backed non-English value is byte-for-byte equal
128
153
  to the canonical English ship name. The explicit values remain in the catalogue so a
129
154
  lookup distinguishes a source-backed same spelling from an unavailable translation.
@@ -144,21 +169,42 @@ translation.
144
169
 
145
170
  - **Acquired:** 2026-08-18 UTC.
146
171
  - **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
172
+ database version `424009901`, last-modified marker `20260810`; `lang-en.json` and
173
+ `lang-ru.json` have Git blob ids `9b199db635f7b968b75c8e9a14bdce68e37e4120` and
151
174
  `36496372d056754c34da03ca6836e27987c96b6a` respectively.
152
175
  - **Derivation:** each of the 48 group ids and its canonical English name is projected
153
176
  from `data/ships/engineering-options.jsonc`. That catalogue derives its group menus
154
177
  from EDSY, with the supplemental sources and corrections recorded in
155
178
  `data/ships/SOURCES.md`. Where a canonical English name matches an EDSY `mtype-*`
156
179
  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`.
180
+ are copied from `lang-ru.json`.
181
+ - **Coverage:** canonical English covers every engineering option group; Brazilian
182
+ Portuguese and Russian each cover 44 of 48. The Guardian power-plant, power-distributor
183
+ and hull-reinforcement groups have no distinct EDSY label, and EDSY carries no value in
184
+ either language for `frameShiftDrivesSCO`.
185
+ - **Manual corrections:** none.
186
+
187
+ ## `module-family-names.jsonc`
188
+
189
+ - **Acquired:** 2026-08-23 UTC.
190
+ - **In-game localisation revision:** none published; the game ships no immutable
191
+ identifier for its localisation tables. The acquired table is the evidence.
192
+ - **Derivation:** each of the 77 family ids and its canonical English name is projected
193
+ from `data/ships/module-families.jsonc`, whose own derivation is recorded in
194
+ `data/ships/SOURCES.md`. 58 of them are named by an in-game outfitting category, and
195
+ those categories' explicit German, Spanish, French, Brazilian Portuguese and Russian
196
+ labels are copied verbatim. The join is on family identity rather than on English
197
+ string equality, because the English column of the in-game table *is* the canonical
198
+ English name the ships catalogue took from it.
199
+ - **Coverage:** English covers all 77 families; the five other locales cover the same 58.
200
+ The 19 without a source-backed label are the families the in-game outfitting screen
201
+ does not name separately: `axMissileRacks`, `axMultiCannons`, `cargoHatches`,
202
+ `causticSinkLaunchers`, `guardianGaussCannons`, `guardianHybridPowerDistributors`,
203
+ `guardianHybridPowerPlants`, `guardianNaniteTorpedoPylons`, `guardianPlasmaChargers`,
204
+ `guardianShardCannons`, `guardianShieldReinforcementPackages`,
205
+ `miningMultiLimpetControllers`, `remoteReleaseFlakLaunchers`,
206
+ `remoteReleaseFlechetteLaunchers`, `shockCannons`, `shutdownFieldNeutralisers`,
207
+ `subSurfaceDisplacementMissiles`, `subSurfaceExtractionMissiles` and `xenoScanners`.
162
208
  - **Manual corrections:** none.
163
209
 
164
210
  ## `experimental-effect-descriptions.jsonc`
@@ -175,22 +221,32 @@ translation.
175
221
 
176
222
  ## `pre-engineered-variant-names.jsonc`
177
223
 
178
- - **Acquired:** 2026-08-18 UTC.
224
+ - **Acquired:** 2026-08-18 UTC; the Merc-shop names 2026-08-22 UTC.
179
225
  - **Derivation:** all 76 compound identities and English names come from
180
226
  `data/ships/pre-engineered.jsonc`. An identity combines the base module symbol,
181
227
  blueprint, optional experimental effect and acquisition route. When a variant name
182
228
  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
229
+ `module-names.jsonc`; the 41 distinct display records are stored once. Fixed reward
184
230
  names such as the three `Decorative_*` festive launchers remain canonical English.
231
+ - **The 22 Merc-shop rows carry the shop's own names**, in 14 distinct records — the shop
232
+ sells a "Far-Reaching Abrasion Blaster", not an Abrasion Blaster — so they do not reuse
233
+ their base module's record. English and the German, Spanish, French and Russian values
234
+ are supplied by the repository owner from the in-game shop listing; no registry
235
+ publishes them.
185
236
  - **Coverage:** English covers every variant. Ordinary names inherit the explicit
186
- localized values available for their base module; fixed reward names have no accepted
237
+ localized values available for their base module, which now includes Brazilian
238
+ Portuguese on 51 of the 76 variants; the Merc-shop names carry the five locales the
239
+ repository owner supplied and no Portuguese; fixed reward names have no accepted
187
240
  translation source.
188
241
  - **Manual corrections:** none.
189
242
 
190
243
  ## Known gaps
191
244
 
192
245
  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
246
+ stored locale. A language absent from all eleven catalogues is the locale decision
247
+ recorded above rather than a gap. The accepted sources carry only canonical English for
248
+ ship manufacturers, experimental-effect descriptions, 19 of the 77 outfitting-family
249
+ labels, some engineering-group labels, slot and restriction labels, fixed reward names,
250
+ and structured loadout, calculation, SLEF and edit messages. Missing source-backed
251
+ translations remain tracked by
196
252
  [#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,42 @@ 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
+ - **`familyId` groups every outfitting list.** Every record in all four catalogues
389
+ carries the id of the family its outfitting list shows it under: 521 core modules in
390
+ 8 families, 484 internal modules in 32, 159 hardpoints in 25, and 35 utility fittings
391
+ in 12. No family crosses an outfitting category. The ids and their canonical English
392
+ names are `module-families.jsonc`, below; localized labels are
393
+ `data/i18n/module-family-names.jsonc`. Variants remain with the base family rather
394
+ than fragmenting a list: Bi-Weave and Prismatic generators are `shieldGenerators`;
395
+ corrosion-resistant and Mk II racks are `cargoRacks`; Powerplay and pre-engineered
396
+ weapons stay with their base weapon; Mk I/Mk II cabins and vessel hangars share
397
+ `passengerCabins` and `vesselHangars`. Guardian and AX weapons retain their distinct
398
+ family where their function differs. A core record's family follows from its `slot`,
399
+ which is on every one of them, so the two never disagree.
400
+
401
+ ### `module-families.jsonc` — the family ids and their English names
402
+
403
+ - **Source:** Frontier's in-game outfitting category labels, acquired 2026-08-23 UTC
404
+ and supplied by the repository owner. The game publishes no immutable identifier for
405
+ its localisation tables, so the acquired table is the evidence; it is the same table
406
+ that supplies `data/i18n/module-family-names.jsonc`.
407
+ - **Derivation:** 58 of the 77 families are named by an in-game outfitting category and
408
+ take that category's English label verbatim — which is why `Cargo Scanners` is
409
+ `Manifest Scanners`, `Torpedo Pylons` is `Torpedoes` and `Mine Launchers` is `Mines`.
410
+ The remaining 19 keep the Almanac's own descriptive name, because the outfitting
411
+ screen does not name them separately. Each id is the camelCase form of its English
412
+ name with punctuation removed, which `modules.test.ts` asserts, so an id and its
413
+ label cannot drift apart.
414
+ - **Merged families.** Where the game lists several Almanac families under one category,
415
+ they are one family here: the operations, rescue, universal and xeno multi-limpet
416
+ controllers are `multiLimpetControllers`; mining volley repeaters and seismic charge
417
+ launchers are `miningTools`; the Mk II Plasma Shock Accelerator is a
418
+ `plasmaAccelerators`; the Supercruise Assist is a `flightAssists`. Mining multi-limpet
419
+ controllers are deliberately **not** merged, and keep their own family.
420
+ - **The in-game English is not always the better name**, and is kept anyway so the
421
+ library's label is the one a player sees on the outfitting screen: `engines` for
422
+ thrusters, `fsd` for Frame Shift Drives, `afms` for Auto Field-Maintenance Units,
423
+ `ecms` for Electronic Countermeasures, and the singular `pulseWaveAnalyser`.
390
424
  - **Stats source:** coriolis-data `modules/**` for the mechanical, defence, power and
391
425
  weapon stats; EDSY `eddb.js` for mass, integrity, power draw, boot time and the
392
426
  engineering base stats coriolis does not carry; and in-game verification for the
@@ -1732,6 +1766,13 @@ up straight through with no disambiguation at all. Both paths are evidence that
1732
1766
  and several rows are annotated as having been obtainable both ways — the six SCO "V1"
1733
1767
  drives most obviously. `acquisition` records the tag; it is not a claim that no other
1734
1768
  route ever existed.
1769
+ - **`name` is the base module's name, except on the Merc-shop rows.** A community-goal or
1770
+ tech-broker article is listed under the module it fits as, so those rows carry the
1771
+ catalogue name verbatim. The 22 `mercenary` rows do not: the shop sells the
1772
+ "Far-Reaching Abrasion Blaster" and the "Support Focused Power Distributor" under those
1773
+ names, 14 distinct ones over the 22 rows. Supplied by the repository owner from the
1774
+ in-game shop listing, acquired 2026-08-22 UTC; the registries carry the transformation,
1775
+ not the label. Their localized values are recorded in `data/i18n/SOURCES.md`.
1735
1776
  - **`engineeringLocked: true` marks 12 final weapon rows:** the seven pre-engineered
1736
1777
  Guardian weapons and the five fixed Enzyme/AX articles. Their evidence is recorded once
1737
1778
  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
@@ -137,6 +137,9 @@ a verbatim copy produced at build time — edit this file, never the copy.
137
137
  [update notes](https://forums.frontier.co.uk/threads/648012/), and the
138
138
  [Rhea Disaster Community Goal](https://forums.frontier.co.uk/threads/deliver-critical-aid-for-the-rhea-disaster.626528/)
139
139
  with its [announcement](https://x.com/EliteDangerous/status/1812792503776489745).
140
+ Frontier's own **in-game localisation** supplies the outfitting category labels behind
141
+ the module families and their German, Spanish, French, Brazilian Portuguese and Russian
142
+ display text, and the engineering modification names in the six stored locales.
140
143
  Values read directly from the running game are Frontier's too — see the notice below.
141
144
  - **A [community description](https://www.reddit.com/r/EliteDangerous/comments/1uk2zhp/plasma_laser_theorycrafting_following_new/)
142
145
  by u/Techno3020** — linked only as corroboration that the Operations Plasma conversion's
@@ -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>