@shipload/sdk 1.0.0-next.7 → 1.0.0-next.70
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.
- package/lib/scan.d.ts +52 -0
- package/lib/scan.js +162 -0
- package/lib/scan.js.map +1 -0
- package/lib/scan.m.js +152 -0
- package/lib/scan.m.js.map +1 -0
- package/lib/shipload.d.ts +5696 -1503
- package/lib/shipload.js +20294 -5200
- package/lib/shipload.js.map +1 -1
- package/lib/shipload.m.js +20371 -5683
- package/lib/shipload.m.js.map +1 -1
- package/lib/testing.d.ts +1648 -0
- package/lib/testing.js +6980 -0
- package/lib/testing.js.map +1 -0
- package/lib/testing.m.js +6974 -0
- package/lib/testing.m.js.map +1 -0
- package/package.json +20 -2
- package/src/capabilities/craftable.test.ts +82 -0
- package/src/capabilities/craftable.ts +82 -0
- package/src/capabilities/crafting.test.ts +80 -0
- package/src/capabilities/crafting.ts +50 -8
- package/src/capabilities/gathering.test.ts +29 -0
- package/src/capabilities/gathering.ts +38 -20
- package/src/capabilities/hauling.ts +0 -5
- package/src/capabilities/index.ts +0 -1
- package/src/capabilities/modules.ts +27 -30
- package/src/capabilities/movement.ts +1 -1
- package/src/capabilities/storage.test.ts +26 -0
- package/src/capabilities/storage.ts +22 -7
- package/src/contracts/fund.ts +306 -0
- package/src/contracts/platform.ts +312 -3
- package/src/contracts/server.ts +2661 -466
- package/src/contracts/token.ts +170 -0
- package/src/contracts.ts +2 -0
- package/src/coordinates/address.ts +88 -0
- package/src/coordinates/constants.test.ts +15 -0
- package/src/coordinates/constants.ts +23 -0
- package/src/coordinates/index.ts +15 -0
- package/src/coordinates/memo.test.ts +47 -0
- package/src/coordinates/memo.ts +20 -0
- package/src/coordinates/permutation.ts +77 -0
- package/src/coordinates/regions.ts +48 -0
- package/src/coordinates/sectors.ts +115 -0
- package/src/data/capabilities.ts +49 -18
- package/src/data/capability-formulas.ts +26 -14
- package/src/data/catalog.test.ts +19 -0
- package/src/data/catalog.ts +13 -3
- package/src/data/charters.json +396 -0
- package/src/data/citizenry-adjectives.json +42 -0
- package/src/data/citizenry-nouns.json +50 -0
- package/src/data/colors.ts +14 -32
- package/src/data/entities.json +421 -15
- package/src/data/item-ids.ts +53 -13
- package/src/data/items.json +330 -77
- package/src/data/kind-registry.json +212 -0
- package/src/data/kind-registry.ts +192 -0
- package/src/data/metadata.ts +312 -51
- package/src/data/recipes-runtime.ts +6 -23
- package/src/data/recipes.json +2173 -173
- package/src/data/tiers.ts +9 -6
- package/src/derivation/build-methods.test.ts +71 -0
- package/src/derivation/build-methods.ts +50 -0
- package/src/derivation/capabilities.test.ts +348 -0
- package/src/derivation/capabilities.ts +707 -0
- package/src/derivation/capability-mappings.ts +60 -16
- package/src/derivation/crafting.test.ts +17 -0
- package/src/derivation/crafting.ts +57 -34
- package/src/derivation/index.ts +27 -2
- package/src/derivation/recipe-usage.test.ts +88 -0
- package/src/derivation/recipe-usage.ts +141 -0
- package/src/derivation/reserve-regen.ts +34 -0
- package/src/derivation/resources.ts +9 -1
- package/src/derivation/rollups.test.ts +55 -0
- package/src/derivation/rollups.ts +72 -0
- package/src/derivation/stars.test.ts +67 -0
- package/src/derivation/stars.ts +25 -0
- package/src/derivation/stat-scaling.ts +12 -0
- package/src/derivation/stats.ts +6 -6
- package/src/derivation/strata.ts +5 -3
- package/src/derivation/stratum.ts +26 -22
- package/src/derivation/tiers.ts +40 -7
- package/src/derivation/upgrades.ts +14 -0
- package/src/derivation/wormhole.ts +154 -0
- package/src/entities/entity.ts +102 -0
- package/src/entities/gamestate.ts +3 -28
- package/src/entities/makers.ts +144 -136
- package/src/entities/slot-multiplier.ts +43 -0
- package/src/entity/hydrate.test.ts +156 -0
- package/src/entity/hydrate.ts +86 -0
- package/src/errors.ts +21 -16
- package/src/format.ts +42 -9
- package/src/index-module.ts +411 -32
- package/src/influence/ballot.test.ts +103 -0
- package/src/influence/ballot.ts +98 -0
- package/src/influence/categories.ts +32 -0
- package/src/influence/charter-metadata.test.ts +136 -0
- package/src/influence/charter-metadata.ts +236 -0
- package/src/influence/charters.test.ts +112 -0
- package/src/influence/charters.ts +150 -0
- package/src/influence/citizenry.ts +38 -0
- package/src/influence/civic-shuttle.test.ts +202 -0
- package/src/influence/civic-shuttle.ts +142 -0
- package/src/influence/civic.test.ts +287 -0
- package/src/influence/civic.ts +269 -0
- package/src/influence/constants.ts +84 -0
- package/src/influence/decay.ts +20 -0
- package/src/influence/decomp.ts +95 -0
- package/src/influence/demand.ts +106 -0
- package/src/influence/duration.ts +101 -0
- package/src/influence/index.ts +118 -0
- package/src/influence/influence.test.ts +450 -0
- package/src/influence/quality.ts +25 -0
- package/src/influence/valuation.ts +154 -0
- package/src/managers/actions.ts +940 -93
- package/src/managers/balances.test.ts +161 -0
- package/src/managers/balances.ts +93 -0
- package/src/managers/base.ts +10 -2
- package/src/managers/cluster.test.ts +39 -0
- package/src/managers/cluster.ts +53 -0
- package/src/managers/construction-types.ts +80 -0
- package/src/managers/construction.ts +453 -0
- package/src/managers/context.ts +58 -1
- package/src/managers/coordinates.ts +14 -0
- package/src/managers/entities.ts +35 -63
- package/src/managers/epochs.ts +72 -1
- package/src/managers/index.ts +38 -1
- package/src/managers/influence.test.ts +56 -0
- package/src/managers/influence.ts +425 -0
- package/src/managers/jobs.test.ts +80 -0
- package/src/managers/jobs.ts +54 -0
- package/src/managers/locations.ts +25 -29
- package/src/managers/nft.test.ts +21 -0
- package/src/managers/nft.ts +110 -0
- package/src/managers/players.ts +25 -0
- package/src/managers/plot.ts +122 -0
- package/src/nft/atomicassets.abi.json +1342 -0
- package/src/nft/atomicassets.ts +237 -0
- package/src/nft/atomicdata.ts +130 -0
- package/src/nft/buildImmutableData.ts +388 -0
- package/src/nft/description.ts +222 -100
- package/src/nft/index.ts +3 -0
- package/src/planner/index.ts +296 -0
- package/src/planner/planner.test.ts +459 -0
- package/src/receipts.ts +22 -0
- package/src/resolution/describe-module.ts +43 -25
- package/src/resolution/display-name.ts +39 -11
- package/src/resolution/resolve-item.test.ts +48 -0
- package/src/resolution/resolve-item.ts +112 -58
- package/src/scan/index.ts +244 -0
- package/src/scan/scan-wasm.base64.ts +2 -0
- package/src/scheduling/accessor.ts +65 -23
- package/src/scheduling/availability.test.ts +320 -0
- package/src/scheduling/availability.ts +251 -0
- package/src/scheduling/cancel.test.ts +550 -0
- package/src/scheduling/cancel.ts +254 -0
- package/src/scheduling/cluster-stock.test.ts +31 -0
- package/src/scheduling/cluster-stock.ts +15 -0
- package/src/scheduling/energy.ts +47 -0
- package/src/scheduling/epoch.ts +1 -0
- package/src/scheduling/idle-resolve.ts +45 -0
- package/src/scheduling/jobs.test.ts +49 -0
- package/src/scheduling/jobs.ts +137 -0
- package/src/scheduling/lane-core.ts +128 -0
- package/src/scheduling/lanes.test.ts +250 -0
- package/src/scheduling/lanes.ts +227 -0
- package/src/scheduling/projection.ts +265 -149
- package/src/scheduling/schedule.test.ts +163 -0
- package/src/scheduling/schedule.ts +282 -116
- package/src/scheduling/task-cargo.test.ts +110 -0
- package/src/scheduling/task-cargo.ts +62 -0
- package/src/scheduling/task-effects.test.ts +35 -0
- package/src/scheduling/task-effects.ts +34 -0
- package/src/scheduling/unwrap.test.ts +86 -0
- package/src/scheduling/unwrap.ts +190 -0
- package/src/shipload.ts +63 -4
- package/src/subscriptions/manager.cluster.test.ts +51 -0
- package/src/subscriptions/manager.ts +245 -172
- package/src/subscriptions/mappers.ts +5 -8
- package/src/subscriptions/types.ts +28 -3
- package/src/testing/catalog-hash.ts +19 -0
- package/src/testing/index.ts +2 -0
- package/src/testing/projection-parity.ts +167 -0
- package/src/travel/reach.test.ts +86 -0
- package/src/travel/reach.ts +34 -0
- package/src/travel/route-build.test.ts +63 -0
- package/src/travel/route-build.ts +60 -0
- package/src/travel/route-planner.ts +288 -0
- package/src/travel/route-simulator.ts +170 -0
- package/src/travel/travel.ts +190 -123
- package/src/types/capabilities.ts +37 -8
- package/src/types/entity.ts +3 -3
- package/src/types/index.ts +0 -1
- package/src/types.ts +81 -23
- package/src/utils/cargo.test.ts +14 -0
- package/src/utils/cargo.ts +2 -0
- package/src/utils/display-name.ts +70 -0
- package/src/utils/hash.ts +22 -2
- package/src/utils/system.ts +24 -5
- package/src/capabilities/loading.ts +0 -8
- package/src/entities/container.ts +0 -123
- package/src/entities/ship-deploy.ts +0 -295
- package/src/entities/ship.ts +0 -221
- package/src/entities/warehouse.ts +0 -127
- package/src/types/entity-traits.ts +0 -69
package/src/nft/description.ts
CHANGED
|
@@ -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 {
|
|
28
|
-
|
|
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
|
|
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
|
|
65
|
+
return Math.floor((getBaseHullmassFor(itemId) * (2000 - density)) / 2000)
|
|
37
66
|
}
|
|
38
67
|
|
|
39
68
|
export function computeBaseCapacityShip(stats: bigint): number {
|
|
40
|
-
|
|
41
|
-
|
|
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)
|
|
46
|
-
return Math.floor(
|
|
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
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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(
|
|
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
|
|
59
|
-
export const
|
|
60
|
-
|
|
61
|
-
export const computeCrafterSpeed = (rea: number): number =>
|
|
62
|
-
|
|
63
|
-
export const
|
|
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
|
|
66
|
-
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
)}
|
|
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
|
-
|
|
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
|
|
150
|
-
|
|
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
|
|
156
|
-
const
|
|
157
|
-
const
|
|
158
|
-
const
|
|
159
|
-
out += `
|
|
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
|
|
164
|
-
const
|
|
165
|
-
const
|
|
166
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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}
|
|
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
|
|