@shipload/sdk 1.0.0-next.56 → 1.0.0-next.59
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/shipload.d.ts +57 -36
- package/lib/shipload.js +385 -245
- package/lib/shipload.js.map +1 -1
- package/lib/shipload.m.js +371 -236
- package/lib/shipload.m.js.map +1 -1
- package/lib/testing.js +25 -25
- package/lib/testing.js.map +1 -1
- package/lib/testing.m.js +25 -25
- package/lib/testing.m.js.map +1 -1
- package/package.json +1 -1
- package/src/capabilities/craftable.test.ts +82 -0
- package/src/capabilities/craftable.ts +36 -5
- package/src/capabilities/modules.ts +10 -0
- package/src/data/entities.json +32 -42
- package/src/data/item-ids.ts +10 -10
- package/src/data/items.json +12 -12
- package/src/data/kind-registry.json +10 -10
- package/src/data/metadata.ts +17 -17
- package/src/data/recipes.json +111 -111
- package/src/derivation/capabilities.test.ts +15 -17
- package/src/derivation/crafting.test.ts +17 -0
- package/src/derivation/crafting.ts +18 -0
- package/src/derivation/recipe-usage.test.ts +8 -10
- package/src/index-module.ts +5 -0
- package/src/nft/description.ts +23 -23
- package/src/resolution/resolve-item.ts +12 -0
- package/src/scheduling/availability.test.ts +157 -0
- package/src/scheduling/availability.ts +94 -13
- package/src/scheduling/cancel.test.ts +161 -1
- package/src/scheduling/cancel.ts +58 -5
- package/src/types.ts +1 -0
package/package.json
CHANGED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import {describe, expect, test} from 'bun:test'
|
|
2
|
+
import {ServerContract} from '../contracts'
|
|
3
|
+
import {UInt16, UInt32, UInt64} from '@wharfkit/antelope'
|
|
4
|
+
import {
|
|
5
|
+
ITEM_ENGINE_T1,
|
|
6
|
+
ITEM_GENERATOR_T1,
|
|
7
|
+
ITEM_CRAFTER_T1,
|
|
8
|
+
ITEM_PLASMA_CELL,
|
|
9
|
+
ITEM_SHIP_T1_PACKED,
|
|
10
|
+
} from '../data/item-ids'
|
|
11
|
+
import {getRecipe} from '../data/recipes-runtime'
|
|
12
|
+
import {encodeStats} from '../derivation/crafting'
|
|
13
|
+
import {rollupCrafter} from '../derivation/rollups'
|
|
14
|
+
import {makeEntity} from '../entities/makers'
|
|
15
|
+
import type {IncomingSource} from '../scheduling/availability'
|
|
16
|
+
import {maxCraftable} from './craftable'
|
|
17
|
+
|
|
18
|
+
const NOW = new Date('2026-06-11T17:06:40.000Z')
|
|
19
|
+
|
|
20
|
+
function ship(cargo: ServerContract.Types.cargo_item[] = []) {
|
|
21
|
+
return makeEntity(ITEM_SHIP_T1_PACKED, {
|
|
22
|
+
id: 99,
|
|
23
|
+
owner: 'tester.gm',
|
|
24
|
+
name: 'Craft Tester',
|
|
25
|
+
coordinates: {x: 0, y: 0},
|
|
26
|
+
hullmass: 200_000,
|
|
27
|
+
capacity: 8_000_000,
|
|
28
|
+
cargomass: 0,
|
|
29
|
+
energy: 500_000,
|
|
30
|
+
modules: [
|
|
31
|
+
{itemId: ITEM_GENERATOR_T1, stats: encodeStats([999, 999])},
|
|
32
|
+
{itemId: ITEM_CRAFTER_T1, stats: encodeStats([999, 999])},
|
|
33
|
+
],
|
|
34
|
+
cargo,
|
|
35
|
+
})
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function crafterSpeed(entity: ReturnType<typeof ship>): number {
|
|
39
|
+
return rollupCrafter(entity.crafter_lanes)!.speed.toNumber()
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function plasmaCell(quantity: number) {
|
|
43
|
+
return ServerContract.Types.cargo_item.from({
|
|
44
|
+
item_id: UInt16.from(ITEM_PLASMA_CELL),
|
|
45
|
+
quantity: UInt32.from(quantity),
|
|
46
|
+
stats: UInt64.from(0),
|
|
47
|
+
modules: [],
|
|
48
|
+
})
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
describe('maxCraftable — incoming', () => {
|
|
52
|
+
test('on-hand-only baseline stays 0 for an empty-cargo entity', () => {
|
|
53
|
+
const recipe = getRecipe(ITEM_ENGINE_T1)!
|
|
54
|
+
const entity = ship([])
|
|
55
|
+
expect(maxCraftable(entity, recipe, crafterSpeed(entity), NOW)).toBe(0)
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
test('incoming source alone covers the recipe inputs', () => {
|
|
59
|
+
const recipe = getRecipe(ITEM_ENGINE_T1)!
|
|
60
|
+
const entity = ship([])
|
|
61
|
+
const incoming: IncomingSource[] = [
|
|
62
|
+
{holdId: '1', until: new Date(NOW.getTime() - 1000), items: [plasmaCell(1800)]},
|
|
63
|
+
]
|
|
64
|
+
|
|
65
|
+
expect(maxCraftable(entity, recipe, crafterSpeed(entity), NOW)).toBe(0)
|
|
66
|
+
expect(maxCraftable(entity, recipe, crafterSpeed(entity), NOW, incoming)).toBe(3)
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
test('an incoming source arriving well after craft completion still resolves (eventually craftable)', () => {
|
|
70
|
+
const recipe = getRecipe(ITEM_ENGINE_T1)!
|
|
71
|
+
const entity = ship([])
|
|
72
|
+
const farFuture: IncomingSource[] = [
|
|
73
|
+
{
|
|
74
|
+
holdId: '1',
|
|
75
|
+
until: new Date(NOW.getTime() + 1_000_000_000),
|
|
76
|
+
items: [plasmaCell(1800)],
|
|
77
|
+
},
|
|
78
|
+
]
|
|
79
|
+
|
|
80
|
+
expect(maxCraftable(entity, recipe, crafterSpeed(entity), NOW, farFuture)).toBe(3)
|
|
81
|
+
})
|
|
82
|
+
})
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import type {ServerContract} from '../contracts'
|
|
2
2
|
import {getItem} from '../data/catalog'
|
|
3
3
|
import type {Recipe} from '../data/recipes-runtime'
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
availableForItem,
|
|
6
|
+
projectedCargoAvailableAt,
|
|
7
|
+
taskCargoEffect,
|
|
8
|
+
type IncomingSource,
|
|
9
|
+
} from '../scheduling/availability'
|
|
5
10
|
import {candidateLaneCompletesAt, workerLaneKey} from '../scheduling/lanes'
|
|
11
|
+
import * as schedule from '../scheduling/schedule'
|
|
6
12
|
import type {ScheduleData} from '../scheduling/schedule'
|
|
7
13
|
import {calc_craft_duration} from './crafting'
|
|
8
14
|
|
|
@@ -14,11 +20,35 @@ export interface CraftableEntity extends ScheduleData {
|
|
|
14
20
|
modules: ModuleEntry[]
|
|
15
21
|
}
|
|
16
22
|
|
|
23
|
+
// Recipe inputs aren't stat-pinned (any variant counts, mirroring availableForItem's item-id aggregation).
|
|
24
|
+
function itemReadyAt(
|
|
25
|
+
entity: CraftableEntity,
|
|
26
|
+
itemIds: readonly number[],
|
|
27
|
+
incoming: readonly IncomingSource[]
|
|
28
|
+
): Date {
|
|
29
|
+
let readyMs = 0
|
|
30
|
+
for (const ordered of schedule.orderedTasks(entity)) {
|
|
31
|
+
for (const item of taskCargoEffect(ordered.task).added) {
|
|
32
|
+
if (itemIds.includes(item.item_id.toNumber())) {
|
|
33
|
+
readyMs = Math.max(readyMs, ordered.completesAt.getTime())
|
|
34
|
+
break
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
for (const src of incoming) {
|
|
39
|
+
if (src.items.some((item) => itemIds.includes(item.item_id.toNumber()))) {
|
|
40
|
+
readyMs = Math.max(readyMs, src.until.getTime())
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return new Date(readyMs)
|
|
44
|
+
}
|
|
45
|
+
|
|
17
46
|
export function maxCraftable(
|
|
18
47
|
entity: CraftableEntity,
|
|
19
48
|
recipe: Recipe,
|
|
20
49
|
crafterSpeed: number,
|
|
21
|
-
now: Date
|
|
50
|
+
now: Date,
|
|
51
|
+
incoming: readonly IncomingSource[] = []
|
|
22
52
|
): number {
|
|
23
53
|
if (recipe.inputs.length === 0) return 0
|
|
24
54
|
|
|
@@ -30,12 +60,13 @@ export function maxCraftable(
|
|
|
30
60
|
const crafterLane = workerLaneKey(entity.modules, 'crafter', entity.lanes ?? [])
|
|
31
61
|
const naiveCompletesAt = candidateLaneCompletesAt(entity, crafterLane, perUnitDuration, now)
|
|
32
62
|
const laneStartMs = naiveCompletesAt.getTime() - perUnitDuration * 1000
|
|
33
|
-
const readyMs =
|
|
63
|
+
const readyMs = itemReadyAt(
|
|
34
64
|
entity,
|
|
35
|
-
recipe.inputs.map((input) => input.itemId)
|
|
65
|
+
recipe.inputs.map((input) => input.itemId),
|
|
66
|
+
incoming
|
|
36
67
|
).getTime()
|
|
37
68
|
const completesAt = new Date(Math.max(laneStartMs, readyMs) + perUnitDuration * 1000)
|
|
38
|
-
const availability = projectedCargoAvailableAt(entity, completesAt)
|
|
69
|
+
const availability = projectedCargoAvailableAt(entity, completesAt, incoming)
|
|
39
70
|
|
|
40
71
|
let maxUnits: bigint | undefined
|
|
41
72
|
for (const input of recipe.inputs) {
|
|
@@ -28,6 +28,7 @@ export const MODULE_STORAGE = 8
|
|
|
28
28
|
export const MODULE_HAULER = 9
|
|
29
29
|
export const MODULE_BATTERY = 10
|
|
30
30
|
export const MODULE_BUILDER = 12
|
|
31
|
+
export const MODULE_AUX = 13
|
|
31
32
|
|
|
32
33
|
export interface PackedModule {
|
|
33
34
|
itemId: number
|
|
@@ -40,6 +41,13 @@ export interface ModuleEntry {
|
|
|
40
41
|
}
|
|
41
42
|
|
|
42
43
|
export function moduleAccepts(slotType: number, moduleType: number): boolean {
|
|
44
|
+
if (slotType === MODULE_AUX) {
|
|
45
|
+
return (
|
|
46
|
+
moduleType === MODULE_GENERATOR ||
|
|
47
|
+
moduleType === MODULE_ENGINE ||
|
|
48
|
+
moduleType === MODULE_BATTERY
|
|
49
|
+
)
|
|
50
|
+
}
|
|
43
51
|
return slotType === MODULE_ANY || slotType === moduleType
|
|
44
52
|
}
|
|
45
53
|
|
|
@@ -104,6 +112,8 @@ export function moduleSlotTypeToCode(slotType: string): number {
|
|
|
104
112
|
return MODULE_HAULER
|
|
105
113
|
case 'battery':
|
|
106
114
|
return MODULE_BATTERY
|
|
115
|
+
case 'aux':
|
|
116
|
+
return MODULE_AUX
|
|
107
117
|
default:
|
|
108
118
|
return MODULE_ANY
|
|
109
119
|
}
|
package/src/data/entities.json
CHANGED
|
@@ -227,7 +227,7 @@
|
|
|
227
227
|
"maxTier": 1
|
|
228
228
|
}
|
|
229
229
|
],
|
|
230
|
-
"baseHullmass":
|
|
230
|
+
"baseHullmass": 4000000
|
|
231
231
|
},
|
|
232
232
|
{
|
|
233
233
|
"entityItemId": 10212,
|
|
@@ -248,7 +248,7 @@
|
|
|
248
248
|
"maxTier": 1
|
|
249
249
|
}
|
|
250
250
|
],
|
|
251
|
-
"baseHullmass":
|
|
251
|
+
"baseHullmass": 4000000
|
|
252
252
|
},
|
|
253
253
|
{
|
|
254
254
|
"entityItemId": 10213,
|
|
@@ -269,7 +269,7 @@
|
|
|
269
269
|
"maxTier": 1
|
|
270
270
|
}
|
|
271
271
|
],
|
|
272
|
-
"baseHullmass":
|
|
272
|
+
"baseHullmass": 4000000
|
|
273
273
|
},
|
|
274
274
|
{
|
|
275
275
|
"entityItemId": 10214,
|
|
@@ -290,7 +290,7 @@
|
|
|
290
290
|
"maxTier": 1
|
|
291
291
|
}
|
|
292
292
|
],
|
|
293
|
-
"baseHullmass":
|
|
293
|
+
"baseHullmass": 4000000
|
|
294
294
|
},
|
|
295
295
|
{
|
|
296
296
|
"entityItemId": 10215,
|
|
@@ -311,28 +311,23 @@
|
|
|
311
311
|
"maxTier": 1
|
|
312
312
|
}
|
|
313
313
|
],
|
|
314
|
-
"baseHullmass":
|
|
314
|
+
"baseHullmass": 4000000
|
|
315
315
|
},
|
|
316
316
|
{
|
|
317
|
-
"entityItemId":
|
|
317
|
+
"entityItemId": 10218,
|
|
318
318
|
"slots": [
|
|
319
319
|
{
|
|
320
320
|
"type": "generator",
|
|
321
|
-
"outputPct":
|
|
321
|
+
"outputPct": 85,
|
|
322
322
|
"maxTier": 1
|
|
323
323
|
},
|
|
324
324
|
{
|
|
325
325
|
"type": "engine",
|
|
326
|
-
"outputPct":
|
|
327
|
-
"maxTier": 1
|
|
328
|
-
},
|
|
329
|
-
{
|
|
330
|
-
"type": "gatherer",
|
|
331
|
-
"outputPct": 100,
|
|
326
|
+
"outputPct": 85,
|
|
332
327
|
"maxTier": 1
|
|
333
328
|
},
|
|
334
329
|
{
|
|
335
|
-
"type": "
|
|
330
|
+
"type": "crafter",
|
|
336
331
|
"outputPct": 100,
|
|
337
332
|
"maxTier": 1
|
|
338
333
|
}
|
|
@@ -340,52 +335,47 @@
|
|
|
340
335
|
"baseHullmass": 4000000
|
|
341
336
|
},
|
|
342
337
|
{
|
|
343
|
-
"entityItemId":
|
|
338
|
+
"entityItemId": 20200,
|
|
339
|
+
"slots": [],
|
|
340
|
+
"baseHullmass": 100000
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
"entityItemId": 20212,
|
|
344
344
|
"slots": [
|
|
345
345
|
{
|
|
346
346
|
"type": "generator",
|
|
347
347
|
"outputPct": 90,
|
|
348
|
-
"maxTier":
|
|
348
|
+
"maxTier": 2
|
|
349
349
|
},
|
|
350
350
|
{
|
|
351
351
|
"type": "engine",
|
|
352
352
|
"outputPct": 90,
|
|
353
|
-
"maxTier":
|
|
353
|
+
"maxTier": 2
|
|
354
354
|
},
|
|
355
355
|
{
|
|
356
356
|
"type": "gatherer",
|
|
357
357
|
"outputPct": 100,
|
|
358
|
-
"maxTier":
|
|
359
|
-
},
|
|
360
|
-
{
|
|
361
|
-
"type": "storage",
|
|
362
|
-
"outputPct": 100,
|
|
363
|
-
"maxTier": 1
|
|
358
|
+
"maxTier": 2
|
|
364
359
|
}
|
|
365
360
|
],
|
|
366
|
-
"baseHullmass":
|
|
367
|
-
},
|
|
368
|
-
{
|
|
369
|
-
"entityItemId": 20200,
|
|
370
|
-
"slots": [],
|
|
371
|
-
"baseHullmass": 100000
|
|
361
|
+
"baseHullmass": 5920000
|
|
372
362
|
},
|
|
373
363
|
{
|
|
374
|
-
"entityItemId":
|
|
364
|
+
"entityItemId": 20213,
|
|
375
365
|
"slots": [
|
|
376
366
|
{
|
|
377
367
|
"type": "generator",
|
|
378
|
-
"outputPct":
|
|
368
|
+
"outputPct": 95,
|
|
379
369
|
"maxTier": 2
|
|
380
370
|
},
|
|
381
371
|
{
|
|
382
|
-
"type": "
|
|
383
|
-
"outputPct":
|
|
372
|
+
"type": "engine",
|
|
373
|
+
"outputPct": 95,
|
|
384
374
|
"maxTier": 2
|
|
385
375
|
},
|
|
386
376
|
{
|
|
387
|
-
"type": "
|
|
388
|
-
"outputPct":
|
|
377
|
+
"type": "aux",
|
|
378
|
+
"outputPct": 95,
|
|
389
379
|
"maxTier": 2
|
|
390
380
|
},
|
|
391
381
|
{
|
|
@@ -394,32 +384,32 @@
|
|
|
394
384
|
"maxTier": 2
|
|
395
385
|
}
|
|
396
386
|
],
|
|
397
|
-
"baseHullmass":
|
|
387
|
+
"baseHullmass": 7360000
|
|
398
388
|
},
|
|
399
389
|
{
|
|
400
|
-
"entityItemId":
|
|
390
|
+
"entityItemId": 20214,
|
|
401
391
|
"slots": [
|
|
402
392
|
{
|
|
403
393
|
"type": "generator",
|
|
404
|
-
"outputPct":
|
|
394
|
+
"outputPct": 95,
|
|
405
395
|
"maxTier": 2
|
|
406
396
|
},
|
|
407
397
|
{
|
|
408
398
|
"type": "engine",
|
|
409
|
-
"outputPct":
|
|
399
|
+
"outputPct": 95,
|
|
410
400
|
"maxTier": 2
|
|
411
401
|
},
|
|
412
402
|
{
|
|
413
|
-
"type": "
|
|
403
|
+
"type": "gatherer",
|
|
414
404
|
"outputPct": 100,
|
|
415
405
|
"maxTier": 2
|
|
416
406
|
},
|
|
417
407
|
{
|
|
418
|
-
"type": "
|
|
408
|
+
"type": "storage",
|
|
419
409
|
"outputPct": 100,
|
|
420
410
|
"maxTier": 2
|
|
421
411
|
}
|
|
422
412
|
],
|
|
423
|
-
"baseHullmass":
|
|
413
|
+
"baseHullmass": 7360000
|
|
424
414
|
}
|
|
425
415
|
]
|
package/src/data/item-ids.ts
CHANGED
|
@@ -81,14 +81,13 @@ export const ITEM_MASS_CATCHER_T1_PACKED = 10206
|
|
|
81
81
|
export const ITEM_HUB_T1_PACKED = 10207
|
|
82
82
|
export const ITEM_WORKSHOP_T1_PACKED = 10208
|
|
83
83
|
export const ITEM_CONSTRUCTION_DOCK_T1_PACKED = 10209
|
|
84
|
-
export const
|
|
85
|
-
export const
|
|
86
|
-
export const
|
|
87
|
-
export const
|
|
88
|
-
export const
|
|
89
|
-
export const
|
|
90
|
-
export const
|
|
91
|
-
export const ITEM_DREDGER_T1_PACKED = 10217
|
|
84
|
+
export const ITEM_ROUSTABOUT_T1A_PACKED = 10210
|
|
85
|
+
export const ITEM_PROSPECTOR_T1A_PACKED = 10211
|
|
86
|
+
export const ITEM_TENDER_T1A_PACKED = 10212
|
|
87
|
+
export const ITEM_WRIGHT_T1A_PACKED = 10213
|
|
88
|
+
export const ITEM_TUG_T1A_PACKED = 10214
|
|
89
|
+
export const ITEM_PORTER_T1A_PACKED = 10215
|
|
90
|
+
export const ITEM_SMITH_T1A_PACKED = 10218
|
|
92
91
|
export const ITEM_PLATE_T2 = 20001
|
|
93
92
|
export const ITEM_FRAME_T2 = 20002
|
|
94
93
|
export const ITEM_PLASMA_CELL_T2 = 20003
|
|
@@ -102,5 +101,6 @@ export const ITEM_RESIN_T2 = 20010
|
|
|
102
101
|
export const ITEM_GATHERER_T2 = 20102
|
|
103
102
|
export const ITEM_HAULER_T2 = 20106
|
|
104
103
|
export const ITEM_CONTAINER_T2_PACKED = 20200
|
|
105
|
-
export const
|
|
106
|
-
export const
|
|
104
|
+
export const ITEM_PROSPECTOR_T2A_PACKED = 20212
|
|
105
|
+
export const ITEM_PROSPECTOR_T2B_PACKED = 20213
|
|
106
|
+
export const ITEM_DREDGER_T2A_PACKED = 20214
|
package/src/data/items.json
CHANGED
|
@@ -583,14 +583,8 @@
|
|
|
583
583
|
"tier": 1
|
|
584
584
|
},
|
|
585
585
|
{
|
|
586
|
-
"id":
|
|
587
|
-
"mass":
|
|
588
|
-
"type": "entity",
|
|
589
|
-
"tier": 1
|
|
590
|
-
},
|
|
591
|
-
{
|
|
592
|
-
"id": 10217,
|
|
593
|
-
"mass": 3600000,
|
|
586
|
+
"id": 10218,
|
|
587
|
+
"mass": 2400000,
|
|
594
588
|
"type": "entity",
|
|
595
589
|
"tier": 1
|
|
596
590
|
},
|
|
@@ -675,14 +669,20 @@
|
|
|
675
669
|
"tier": 2
|
|
676
670
|
},
|
|
677
671
|
{
|
|
678
|
-
"id":
|
|
679
|
-
"mass":
|
|
672
|
+
"id": 20212,
|
|
673
|
+
"mass": 4320000,
|
|
674
|
+
"type": "entity",
|
|
675
|
+
"tier": 2
|
|
676
|
+
},
|
|
677
|
+
{
|
|
678
|
+
"id": 20213,
|
|
679
|
+
"mass": 5760000,
|
|
680
680
|
"type": "entity",
|
|
681
681
|
"tier": 2
|
|
682
682
|
},
|
|
683
683
|
{
|
|
684
|
-
"id":
|
|
685
|
-
"mass":
|
|
684
|
+
"id": 20214,
|
|
685
|
+
"mass": 5760000,
|
|
686
686
|
"type": "entity",
|
|
687
687
|
"tier": 2
|
|
688
688
|
}
|
|
@@ -122,14 +122,9 @@
|
|
|
122
122
|
"displayLabel": "Porter"
|
|
123
123
|
},
|
|
124
124
|
{
|
|
125
|
-
"itemId":
|
|
125
|
+
"itemId": 10218,
|
|
126
126
|
"kind": "ship",
|
|
127
|
-
"displayLabel": "
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
"itemId": 10217,
|
|
131
|
-
"kind": "ship",
|
|
132
|
-
"displayLabel": "Dredger"
|
|
127
|
+
"displayLabel": "Smith"
|
|
133
128
|
},
|
|
134
129
|
{
|
|
135
130
|
"itemId": 10202,
|
|
@@ -182,14 +177,19 @@
|
|
|
182
177
|
"displayLabel": ""
|
|
183
178
|
},
|
|
184
179
|
{
|
|
185
|
-
"itemId":
|
|
180
|
+
"itemId": 20212,
|
|
186
181
|
"kind": "ship",
|
|
187
182
|
"displayLabel": "Prospector"
|
|
188
183
|
},
|
|
189
184
|
{
|
|
190
|
-
"itemId":
|
|
185
|
+
"itemId": 20213,
|
|
191
186
|
"kind": "ship",
|
|
192
|
-
"displayLabel": "
|
|
187
|
+
"displayLabel": "Prospector"
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"itemId": 20214,
|
|
191
|
+
"kind": "ship",
|
|
192
|
+
"displayLabel": "Dredger"
|
|
193
193
|
}
|
|
194
194
|
]
|
|
195
195
|
}
|
package/src/data/metadata.ts
CHANGED
|
@@ -320,15 +320,10 @@ export const itemMetadata: Record<number, ItemMetadata> = {
|
|
|
320
320
|
'A cargo ship built around a large storage hold. The extra mass makes it slower than a Roustabout.',
|
|
321
321
|
color: '#4AE898',
|
|
322
322
|
},
|
|
323
|
-
|
|
324
|
-
name: '
|
|
325
|
-
description: 'A heavy gathering ship with two gathering rigs, so it mines faster.',
|
|
326
|
-
color: '#4AE898',
|
|
327
|
-
},
|
|
328
|
-
10217: {
|
|
329
|
-
name: 'Dredger',
|
|
323
|
+
10218: {
|
|
324
|
+
name: 'Smith',
|
|
330
325
|
description:
|
|
331
|
-
'A
|
|
326
|
+
'A crafting ship. One engine, one power core, and a fabricator for crafting away from home.',
|
|
332
327
|
color: '#4AE898',
|
|
333
328
|
},
|
|
334
329
|
|
|
@@ -405,16 +400,21 @@ export const itemMetadata: Record<number, ItemMetadata> = {
|
|
|
405
400
|
description: 'Advanced cargo container with improved capacity formulas.',
|
|
406
401
|
color: '#9BADB8',
|
|
407
402
|
},
|
|
408
|
-
|
|
403
|
+
20212: {
|
|
404
|
+
name: 'Prospector',
|
|
405
|
+
description: 'The tier 2 Prospector. The same three systems, ready for tier 2 modules.',
|
|
406
|
+
color: '#4AE898',
|
|
407
|
+
},
|
|
408
|
+
20213: {
|
|
409
409
|
name: 'Prospector',
|
|
410
410
|
description:
|
|
411
|
-
'
|
|
411
|
+
'A tier 2 Prospector with an auxiliary system for extra power, mobility, or endurance.',
|
|
412
412
|
color: '#4AE898',
|
|
413
413
|
},
|
|
414
|
-
|
|
415
|
-
name: '
|
|
414
|
+
20214: {
|
|
415
|
+
name: 'Dredger',
|
|
416
416
|
description:
|
|
417
|
-
'
|
|
417
|
+
'A gathering ship that stores what it digs. Its limpet bay works alongside a cargo hold.',
|
|
418
418
|
color: '#4AE898',
|
|
419
419
|
},
|
|
420
420
|
}
|
|
@@ -427,8 +427,7 @@ export const entityMetadata: Record<number, EntityMetadata> = {
|
|
|
427
427
|
10213: {moduleSlotLabels: ['Power Core', 'Engine', 'Assembly Arm']},
|
|
428
428
|
10214: {moduleSlotLabels: ['Power Core', 'Engine', 'Tractor Beam']},
|
|
429
429
|
10215: {moduleSlotLabels: ['Power Core', 'Engine', 'Cargo Hold']},
|
|
430
|
-
|
|
431
|
-
10217: {moduleSlotLabels: ['Power Core', 'Engine', 'Limpet Bay', 'Cargo Hold']},
|
|
430
|
+
10218: {moduleSlotLabels: ['Power Core', 'Engine', 'Fabricator']},
|
|
432
431
|
10202: {
|
|
433
432
|
moduleSlotLabels: ['Shuttle Bay', 'Cargo Hold', 'Cargo Hold', 'Cargo Hold', 'Cargo Hold'],
|
|
434
433
|
},
|
|
@@ -440,8 +439,9 @@ export const entityMetadata: Record<number, EntityMetadata> = {
|
|
|
440
439
|
moduleSlotLabels: ['Fabricator', 'Fabricator', 'Fabricator', 'Fabricator', 'Fabricator'],
|
|
441
440
|
},
|
|
442
441
|
10209: {moduleSlotLabels: ['Power Core', 'Assembly Arm']},
|
|
443
|
-
|
|
444
|
-
|
|
442
|
+
20212: {moduleSlotLabels: ['Power Core', 'Engine', 'Limpet Bay']},
|
|
443
|
+
20213: {moduleSlotLabels: ['Power Core', 'Engine', 'Auxiliary System', 'Limpet Bay']},
|
|
444
|
+
20214: {moduleSlotLabels: ['Power Core', 'Engine', 'Limpet Bay', 'Cargo Hold']},
|
|
445
445
|
}
|
|
446
446
|
|
|
447
447
|
for (const item of items as Array<{id: number}>) {
|