@shipload/sdk 1.0.0-next.51 → 1.0.0-next.52

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 (58) hide show
  1. package/lib/shipload.d.ts +470 -157
  2. package/lib/shipload.js +2309 -492
  3. package/lib/shipload.js.map +1 -1
  4. package/lib/shipload.m.js +2279 -491
  5. package/lib/shipload.m.js.map +1 -1
  6. package/lib/testing.d.ts +123 -8
  7. package/lib/testing.js +450 -19
  8. package/lib/testing.js.map +1 -1
  9. package/lib/testing.m.js +451 -20
  10. package/lib/testing.m.js.map +1 -1
  11. package/package.json +1 -1
  12. package/src/capabilities/crafting.ts +10 -1
  13. package/src/capabilities/gathering.ts +1 -1
  14. package/src/capabilities/hauling.ts +0 -5
  15. package/src/capabilities/modules.ts +6 -0
  16. package/src/capabilities/movement.ts +1 -1
  17. package/src/contracts/server.ts +293 -13
  18. package/src/data/capabilities.ts +11 -2
  19. package/src/data/entities.json +235 -20
  20. package/src/data/item-ids.ts +10 -0
  21. package/src/data/items.json +61 -0
  22. package/src/data/kind-registry.json +53 -1
  23. package/src/data/kind-registry.ts +5 -0
  24. package/src/data/metadata.ts +74 -5
  25. package/src/data/recipes-runtime.ts +1 -0
  26. package/src/data/recipes.json +887 -118
  27. package/src/derivation/capabilities.test.ts +81 -4
  28. package/src/derivation/capabilities.ts +162 -57
  29. package/src/derivation/crafting.ts +2 -0
  30. package/src/derivation/recipe-usage.test.ts +10 -7
  31. package/src/derivation/rollups.ts +16 -0
  32. package/src/derivation/stat-scaling.ts +12 -0
  33. package/src/entities/makers.ts +10 -1
  34. package/src/index-module.ts +29 -3
  35. package/src/managers/actions.ts +77 -46
  36. package/src/managers/construction-types.ts +2 -2
  37. package/src/managers/construction.ts +15 -15
  38. package/src/managers/plot.ts +1 -1
  39. package/src/nft/buildImmutableData.ts +55 -9
  40. package/src/nft/description.ts +99 -36
  41. package/src/planner/planner.test.ts +50 -41
  42. package/src/resolution/resolve-item.test.ts +1 -1
  43. package/src/resolution/resolve-item.ts +26 -11
  44. package/src/scheduling/availability.ts +7 -6
  45. package/src/scheduling/cancel.test.ts +40 -6
  46. package/src/scheduling/cancel.ts +21 -29
  47. package/src/scheduling/jobs.ts +71 -0
  48. package/src/scheduling/lanes.ts +29 -0
  49. package/src/scheduling/projection.ts +42 -25
  50. package/src/scheduling/task-cargo.ts +1 -1
  51. package/src/testing/projection-parity.ts +2 -2
  52. package/src/travel/reach.ts +4 -6
  53. package/src/travel/route-planner.ts +60 -49
  54. package/src/travel/route-simulator.ts +3 -7
  55. package/src/travel/travel.ts +14 -5
  56. package/src/types/capabilities.ts +9 -3
  57. package/src/types.ts +5 -3
  58. package/src/managers/flatten-gather-plan.test.ts +0 -80
@@ -38,8 +38,17 @@ export const capabilityAttributes: CapabilityAttribute[] = [
38
38
  attribute: 'capacity',
39
39
  description: 'Cargo capacity added by hulls and installed Cargo Hold modules',
40
40
  },
41
+ {
42
+ capability: 'Storage',
43
+ attribute: 'drain',
44
+ description: 'Fixed normal-travel drain contributed by an installed Cargo Hold',
45
+ },
41
46
  {capability: 'Movement', attribute: 'thrust', description: 'Propulsion force'},
42
- {capability: 'Movement', attribute: 'drain', description: 'Energy consumed per movement'},
47
+ {
48
+ capability: 'Movement',
49
+ attribute: 'drain',
50
+ description: 'Total installed energy consumed per tile of normal travel',
51
+ },
43
52
  {
44
53
  capability: 'Energy',
45
54
  attribute: 'capacity',
@@ -80,7 +89,7 @@ export const capabilityAttributes: CapabilityAttribute[] = [
80
89
  {
81
90
  capability: 'Hauling',
82
91
  attribute: 'drain',
83
- description: 'Energy consumed per target during haul-beam operation',
92
+ description: 'Fixed normal-travel drain contributed by an installed Tractor Beam',
84
93
  },
85
94
  ]
86
95
 
@@ -1,7 +1,8 @@
1
1
  [
2
2
  {
3
3
  "entityItemId": 10200,
4
- "slots": []
4
+ "slots": [],
5
+ "baseHullmass": 100000
5
6
  },
6
7
  {
7
8
  "entityItemId": 10201,
@@ -31,7 +32,8 @@
31
32
  "outputPct": 80,
32
33
  "maxTier": 1
33
34
  }
34
- ]
35
+ ],
36
+ "baseHullmass": 4000000
35
37
  },
36
38
  {
37
39
  "entityItemId": 10202,
@@ -61,7 +63,8 @@
61
63
  "outputPct": 100,
62
64
  "maxTier": 1
63
65
  }
64
- ]
66
+ ],
67
+ "baseHullmass": 100000
65
68
  },
66
69
  {
67
70
  "entityItemId": 10203,
@@ -76,7 +79,8 @@
76
79
  "outputPct": 200,
77
80
  "maxTier": 1
78
81
  }
79
- ]
82
+ ],
83
+ "baseHullmass": 100000
80
84
  },
81
85
  {
82
86
  "entityItemId": 10204,
@@ -91,7 +95,8 @@
91
95
  "outputPct": 200,
92
96
  "maxTier": 1
93
97
  }
94
- ]
98
+ ],
99
+ "baseHullmass": 100000
95
100
  },
96
101
  {
97
102
  "entityItemId": 10205,
@@ -106,7 +111,8 @@
106
111
  "outputPct": 200,
107
112
  "maxTier": 1
108
113
  }
109
- ]
114
+ ],
115
+ "baseHullmass": 100000
110
116
  },
111
117
  {
112
118
  "entityItemId": 10206,
@@ -126,59 +132,267 @@
126
132
  "outputPct": 100,
127
133
  "maxTier": 1
128
134
  }
129
- ]
135
+ ],
136
+ "baseHullmass": 100000
130
137
  },
131
138
  {
132
139
  "entityItemId": 10207,
133
- "slots": []
140
+ "slots": [],
141
+ "baseHullmass": 100000
134
142
  },
135
143
  {
136
- "entityItemId": 20200,
137
- "slots": []
144
+ "entityItemId": 10208,
145
+ "slots": [
146
+ {
147
+ "type": "crafter",
148
+ "outputPct": 75,
149
+ "maxTier": 1
150
+ },
151
+ {
152
+ "type": "crafter",
153
+ "outputPct": 75,
154
+ "maxTier": 1
155
+ },
156
+ {
157
+ "type": "crafter",
158
+ "outputPct": 75,
159
+ "maxTier": 1
160
+ },
161
+ {
162
+ "type": "crafter",
163
+ "outputPct": 75,
164
+ "maxTier": 1
165
+ },
166
+ {
167
+ "type": "crafter",
168
+ "outputPct": 75,
169
+ "maxTier": 1
170
+ }
171
+ ],
172
+ "baseHullmass": 100000
138
173
  },
139
174
  {
140
- "entityItemId": 20210,
175
+ "entityItemId": 10210,
176
+ "slots": [
177
+ {
178
+ "type": "generator",
179
+ "outputPct": 80,
180
+ "maxTier": 1
181
+ },
182
+ {
183
+ "type": "engine",
184
+ "outputPct": 80,
185
+ "maxTier": 1
186
+ },
187
+ {
188
+ "type": "any",
189
+ "outputPct": 60,
190
+ "maxTier": 1
191
+ }
192
+ ],
193
+ "baseHullmass": 3200000
194
+ },
195
+ {
196
+ "entityItemId": 10211,
141
197
  "slots": [
198
+ {
199
+ "type": "generator",
200
+ "outputPct": 85,
201
+ "maxTier": 1
202
+ },
142
203
  {
143
204
  "type": "engine",
205
+ "outputPct": 85,
206
+ "maxTier": 1
207
+ },
208
+ {
209
+ "type": "gatherer",
144
210
  "outputPct": 100,
145
- "maxTier": 2
211
+ "maxTier": 1
212
+ }
213
+ ],
214
+ "baseHullmass": 3600000
215
+ },
216
+ {
217
+ "entityItemId": 10212,
218
+ "slots": [
219
+ {
220
+ "type": "generator",
221
+ "outputPct": 85,
222
+ "maxTier": 1
223
+ },
224
+ {
225
+ "type": "engine",
226
+ "outputPct": 85,
227
+ "maxTier": 1
146
228
  },
229
+ {
230
+ "type": "loader",
231
+ "outputPct": 100,
232
+ "maxTier": 1
233
+ }
234
+ ],
235
+ "baseHullmass": 3600000
236
+ },
237
+ {
238
+ "entityItemId": 10213,
239
+ "slots": [
147
240
  {
148
241
  "type": "generator",
242
+ "outputPct": 85,
243
+ "maxTier": 1
244
+ },
245
+ {
246
+ "type": "engine",
247
+ "outputPct": 85,
248
+ "maxTier": 1
249
+ },
250
+ {
251
+ "type": "builder",
149
252
  "outputPct": 100,
150
- "maxTier": 2
253
+ "maxTier": 1
254
+ }
255
+ ],
256
+ "baseHullmass": 4400000
257
+ },
258
+ {
259
+ "entityItemId": 10214,
260
+ "slots": [
261
+ {
262
+ "type": "generator",
263
+ "outputPct": 85,
264
+ "maxTier": 1
265
+ },
266
+ {
267
+ "type": "engine",
268
+ "outputPct": 85,
269
+ "maxTier": 1
270
+ },
271
+ {
272
+ "type": "hauler",
273
+ "outputPct": 100,
274
+ "maxTier": 1
275
+ }
276
+ ],
277
+ "baseHullmass": 4400000
278
+ },
279
+ {
280
+ "entityItemId": 10215,
281
+ "slots": [
282
+ {
283
+ "type": "generator",
284
+ "outputPct": 85,
285
+ "maxTier": 1
286
+ },
287
+ {
288
+ "type": "engine",
289
+ "outputPct": 85,
290
+ "maxTier": 1
291
+ },
292
+ {
293
+ "type": "storage",
294
+ "outputPct": 100,
295
+ "maxTier": 1
296
+ }
297
+ ],
298
+ "baseHullmass": 5000000
299
+ },
300
+ {
301
+ "entityItemId": 10216,
302
+ "slots": [
303
+ {
304
+ "type": "generator",
305
+ "outputPct": 90,
306
+ "maxTier": 1
307
+ },
308
+ {
309
+ "type": "engine",
310
+ "outputPct": 90,
311
+ "maxTier": 1
151
312
  },
152
313
  {
153
314
  "type": "gatherer",
154
315
  "outputPct": 100,
155
- "maxTier": 2
316
+ "maxTier": 1
156
317
  },
157
318
  {
158
319
  "type": "gatherer",
159
320
  "outputPct": 100,
160
- "maxTier": 2
321
+ "maxTier": 1
322
+ }
323
+ ],
324
+ "baseHullmass": 4000000
325
+ },
326
+ {
327
+ "entityItemId": 10217,
328
+ "slots": [
329
+ {
330
+ "type": "generator",
331
+ "outputPct": 90,
332
+ "maxTier": 1
161
333
  },
162
334
  {
163
- "type": "any",
164
- "outputPct": 80,
335
+ "type": "engine",
336
+ "outputPct": 90,
337
+ "maxTier": 1
338
+ },
339
+ {
340
+ "type": "gatherer",
341
+ "outputPct": 100,
342
+ "maxTier": 1
343
+ },
344
+ {
345
+ "type": "storage",
346
+ "outputPct": 100,
165
347
  "maxTier": 1
166
348
  }
167
- ]
349
+ ],
350
+ "baseHullmass": 4800000
168
351
  },
169
352
  {
170
- "entityItemId": 20211,
353
+ "entityItemId": 20200,
354
+ "slots": [],
355
+ "baseHullmass": 100000
356
+ },
357
+ {
358
+ "entityItemId": 20210,
171
359
  "slots": [
360
+ {
361
+ "type": "generator",
362
+ "outputPct": 100,
363
+ "maxTier": 2
364
+ },
365
+ {
366
+ "type": "generator",
367
+ "outputPct": 100,
368
+ "maxTier": 2
369
+ },
172
370
  {
173
371
  "type": "engine",
174
372
  "outputPct": 100,
175
373
  "maxTier": 2
176
374
  },
375
+ {
376
+ "type": "gatherer",
377
+ "outputPct": 100,
378
+ "maxTier": 2
379
+ }
380
+ ],
381
+ "baseHullmass": 5760000
382
+ },
383
+ {
384
+ "entityItemId": 20211,
385
+ "slots": [
177
386
  {
178
387
  "type": "generator",
179
388
  "outputPct": 100,
180
389
  "maxTier": 2
181
390
  },
391
+ {
392
+ "type": "engine",
393
+ "outputPct": 100,
394
+ "maxTier": 2
395
+ },
182
396
  {
183
397
  "type": "hauler",
184
398
  "outputPct": 100,
@@ -189,6 +403,7 @@
189
403
  "outputPct": 100,
190
404
  "maxTier": 2
191
405
  }
192
- ]
406
+ ],
407
+ "baseHullmass": 7040000
193
408
  }
194
409
  ]
@@ -70,6 +70,7 @@ export const ITEM_HAULER_T1 = 10106
70
70
  export const ITEM_WARP_T1 = 10107
71
71
  export const ITEM_BATTERY_T1 = 10108
72
72
  export const ITEM_LAUNCHER_T1 = 10109
73
+ export const ITEM_BUILDER_T1 = 10110
73
74
  export const ITEM_CONTAINER_T1_PACKED = 10200
74
75
  export const ITEM_SHIP_T1_PACKED = 10201
75
76
  export const ITEM_WAREHOUSE_T1_PACKED = 10202
@@ -78,6 +79,15 @@ export const ITEM_FACTORY_T1_PACKED = 10204
78
79
  export const ITEM_MASS_DRIVER_T1_PACKED = 10205
79
80
  export const ITEM_MASS_CATCHER_T1_PACKED = 10206
80
81
  export const ITEM_HUB_T1_PACKED = 10207
82
+ export const ITEM_WORKSHOP_T1_PACKED = 10208
83
+ export const ITEM_ROUSTABOUT_T1_PACKED = 10210
84
+ export const ITEM_PROSPECTOR_T1_PACKED = 10211
85
+ export const ITEM_TENDER_T1_PACKED = 10212
86
+ export const ITEM_WRIGHT_T1_PACKED = 10213
87
+ export const ITEM_TUG_T1_PACKED = 10214
88
+ export const ITEM_PORTER_T1_PACKED = 10215
89
+ export const ITEM_WRANGLER_T1_PACKED = 10216
90
+ export const ITEM_DREDGER_T1_PACKED = 10217
81
91
  export const ITEM_PLATE_T2 = 20001
82
92
  export const ITEM_FRAME_T2 = 20002
83
93
  export const ITEM_PLASMA_CELL_T2 = 20003
@@ -479,6 +479,13 @@
479
479
  "tier": 1,
480
480
  "subtype": "launcher"
481
481
  },
482
+ {
483
+ "id": 10110,
484
+ "mass": 960000,
485
+ "type": "module",
486
+ "tier": 1,
487
+ "subtype": "builder"
488
+ },
482
489
  {
483
490
  "id": 10200,
484
491
  "mass": 1900000,
@@ -527,6 +534,60 @@
527
534
  "type": "entity",
528
535
  "tier": 1
529
536
  },
537
+ {
538
+ "id": 10208,
539
+ "mass": 1900000,
540
+ "type": "entity",
541
+ "tier": 1
542
+ },
543
+ {
544
+ "id": 10210,
545
+ "mass": 1600000,
546
+ "type": "entity",
547
+ "tier": 1
548
+ },
549
+ {
550
+ "id": 10211,
551
+ "mass": 2400000,
552
+ "type": "entity",
553
+ "tier": 1
554
+ },
555
+ {
556
+ "id": 10212,
557
+ "mass": 2400000,
558
+ "type": "entity",
559
+ "tier": 1
560
+ },
561
+ {
562
+ "id": 10213,
563
+ "mass": 2400000,
564
+ "type": "entity",
565
+ "tier": 1
566
+ },
567
+ {
568
+ "id": 10214,
569
+ "mass": 2400000,
570
+ "type": "entity",
571
+ "tier": 1
572
+ },
573
+ {
574
+ "id": 10215,
575
+ "mass": 2400000,
576
+ "type": "entity",
577
+ "tier": 1
578
+ },
579
+ {
580
+ "id": 10216,
581
+ "mass": 3600000,
582
+ "type": "entity",
583
+ "tier": 1
584
+ },
585
+ {
586
+ "id": 10217,
587
+ "mass": 3600000,
588
+ "type": "entity",
589
+ "tier": 1
590
+ },
530
591
  {
531
592
  "id": 20001,
532
593
  "mass": 4800,
@@ -69,14 +69,61 @@
69
69
  "capabilityFlags": 4,
70
70
  "zCoord": 0,
71
71
  "defaultLabel": "Station Hub"
72
+ },
73
+ {
74
+ "kind": "workshop",
75
+ "classification": "OrbitalStructure",
76
+ "capabilityFlags": 20,
77
+ "zCoord": 0,
78
+ "defaultLabel": "Workshop"
72
79
  }
73
80
  ],
74
81
  "templates": [
75
82
  {
76
83
  "itemId": 10201,
77
84
  "kind": "ship",
85
+ "displayLabel": "Ship"
86
+ },
87
+ {
88
+ "itemId": 10210,
89
+ "kind": "ship",
78
90
  "displayLabel": "Roustabout"
79
91
  },
92
+ {
93
+ "itemId": 10211,
94
+ "kind": "ship",
95
+ "displayLabel": "Prospector"
96
+ },
97
+ {
98
+ "itemId": 10212,
99
+ "kind": "ship",
100
+ "displayLabel": "Tender"
101
+ },
102
+ {
103
+ "itemId": 10213,
104
+ "kind": "ship",
105
+ "displayLabel": "Wright"
106
+ },
107
+ {
108
+ "itemId": 10214,
109
+ "kind": "ship",
110
+ "displayLabel": "Tug"
111
+ },
112
+ {
113
+ "itemId": 10215,
114
+ "kind": "ship",
115
+ "displayLabel": "Porter"
116
+ },
117
+ {
118
+ "itemId": 10216,
119
+ "kind": "ship",
120
+ "displayLabel": "Wrangler"
121
+ },
122
+ {
123
+ "itemId": 10217,
124
+ "kind": "ship",
125
+ "displayLabel": "Dredger"
126
+ },
80
127
  {
81
128
  "itemId": 10202,
82
129
  "kind": "warehouse",
@@ -117,6 +164,11 @@
117
164
  "kind": "hub",
118
165
  "displayLabel": ""
119
166
  },
167
+ {
168
+ "itemId": 10208,
169
+ "kind": "workshop",
170
+ "displayLabel": ""
171
+ },
120
172
  {
121
173
  "itemId": 20210,
122
174
  "kind": "ship",
@@ -125,7 +177,7 @@
125
177
  {
126
178
  "itemId": 20211,
127
179
  "kind": "ship",
128
- "displayLabel": "Hauler"
180
+ "displayLabel": "Tug"
129
181
  }
130
182
  ]
131
183
  }
@@ -26,6 +26,7 @@ export type EntityTypeName =
26
26
  | 'warehouse'
27
27
  | 'extractor'
28
28
  | 'factory'
29
+ | 'workshop'
29
30
  | 'container'
30
31
  | 'nexus'
31
32
  | 'plot'
@@ -133,6 +134,7 @@ export const ENTITY_SHIP = Name.from('ship')
133
134
  export const ENTITY_WAREHOUSE = Name.from('warehouse')
134
135
  export const ENTITY_EXTRACTOR = Name.from('extractor')
135
136
  export const ENTITY_FACTORY = Name.from('factory')
137
+ export const ENTITY_WORKSHOP = Name.from('workshop')
136
138
  export const ENTITY_CONTAINER = Name.from('container')
137
139
  export const ENTITY_NEXUS = Name.from('nexus')
138
140
  export const ENTITY_PLOT = Name.from('plot')
@@ -152,6 +154,9 @@ export function isExtractor(entity: {type?: Name}): boolean {
152
154
  export function isFactory(entity: {type?: Name}): boolean {
153
155
  return entity.type?.equals(ENTITY_FACTORY) ?? false
154
156
  }
157
+ export function isWorkshop(entity: {type?: Name}): boolean {
158
+ return entity.type?.equals(ENTITY_WORKSHOP) ?? false
159
+ }
155
160
  export function isContainer(entity: {type?: Name}): boolean {
156
161
  return entity.type?.equals(ENTITY_CONTAINER) ?? false
157
162
  }
@@ -204,7 +204,7 @@ export const itemMetadata: Record<number, ItemMetadata> = {
204
204
  10106: {
205
205
  name: 'Tractor Beam',
206
206
  description:
207
- 'Projects a haul beam to lock onto and transport containers or warehouses through group travel.',
207
+ 'Projects a haul beam to lock onto and transport containers through group travel.',
208
208
  color: '#4ADBFF',
209
209
  },
210
210
  10107: {
@@ -223,6 +223,12 @@ export const itemMetadata: Record<number, ItemMetadata> = {
223
223
  description: 'Accelerates and launches cargo payloads toward a remote mass catcher.',
224
224
  color: '#E86344',
225
225
  },
226
+ 10110: {
227
+ name: 'Assembly Arm',
228
+ description:
229
+ 'Heavy manipulator arms for on-site construction work. Claims build sites, builds them out, and upgrades ships in place.',
230
+ color: '#FFB347',
231
+ },
226
232
 
227
233
  // === Entities (packed, T1) ===
228
234
  10200: {
@@ -231,7 +237,7 @@ export const itemMetadata: Record<number, ItemMetadata> = {
231
237
  color: '#7B8D9E',
232
238
  },
233
239
  10201: {
234
- name: 'Roustabout',
240
+ name: 'Ship',
235
241
  description: 'General-purpose vessel with 5 module slots.',
236
242
  color: '#4AE898',
237
243
  },
@@ -267,6 +273,58 @@ export const itemMetadata: Record<number, ItemMetadata> = {
267
273
  description: 'Orbital command structure. Anchors a player station cluster.',
268
274
  color: '#A0B8D0',
269
275
  },
276
+ 10208: {
277
+ name: 'Workshop',
278
+ description:
279
+ 'A station workshop with five independent workers. Visiting ships bring materials and power, and the workshop does the crafting.',
280
+ color: '#B877FF',
281
+ },
282
+ 10210: {
283
+ name: 'Roustabout',
284
+ description:
285
+ 'A basic starter ship. One engine, one power core, and one open slot to fit as you like.',
286
+ color: '#4AE898',
287
+ },
288
+ 10211: {
289
+ name: 'Prospector',
290
+ description: 'A light gathering ship. One engine, one power core, one gathering rig.',
291
+ color: '#4AE898',
292
+ },
293
+ 10212: {
294
+ name: 'Tender',
295
+ description:
296
+ 'A logistics ship with a shuttle bay for moving cargo between ships and stations.',
297
+ color: '#4AE898',
298
+ },
299
+ 10213: {
300
+ name: 'Wright',
301
+ description:
302
+ 'A construction ship with an assembly arm for building structures and upgrading ships.',
303
+ color: '#4AE898',
304
+ },
305
+ 10214: {
306
+ name: 'Tug',
307
+ description:
308
+ 'A logistics ship with a tractor beam for towing containers from place to place.',
309
+ color: '#4AE898',
310
+ },
311
+ 10215: {
312
+ name: 'Porter',
313
+ description:
314
+ 'A cargo ship built around a large storage hold. The extra mass makes it slower than a Roustabout.',
315
+ color: '#4AE898',
316
+ },
317
+ 10216: {
318
+ name: 'Wrangler',
319
+ description: 'A heavy gathering ship with two gathering rigs, so it mines faster.',
320
+ color: '#4AE898',
321
+ },
322
+ 10217: {
323
+ name: 'Dredger',
324
+ description:
325
+ 'A gathering ship with its own storage hold, so it can keep mining before it has to offload.',
326
+ color: '#4AE898',
327
+ },
270
328
 
271
329
  // === Components (T2) ===
272
330
  20001: {
@@ -348,7 +406,7 @@ export const itemMetadata: Record<number, ItemMetadata> = {
348
406
  color: '#4AE898',
349
407
  },
350
408
  20211: {
351
- name: 'Hauler',
409
+ name: 'Tug',
352
410
  description:
353
411
  'Advanced towing vessel with tiered engine, generator, and tractor beam slots.',
354
412
  color: '#4AE898',
@@ -357,6 +415,14 @@ export const itemMetadata: Record<number, ItemMetadata> = {
357
415
 
358
416
  export const entityMetadata: Record<number, EntityMetadata> = {
359
417
  10201: {moduleSlotLabels: ['Engine', 'Power Core', 'Limpet Bay', 'Shuttle Bay', 'Cargo Hold']},
418
+ 10210: {moduleSlotLabels: ['Power Core', 'Engine', 'Utility Bay']},
419
+ 10211: {moduleSlotLabels: ['Power Core', 'Engine', 'Limpet Bay']},
420
+ 10212: {moduleSlotLabels: ['Power Core', 'Engine', 'Shuttle Bay']},
421
+ 10213: {moduleSlotLabels: ['Power Core', 'Engine', 'Assembly Arm']},
422
+ 10214: {moduleSlotLabels: ['Power Core', 'Engine', 'Tractor Beam']},
423
+ 10215: {moduleSlotLabels: ['Power Core', 'Engine', 'Cargo Hold']},
424
+ 10216: {moduleSlotLabels: ['Power Core', 'Engine', 'Limpet Bay', 'Limpet Bay']},
425
+ 10217: {moduleSlotLabels: ['Power Core', 'Engine', 'Limpet Bay', 'Cargo Hold']},
360
426
  10202: {
361
427
  moduleSlotLabels: ['Shuttle Bay', 'Cargo Hold', 'Cargo Hold', 'Cargo Hold', 'Cargo Hold'],
362
428
  },
@@ -364,8 +430,11 @@ export const entityMetadata: Record<number, EntityMetadata> = {
364
430
  10204: {moduleSlotLabels: ['Power Core', 'Fabricator']},
365
431
  10205: {moduleSlotLabels: ['Power Core', 'Drive Coil']},
366
432
  10206: {moduleSlotLabels: ['Cargo Hold', 'Cargo Hold', 'Cargo Hold']},
367
- 20210: {moduleSlotLabels: ['Engine', 'Power Core', 'Limpet Bay', 'Limpet Bay', 'Flex Slot']},
368
- 20211: {moduleSlotLabels: ['Engine', 'Power Core', 'Tractor Beam', 'Tractor Beam']},
433
+ 10208: {
434
+ moduleSlotLabels: ['Fabricator', 'Fabricator', 'Fabricator', 'Fabricator', 'Fabricator'],
435
+ },
436
+ 20210: {moduleSlotLabels: ['Power Core', 'Power Core', 'Engine', 'Limpet Bay']},
437
+ 20211: {moduleSlotLabels: ['Power Core', 'Engine', 'Tractor Beam', 'Tractor Beam']},
369
438
  }
370
439
 
371
440
  for (const item of items as Array<{id: number}>) {