@shipload/sdk 1.0.0-next.7 → 1.0.0-next.71

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 (203) hide show
  1. package/lib/scan.d.ts +52 -0
  2. package/lib/scan.js +162 -0
  3. package/lib/scan.js.map +1 -0
  4. package/lib/scan.m.js +152 -0
  5. package/lib/scan.m.js.map +1 -0
  6. package/lib/shipload.d.ts +5822 -1484
  7. package/lib/shipload.js +20838 -5419
  8. package/lib/shipload.js.map +1 -1
  9. package/lib/shipload.m.js +20674 -5669
  10. package/lib/shipload.m.js.map +1 -1
  11. package/lib/testing.d.ts +1691 -0
  12. package/lib/testing.js +7109 -0
  13. package/lib/testing.js.map +1 -0
  14. package/lib/testing.m.js +7103 -0
  15. package/lib/testing.m.js.map +1 -0
  16. package/package.json +20 -2
  17. package/src/capabilities/craftable.test.ts +82 -0
  18. package/src/capabilities/craftable.ts +82 -0
  19. package/src/capabilities/crafting.test.ts +80 -0
  20. package/src/capabilities/crafting.ts +50 -8
  21. package/src/capabilities/gathering.test.ts +29 -0
  22. package/src/capabilities/gathering.ts +38 -20
  23. package/src/capabilities/hauling.ts +0 -5
  24. package/src/capabilities/index.ts +0 -1
  25. package/src/capabilities/modules.ts +27 -30
  26. package/src/capabilities/movement.ts +1 -1
  27. package/src/capabilities/storage.test.ts +26 -0
  28. package/src/capabilities/storage.ts +22 -7
  29. package/src/contracts/fund.ts +306 -0
  30. package/src/contracts/platform.ts +312 -3
  31. package/src/contracts/server.ts +2793 -478
  32. package/src/contracts/token.ts +170 -0
  33. package/src/contracts.ts +2 -0
  34. package/src/coordinates/address.ts +88 -0
  35. package/src/coordinates/constants.test.ts +15 -0
  36. package/src/coordinates/constants.ts +23 -0
  37. package/src/coordinates/index.ts +15 -0
  38. package/src/coordinates/memo.test.ts +47 -0
  39. package/src/coordinates/memo.ts +20 -0
  40. package/src/coordinates/permutation.ts +77 -0
  41. package/src/coordinates/regions.ts +48 -0
  42. package/src/coordinates/sectors.ts +115 -0
  43. package/src/data/capabilities.ts +49 -18
  44. package/src/data/capability-formulas.ts +26 -14
  45. package/src/data/catalog.test.ts +19 -0
  46. package/src/data/catalog.ts +13 -3
  47. package/src/data/charters.json +396 -0
  48. package/src/data/citizenry-adjectives.json +42 -0
  49. package/src/data/citizenry-nouns.json +50 -0
  50. package/src/data/colors.ts +14 -32
  51. package/src/data/entities.json +421 -15
  52. package/src/data/item-ids.ts +53 -13
  53. package/src/data/items.json +330 -77
  54. package/src/data/kind-registry.json +212 -0
  55. package/src/data/kind-registry.ts +192 -0
  56. package/src/data/metadata.ts +312 -51
  57. package/src/data/recipes-runtime.ts +6 -23
  58. package/src/data/recipes.json +2173 -173
  59. package/src/data/tiers.ts +9 -6
  60. package/src/derivation/build-methods.test.ts +71 -0
  61. package/src/derivation/build-methods.ts +50 -0
  62. package/src/derivation/capabilities.test.ts +348 -0
  63. package/src/derivation/capabilities.ts +707 -0
  64. package/src/derivation/capability-mappings.ts +60 -16
  65. package/src/derivation/crafting.test.ts +17 -0
  66. package/src/derivation/crafting.ts +57 -34
  67. package/src/derivation/index.ts +27 -2
  68. package/src/derivation/recipe-usage.test.ts +88 -0
  69. package/src/derivation/recipe-usage.ts +141 -0
  70. package/src/derivation/reserve-regen.ts +34 -0
  71. package/src/derivation/resources.ts +9 -1
  72. package/src/derivation/rollups.test.ts +55 -0
  73. package/src/derivation/rollups.ts +72 -0
  74. package/src/derivation/stars.test.ts +67 -0
  75. package/src/derivation/stars.ts +25 -0
  76. package/src/derivation/stat-scaling.ts +12 -0
  77. package/src/derivation/stats.ts +6 -6
  78. package/src/derivation/strata.ts +5 -3
  79. package/src/derivation/stratum.ts +26 -22
  80. package/src/derivation/tiers.ts +40 -7
  81. package/src/derivation/upgrades.ts +14 -0
  82. package/src/derivation/wormhole.ts +154 -0
  83. package/src/entities/entity.ts +102 -0
  84. package/src/entities/gamestate.ts +3 -28
  85. package/src/entities/makers.ts +144 -136
  86. package/src/entities/slot-multiplier.ts +43 -0
  87. package/src/entity/hydrate.test.ts +156 -0
  88. package/src/entity/hydrate.ts +86 -0
  89. package/src/errors.ts +21 -16
  90. package/src/format.ts +42 -9
  91. package/src/index-module.ts +425 -32
  92. package/src/influence/ballot.test.ts +103 -0
  93. package/src/influence/ballot.ts +98 -0
  94. package/src/influence/categories.ts +32 -0
  95. package/src/influence/charter-metadata.test.ts +136 -0
  96. package/src/influence/charter-metadata.ts +236 -0
  97. package/src/influence/charters.test.ts +112 -0
  98. package/src/influence/charters.ts +150 -0
  99. package/src/influence/citizenry.ts +38 -0
  100. package/src/influence/civic-shuttle.test.ts +202 -0
  101. package/src/influence/civic-shuttle.ts +142 -0
  102. package/src/influence/civic.test.ts +287 -0
  103. package/src/influence/civic.ts +269 -0
  104. package/src/influence/constants.ts +84 -0
  105. package/src/influence/decay.ts +20 -0
  106. package/src/influence/decomp.ts +95 -0
  107. package/src/influence/demand.ts +106 -0
  108. package/src/influence/duration.ts +101 -0
  109. package/src/influence/index.ts +118 -0
  110. package/src/influence/influence.test.ts +450 -0
  111. package/src/influence/quality.ts +25 -0
  112. package/src/influence/valuation.ts +154 -0
  113. package/src/managers/actions.ts +950 -93
  114. package/src/managers/balances.test.ts +161 -0
  115. package/src/managers/balances.ts +93 -0
  116. package/src/managers/base.ts +10 -2
  117. package/src/managers/cluster.test.ts +39 -0
  118. package/src/managers/cluster.ts +53 -0
  119. package/src/managers/construction-types.ts +80 -0
  120. package/src/managers/construction.ts +453 -0
  121. package/src/managers/context.ts +58 -1
  122. package/src/managers/coordinates.ts +14 -0
  123. package/src/managers/entities.ts +35 -63
  124. package/src/managers/epochs.ts +72 -1
  125. package/src/managers/index.ts +38 -1
  126. package/src/managers/influence.test.ts +56 -0
  127. package/src/managers/influence.ts +425 -0
  128. package/src/managers/jobs.test.ts +96 -0
  129. package/src/managers/jobs.ts +58 -0
  130. package/src/managers/locations.ts +25 -29
  131. package/src/managers/nft.test.ts +21 -0
  132. package/src/managers/nft.ts +110 -0
  133. package/src/managers/players.ts +25 -0
  134. package/src/managers/plot.ts +122 -0
  135. package/src/nft/atomicassets.abi.json +1342 -0
  136. package/src/nft/atomicassets.ts +237 -0
  137. package/src/nft/atomicdata.ts +130 -0
  138. package/src/nft/buildImmutableData.ts +388 -0
  139. package/src/nft/description.ts +222 -100
  140. package/src/nft/index.ts +3 -0
  141. package/src/planner/index.ts +296 -0
  142. package/src/planner/planner.test.ts +459 -0
  143. package/src/receipts.ts +22 -0
  144. package/src/resolution/describe-module.ts +43 -25
  145. package/src/resolution/display-name.ts +39 -11
  146. package/src/resolution/resolve-item.test.ts +48 -0
  147. package/src/resolution/resolve-item.ts +112 -58
  148. package/src/scan/index.ts +244 -0
  149. package/src/scan/scan-wasm.base64.ts +2 -0
  150. package/src/scheduling/accessor.ts +65 -23
  151. package/src/scheduling/availability.test.ts +320 -0
  152. package/src/scheduling/availability.ts +251 -0
  153. package/src/scheduling/cancel.test.ts +550 -0
  154. package/src/scheduling/cancel.ts +254 -0
  155. package/src/scheduling/cluster-stock.test.ts +31 -0
  156. package/src/scheduling/cluster-stock.ts +15 -0
  157. package/src/scheduling/energy.ts +47 -0
  158. package/src/scheduling/epoch.ts +1 -0
  159. package/src/scheduling/idle-resolve.ts +45 -0
  160. package/src/scheduling/jobs.test.ts +448 -0
  161. package/src/scheduling/jobs.ts +343 -0
  162. package/src/scheduling/lane-core.ts +128 -0
  163. package/src/scheduling/lanes.test.ts +250 -0
  164. package/src/scheduling/lanes.ts +279 -0
  165. package/src/scheduling/projection.ts +265 -149
  166. package/src/scheduling/schedule.test.ts +163 -0
  167. package/src/scheduling/schedule.ts +282 -116
  168. package/src/scheduling/task-cargo.test.ts +110 -0
  169. package/src/scheduling/task-cargo.ts +62 -0
  170. package/src/scheduling/task-effects.test.ts +35 -0
  171. package/src/scheduling/task-effects.ts +34 -0
  172. package/src/scheduling/unwrap.test.ts +86 -0
  173. package/src/scheduling/unwrap.ts +190 -0
  174. package/src/shipload.ts +63 -4
  175. package/src/subscriptions/manager.cluster.test.ts +51 -0
  176. package/src/subscriptions/manager.ts +245 -172
  177. package/src/subscriptions/mappers.ts +5 -8
  178. package/src/subscriptions/types.ts +28 -3
  179. package/src/testing/catalog-hash.ts +19 -0
  180. package/src/testing/index.ts +2 -0
  181. package/src/testing/projection-parity.ts +167 -0
  182. package/src/travel/reach.test.ts +86 -0
  183. package/src/travel/reach.ts +34 -0
  184. package/src/travel/route-build.test.ts +63 -0
  185. package/src/travel/route-build.ts +60 -0
  186. package/src/travel/route-planner.ts +288 -0
  187. package/src/travel/route-simulator.ts +170 -0
  188. package/src/travel/travel.ts +190 -123
  189. package/src/types/capabilities.ts +37 -8
  190. package/src/types/entity.ts +3 -3
  191. package/src/types/index.ts +0 -1
  192. package/src/types.ts +81 -23
  193. package/src/utils/cargo.test.ts +14 -0
  194. package/src/utils/cargo.ts +2 -0
  195. package/src/utils/display-name.ts +70 -0
  196. package/src/utils/hash.ts +22 -2
  197. package/src/utils/system.ts +24 -5
  198. package/src/capabilities/loading.ts +0 -8
  199. package/src/entities/container.ts +0 -123
  200. package/src/entities/ship-deploy.ts +0 -295
  201. package/src/entities/ship.ts +0 -221
  202. package/src/entities/warehouse.ts +0 -127
  203. package/src/types/entity-traits.ts +0 -69
@@ -1,106 +1,210 @@
1
1
  import {
2
2
  getModuleCapabilityType,
3
+ MODULE_BUILDER,
3
4
  MODULE_CRAFTER,
4
5
  MODULE_ENGINE,
5
6
  MODULE_GATHERER,
6
7
  MODULE_GENERATOR,
8
+ MODULE_BATTERY,
7
9
  MODULE_HAULER,
8
10
  MODULE_LOADER,
9
11
  MODULE_STORAGE,
10
12
  MODULE_WARP,
11
13
  } from '../capabilities/modules'
12
- import {
13
- ITEM_CONTAINER_T1_PACKED,
14
- ITEM_CONTAINER_T2_PACKED,
15
- ITEM_CRAFTER_T1,
16
- ITEM_ENGINE_T1,
17
- ITEM_GATHERER_T1,
18
- ITEM_GENERATOR_T1,
19
- ITEM_HAULER_T1,
20
- ITEM_LOADER_T1,
21
- ITEM_SHIP_T1_PACKED,
22
- ITEM_STORAGE_T1,
23
- ITEM_WAREHOUSE_T1_PACKED,
24
- ITEM_WARP_T1,
25
- } from '../data/item-ids'
14
+ import {getKindMeta, getTemplateMeta} from '../data/kind-registry'
26
15
  import {decodeStat} from '../derivation/crafting'
27
- import {gathererDepthForTier} from '../entities/ship-deploy'
28
- import {getItem} from '../data/catalog'
16
+ import {
17
+ gathererDepthForTier,
18
+ computeGathererYield,
19
+ moduleTierPct,
20
+ ENGINE_THRUST_TIER_PCT,
21
+ GENERATOR_CAPACITY_TIER_PCT,
22
+ GENERATOR_RECHARGE_TIER_PCT,
23
+ CRAFTER_SPEED_TIER_PCT,
24
+ BUILDER_SPEED_TIER_PCT,
25
+ WARP_RANGE_TIER_PCT,
26
+ LOADER_THRUST_TIER_PCT,
27
+ CARGO_BAY_CAPACITY_TIER_PCT,
28
+ BATTERY_CAPACITY_TIER_PCT,
29
+ } from '../derivation/capabilities'
30
+ import {getItem, tryGetItem} from '../data/catalog'
31
+ import {MASS_UNITS_PER_TONNE, type ModuleType} from '../types'
32
+ import {ENTITY_SHIP, getPackedEntityType} from '../data/kind-registry'
33
+ import {getBaseHullmassFor} from '../derivation/capabilities'
34
+ import {computeEffectiveModuleStat} from '../derivation/stat-scaling'
29
35
 
30
36
  function idiv(a: number, b: number): number {
31
37
  return Math.floor(a / b)
32
38
  }
33
39
 
34
- export function computeBaseHullmass(stats: bigint): number {
40
+ export function toWholeEnergy(milli: number): number {
41
+ return idiv(milli + 500, 1000)
42
+ }
43
+
44
+ export function formatMassTonnes(mass: number): string {
45
+ return `${idiv(mass, MASS_UNITS_PER_TONNE)}.${mass % MASS_UNITS_PER_TONNE} t`
46
+ }
47
+
48
+ function isShipHull(itemId: number): boolean {
49
+ return getPackedEntityType(itemId)?.equals(ENTITY_SHIP) ?? false
50
+ }
51
+
52
+ function sumPackedShipChannels(stats: bigint): number {
53
+ let sum = 0
54
+ for (let slot = 0; slot < 5; slot++) sum += decodeStat(stats, slot)
55
+ return sum
56
+ }
57
+
58
+ export function computeBaseHullmass(itemId: number, stats: bigint): number {
59
+ if (isShipHull(itemId)) {
60
+ return Math.floor(
61
+ (getBaseHullmassFor(itemId) * (10_000 - sumPackedShipChannels(stats))) / 10_000
62
+ )
63
+ }
35
64
  const density = decodeStat(stats, 1)
36
- return 25000 + 75 * density
65
+ return Math.floor((getBaseHullmassFor(itemId) * (2000 - density)) / 2000)
37
66
  }
38
67
 
39
68
  export function computeBaseCapacityShip(stats: bigint): number {
40
- const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3)
41
- return Math.floor(1_000_000 * 10 ** (s / 2997))
69
+ return Math.floor(50_000 * 6 ** (sumPackedShipChannels(stats) / 4995))
70
+ }
71
+
72
+ export function computeBaseCapacityContainer(stats: bigint): number {
73
+ const s = decodeStat(stats, 0) + decodeStat(stats, 2)
74
+ return Math.floor(220_000 * 6 ** (s / 1998))
42
75
  }
43
76
 
44
77
  export function computeBaseCapacityWarehouse(stats: bigint): number {
45
- const s = decodeStat(stats, 0) + decodeStat(stats, 2) + decodeStat(stats, 3)
46
- return Math.floor(20_000_000 * 10 ** (s / 2997))
78
+ const s = decodeStat(stats, 0) + decodeStat(stats, 2)
79
+ return Math.floor(1_000_000 * 6 ** (s / 1998))
47
80
  }
48
81
 
49
- export const computeEngineThrust = (vol: number): number => 400 + idiv(vol * 3, 4)
50
- export const computeEngineDrain = (thm: number): number => Math.max(30, 50 - idiv(thm, 70))
51
- export const computeGeneratorCap = (com: number): number => 300 + idiv(com, 6)
52
- export const computeGeneratorRech = (fin: number): number => 1 + idiv(fin * 3, 1000)
53
- export const computeGathererYield = (str: number): number => 200 + str
82
+ export function computeBaseCapacityWorkshop(stats: bigint): number {
83
+ const s = decodeStat(stats, 0) + decodeStat(stats, 2)
84
+ return Math.floor(50_000 * 6 ** (s / 1998))
85
+ }
86
+
87
+ export function computeBaseCapacityDepot(stats: bigint): number {
88
+ const s = decodeStat(stats, 0) + decodeStat(stats, 2)
89
+ return Math.floor(500_000 * 6 ** (s / 1998))
90
+ }
91
+
92
+ const CAPACITY_FN_BY_KIND: Record<string, (stats: bigint) => number> = {
93
+ ship: computeBaseCapacityShip,
94
+ warehouse: computeBaseCapacityWarehouse,
95
+ workshop: computeBaseCapacityWorkshop,
96
+ extractor: computeBaseCapacityContainer,
97
+ factory: computeBaseCapacityContainer,
98
+ builddock: computeBaseCapacityContainer,
99
+ mdriver: computeBaseCapacityContainer,
100
+ mcatcher: computeBaseCapacityContainer,
101
+ container: computeBaseCapacityContainer,
102
+ nexus: computeBaseCapacityContainer,
103
+ depot: computeBaseCapacityDepot,
104
+ }
105
+
106
+ export function computeBaseCapacityForEntity(itemId: number, stats: bigint): number {
107
+ const kind = getTemplateMeta(itemId)?.kind
108
+ if (!kind) return 0
109
+ return CAPACITY_FN_BY_KIND[kind.toString()]?.(stats) ?? 0
110
+ }
111
+
112
+ export const computeEngineThrust = (vol: number, tier: number): number =>
113
+ idiv((400 + idiv(vol * 3, 4)) * moduleTierPct(ENGINE_THRUST_TIER_PCT, tier), 100)
114
+ export const computeEngineDrain = (thm: number): number => 2 * Math.max(30, 50 - idiv(thm, 70))
115
+ export const ENGINE_DRAIN_BASE = 156
116
+ export const ENGINE_DRAIN_REF_THRUST = 775
117
+ export const ENGINE_DRAIN_REF_THM = 500
118
+
119
+ export const computeTravelDrain = (totalThrust: number, avgThm: number): number => {
120
+ if (totalThrust <= 0) return 0
121
+ const thermalFactor = computeEngineDrain(avgThm) / computeEngineDrain(ENGINE_DRAIN_REF_THM)
122
+ const thrustFactor = Math.sqrt(ENGINE_DRAIN_REF_THRUST / totalThrust)
123
+ return Math.floor(ENGINE_DRAIN_BASE * 1000 * thermalFactor * thrustFactor)
124
+ }
125
+ export const computeGeneratorCap = (com: number, tier: number): number =>
126
+ idiv((1_300_000 + com * 500) * moduleTierPct(GENERATOR_CAPACITY_TIER_PCT, tier), 100)
127
+ export const computeGeneratorRech = (fin: number, tier: number): number =>
128
+ idiv((2000 + fin * 6) * moduleTierPct(GENERATOR_RECHARGE_TIER_PCT, tier), 100)
54
129
  export const computeGathererDrain = (con: number): number =>
55
- Math.max(250, 1250 - idiv(con * 25, 20))
130
+ 2 * Math.max(250_000, 1_250_000 - con * 1250)
56
131
  export const computeGathererDepth = (tol: number, tier: number): number =>
57
132
  gathererDepthForTier(tol, tier)
58
- export const computeGathererSpeed = (ref: number): number => 100 + idiv(ref * 4, 5)
59
- export const computeLoaderMass = (ins: number): number => Math.max(200, 2000 - ins * 2)
60
- export const computeLoaderThrust = (pla: number): number => 1 + idiv(pla, 500)
61
- export const computeCrafterSpeed = (rea: number): number => 100 + idiv(rea * 4, 5)
62
- export const computeCrafterDrain = (fin: number): number => Math.max(5, 30 - idiv(fin, 33))
63
- export const computeHaulerCapacity = (fin: number): number => Math.max(1, 1 + idiv(fin, 400))
133
+ export const computeLoaderMass = (ins: number): number => Math.max(2, 20 - idiv(ins, 50))
134
+ export const computeLoaderThrust = (pla: number, tier: number): number =>
135
+ idiv((1 + idiv(pla * pla, 10000)) * moduleTierPct(LOADER_THRUST_TIER_PCT, tier), 100)
136
+ export const computeCrafterSpeed = (rea: number, tier: number): number =>
137
+ idiv((100 + idiv(rea * 4, 5)) * moduleTierPct(CRAFTER_SPEED_TIER_PCT, tier), 100)
138
+ export const computeCrafterDrain = (fin: number): number =>
139
+ Math.max(5000, 30000 - idiv(fin * 1000, 33))
140
+ export const computeBuilderSpeed = (resonance: number, tier: number): number =>
141
+ idiv((100 + idiv(resonance * 4, 5)) * moduleTierPct(BUILDER_SPEED_TIER_PCT, tier), 100)
142
+ export const computeBuilderDrain = (fineness: number): number =>
143
+ Math.max(5000, 30000 - idiv(fineness * 1000, 33))
144
+ export const computeHaulerCapacity = (fin: number, tier: number): number =>
145
+ Math.max(tier, tier + idiv(fin, 400))
64
146
  export const computeHaulerEfficiency = (con: number): number => 2000 + con * 6
65
- export const computeHaulerDrain = (com: number): number => Math.max(3, 15 - idiv(com, 80))
66
- export const computeWarpRange = (stat: number): number => 100 + stat * 3
147
+ export const supportDrainTierPercent = (tier: number): number => {
148
+ const clampedTier = Math.min(10, Math.max(1, Math.trunc(tier)))
149
+ return Math.max(50, 110 - clampedTier * 10)
150
+ }
151
+ const computeT1LogisticsDrain = (stat: number): number =>
152
+ Math.max(3000, 15000 - Math.min(12000, idiv(stat * 1000, 80)))
153
+ export const computeHaulerDrain = (conductivity: number, tier: number): number =>
154
+ idiv(computeT1LogisticsDrain(conductivity) * supportDrainTierPercent(tier), 100)
155
+ export const computeCargoBayDrain = (cohesion: number, tier: number): number =>
156
+ idiv(computeT1LogisticsDrain(cohesion) * 3 * supportDrainTierPercent(tier), 400)
157
+ export const computeWarpRange = (stat: number, tier: number): number =>
158
+ idiv((100 + stat * 3) * moduleTierPct(WARP_RANGE_TIER_PCT, tier), 100)
159
+ export const computeCargoBayCapacity = (
160
+ strength: number,
161
+ density: number,
162
+ hardness: number,
163
+ tier: number
164
+ ): number =>
165
+ idiv(
166
+ (100_000 + idiv((strength + density + hardness) * 500_000, 2997)) *
167
+ moduleTierPct(CARGO_BAY_CAPACITY_TIER_PCT, tier),
168
+ 100
169
+ )
170
+ export const computeBatteryBankCapacity = (
171
+ volatility: number,
172
+ thermal: number,
173
+ plasticity: number,
174
+ insulation: number,
175
+ tier: number
176
+ ): number =>
177
+ idiv(
178
+ (2_500_000 + idiv((volatility + thermal + plasticity + insulation) * 7_500_000, 3996)) *
179
+ moduleTierPct(BATTERY_CAPACITY_TIER_PCT, tier),
180
+ 100
181
+ )
67
182
 
68
183
  export function entityDisplayName(itemId: number): string {
69
- switch (itemId) {
70
- case ITEM_SHIP_T1_PACKED:
71
- return 'Ship'
72
- case ITEM_WAREHOUSE_T1_PACKED:
73
- return 'Warehouse'
74
- case ITEM_CONTAINER_T1_PACKED:
75
- return 'Container'
76
- case ITEM_CONTAINER_T2_PACKED:
77
- return 'Container'
78
- default:
79
- return 'Entity'
80
- }
184
+ const template = getTemplateMeta(itemId)
185
+ if (!template) return 'Entity'
186
+ if (template.displayLabel) return template.displayLabel
187
+ return getKindMeta(template.kind)?.defaultLabel || 'Entity'
188
+ }
189
+
190
+ const MODULE_DISPLAY_NAME_BY_TYPE: Partial<Record<ModuleType, string>> = {
191
+ engine: 'Engine',
192
+ generator: 'Power Core',
193
+ gatherer: 'Limpet Bay',
194
+ loader: 'Shuttle Bay',
195
+ crafter: 'Fabricator',
196
+ storage: 'Cargo Hold',
197
+ hauler: 'Tractor Beam',
198
+ warp: 'Warp Drive',
199
+ battery: 'Battery Bank',
200
+ launcher: 'Drive Coil',
201
+ builder: 'Assembly Arm',
81
202
  }
82
203
 
83
204
  export function moduleDisplayName(itemId: number): string {
84
- switch (itemId) {
85
- case ITEM_ENGINE_T1:
86
- return 'Engine'
87
- case ITEM_GENERATOR_T1:
88
- return 'Generator'
89
- case ITEM_GATHERER_T1:
90
- return 'Gatherer'
91
- case ITEM_LOADER_T1:
92
- return 'Loader'
93
- case ITEM_CRAFTER_T1:
94
- return 'Crafter'
95
- case ITEM_STORAGE_T1:
96
- return 'Storage'
97
- case ITEM_HAULER_T1:
98
- return 'Hauler'
99
- case ITEM_WARP_T1:
100
- return 'Warp'
101
- default:
102
- return 'Module'
103
- }
205
+ const item = tryGetItem(itemId)
206
+ if (item?.type !== 'module' || !item.moduleType) return 'Module'
207
+ return MODULE_DISPLAY_NAME_BY_TYPE[item.moduleType] ?? 'Module'
104
208
  }
105
209
 
106
210
  export function formatModuleLine(slot: number, itemId: number, stats: bigint): string {
@@ -115,60 +219,83 @@ export function formatModuleLine(slot: number, itemId: number, stats: bigint): s
115
219
 
116
220
  switch (subtype) {
117
221
  case MODULE_ENGINE: {
118
- const vol = decodeStat(stats, 0)
119
- const thm = decodeStat(stats, 1)
120
- out += ` Thrust ${computeEngineThrust(vol)} Drain ${computeEngineDrain(thm)}`
222
+ const vol = computeEffectiveModuleStat(decodeStat(stats, 0))
223
+ const thm = computeEffectiveModuleStat(decodeStat(stats, 1))
224
+ const tier = getItem(itemId).tier
225
+ out += ` Thrust ${computeEngineThrust(vol, tier)} Drain ${computeEngineDrain(thm)}`
121
226
  break
122
227
  }
123
228
  case MODULE_GENERATOR: {
124
- const res = decodeStat(stats, 0)
125
- const ref = decodeStat(stats, 1)
126
- out += ` Capacity ${computeGeneratorCap(res)} Recharge ${computeGeneratorRech(ref)}`
229
+ const res = computeEffectiveModuleStat(decodeStat(stats, 0))
230
+ const ref = computeEffectiveModuleStat(decodeStat(stats, 1))
231
+ const tier = getItem(itemId).tier
232
+ out += ` Capacity ${toWholeEnergy(computeGeneratorCap(res, tier))} Recharge ${toWholeEnergy(
233
+ computeGeneratorRech(ref, tier)
234
+ )}`
127
235
  break
128
236
  }
129
237
  case MODULE_GATHERER: {
130
238
  const str = decodeStat(stats, 0)
131
239
  const tol = decodeStat(stats, 1)
132
- const con = decodeStat(stats, 3)
133
- const ref = decodeStat(stats, 4)
240
+ const con = decodeStat(stats, 2)
134
241
  const tier = getItem(itemId).tier
135
- out += ` Yield ${computeGathererYield(str)} Depth ${computeGathererDepth(
242
+ out += ` Yield ${computeGathererYield(str, tier)} Depth ${computeGathererDepth(
136
243
  tol,
137
244
  tier
138
- )} Speed ${computeGathererSpeed(ref)} Drain ${computeGathererDrain(con)}`
245
+ )} Drain ${toWholeEnergy(computeGathererDrain(con))}`
139
246
  break
140
247
  }
141
248
  case MODULE_LOADER: {
142
249
  const fin = decodeStat(stats, 0)
143
250
  const pla = decodeStat(stats, 1)
144
- out += ` Mass ${computeLoaderMass(fin)} Thrust ${computeLoaderThrust(pla)}`
251
+ const tier = getItem(itemId).tier
252
+ out += ` Mass ${formatMassTonnes(computeLoaderMass(fin))} Thrust ${computeLoaderThrust(pla, tier)}`
145
253
  break
146
254
  }
147
255
  case MODULE_CRAFTER: {
148
256
  const rea = decodeStat(stats, 0)
149
- const com = decodeStat(stats, 1)
150
- out += ` Speed ${computeCrafterSpeed(rea)} Drain ${computeCrafterDrain(com)}`
257
+ const con = decodeStat(stats, 1)
258
+ const tier = getItem(itemId).tier
259
+ out += ` Speed ${computeCrafterSpeed(rea, tier)} Drain ${toWholeEnergy(computeCrafterDrain(con))}`
260
+ break
261
+ }
262
+ case MODULE_BUILDER: {
263
+ const res = decodeStat(stats, 0)
264
+ const fin = decodeStat(stats, 1)
265
+ const tier = getItem(itemId).tier
266
+ out += ` Speed ${computeBuilderSpeed(res, tier)} Drain ${toWholeEnergy(computeBuilderDrain(fin))}`
151
267
  break
152
268
  }
153
269
  case MODULE_STORAGE: {
154
270
  const str = decodeStat(stats, 0)
155
- const fin = decodeStat(stats, 2)
156
- const sat = decodeStat(stats, 3)
157
- const sum = str + fin + sat
158
- const pct = 10 + idiv(sum * 10, 2997)
159
- out += ` +${pct}% capacity`
271
+ const den = decodeStat(stats, 1)
272
+ const hrd = decodeStat(stats, 2)
273
+ const coh = decodeStat(stats, 3)
274
+ const tier = getItem(itemId).tier
275
+ out += ` Cargo Capacity ${formatMassTonnes(computeCargoBayCapacity(str, den, hrd, tier))} Drain ${toWholeEnergy(computeCargoBayDrain(coh, tier))}`
160
276
  break
161
277
  }
162
278
  case MODULE_HAULER: {
163
- const fin = decodeStat(stats, 0)
164
- const con = decodeStat(stats, 1)
165
- const com = decodeStat(stats, 2)
166
- out += ` Capacity ${computeHaulerCapacity(fin)} Efficiency ${computeHaulerEfficiency(con)} Drain ${computeHaulerDrain(com)}`
279
+ const res = decodeStat(stats, 0)
280
+ const pla = decodeStat(stats, 1)
281
+ const con = decodeStat(stats, 2)
282
+ const tier = getItem(itemId).tier
283
+ out += ` Capacity ${computeHaulerCapacity(res, tier)} Efficiency ${computeHaulerEfficiency(pla)} Drain ${toWholeEnergy(computeHaulerDrain(con, tier))}`
167
284
  break
168
285
  }
169
286
  case MODULE_WARP: {
170
287
  const stat = decodeStat(stats, 0)
171
- out += ` Range ${computeWarpRange(stat)}`
288
+ const tier = getItem(itemId).tier
289
+ out += ` Range ${computeWarpRange(stat, tier)}`
290
+ break
291
+ }
292
+ case MODULE_BATTERY: {
293
+ const vol = decodeStat(stats, 0)
294
+ const thm = decodeStat(stats, 1)
295
+ const pla = decodeStat(stats, 2)
296
+ const ins = decodeStat(stats, 3)
297
+ const tier = getItem(itemId).tier
298
+ out += ` Energy Capacity ${toWholeEnergy(computeBatteryBankCapacity(vol, thm, pla, ins, tier))}`
172
299
  break
173
300
  }
174
301
  }
@@ -181,18 +308,13 @@ export function buildEntityDescription(
181
308
  moduleItems: number[],
182
309
  moduleStats: bigint[]
183
310
  ): string {
184
- const hullMass = computeBaseHullmass(hullStats)
185
- let baseCapacity = 0
186
- if (itemId === ITEM_SHIP_T1_PACKED) {
187
- baseCapacity = computeBaseCapacityShip(hullStats)
188
- } else if (itemId === ITEM_WAREHOUSE_T1_PACKED) {
189
- baseCapacity = computeBaseCapacityWarehouse(hullStats)
190
- }
311
+ const hullMass = computeBaseHullmass(itemId, hullStats)
312
+ const baseCapacity = computeBaseCapacityForEntity(itemId, hullStats)
191
313
 
192
314
  let out = entityDisplayName(itemId)
193
- out += ` - Hull ${hullMass} mass`
315
+ out += ` - Hull ${formatMassTonnes(hullMass)}`
194
316
  if (baseCapacity > 0) {
195
- out += ` * ${baseCapacity} capacity`
317
+ out += ` * ${formatMassTonnes(baseCapacity)} capacity`
196
318
  }
197
319
  out += '\n\n'
198
320
 
package/src/nft/index.ts CHANGED
@@ -1,2 +1,5 @@
1
1
  export * from './deserializers'
2
2
  export * from './description'
3
+ export * from './atomicdata'
4
+ export * from './atomicassets'
5
+ export * from './buildImmutableData'