@shipload/sdk 2.0.0-rc11 → 2.0.0-rc12
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 +66 -22
- package/lib/shipload.js +2361 -2117
- package/lib/shipload.js.map +1 -1
- package/lib/shipload.m.js +2344 -2117
- package/lib/shipload.m.js.map +1 -1
- package/package.json +1 -1
- package/src/capabilities/storage.ts +92 -2
- package/src/data/categories.ts +1 -1
- package/src/derivation/crafting.ts +76 -0
- package/src/derivation/index.ts +3 -1
- package/src/derivation/resources.ts +1 -7
- package/src/derivation/stratum.ts +9 -11
- package/src/derivation/tiers.ts +54 -0
- package/src/errors.ts +5 -0
- package/src/index-module.ts +11 -3
- package/src/market/items.ts +69 -10
- package/src/scheduling/projection.ts +84 -75
- package/src/types.ts +2 -1
- package/src/utils/system.ts +8 -4
|
@@ -8,21 +8,30 @@ import {
|
|
|
8
8
|
EntityCapabilities,
|
|
9
9
|
EntityState,
|
|
10
10
|
} from '../types/capabilities'
|
|
11
|
+
import {ENTITY_CAPACITY_EXCEEDED} from '../errors'
|
|
11
12
|
import {distanceBetweenCoordinates, lerp} from '../travel/travel'
|
|
12
|
-
import {
|
|
13
|
+
import {
|
|
14
|
+
calcStacksMass,
|
|
15
|
+
cargoItemToStack,
|
|
16
|
+
CargoStack,
|
|
17
|
+
mergeStacks,
|
|
18
|
+
removeFromStacks,
|
|
19
|
+
stackToCargoItem,
|
|
20
|
+
} from '../capabilities/storage'
|
|
13
21
|
import * as schedule from './schedule'
|
|
14
22
|
import {ScheduleData} from './schedule'
|
|
15
23
|
|
|
16
24
|
export interface ProjectedEntity {
|
|
17
25
|
location: Coordinates
|
|
18
26
|
energy: UInt16
|
|
19
|
-
|
|
27
|
+
cargo: CargoStack[]
|
|
20
28
|
shipMass: UInt32
|
|
21
29
|
capacity?: UInt64
|
|
22
30
|
engines?: ServerContract.Types.movement_stats
|
|
23
31
|
loaders?: ServerContract.Types.loader_stats
|
|
24
32
|
generator?: ServerContract.Types.energy_stats
|
|
25
33
|
hauler?: ServerContract.Types.hauler_stats
|
|
34
|
+
readonly cargoMass: UInt64
|
|
26
35
|
readonly totalMass: UInt64
|
|
27
36
|
|
|
28
37
|
hasMovement(): boolean
|
|
@@ -52,7 +61,6 @@ function getHullMass(entity: Projectable): UInt32 {
|
|
|
52
61
|
}
|
|
53
62
|
|
|
54
63
|
export function createProjectedEntity(entity: Projectable): ProjectedEntity {
|
|
55
|
-
const cargoMass = calcCargoMass(entity)
|
|
56
64
|
const shipMass = getHullMass(entity)
|
|
57
65
|
const loaders = entity.loaders
|
|
58
66
|
const engines = entity.engines
|
|
@@ -60,10 +68,12 @@ export function createProjectedEntity(entity: Projectable): ProjectedEntity {
|
|
|
60
68
|
const hauler = entity.hauler
|
|
61
69
|
const capacity = entity.capacity
|
|
62
70
|
|
|
71
|
+
const cargo: CargoStack[] = entity.cargo.map(cargoItemToStack)
|
|
72
|
+
|
|
63
73
|
const projected: ProjectedEntity = {
|
|
64
74
|
location: Coordinates.from(entity.coordinates),
|
|
65
75
|
energy: UInt16.from(entity.energy ?? 0),
|
|
66
|
-
|
|
76
|
+
cargo,
|
|
67
77
|
shipMass,
|
|
68
78
|
capacity: capacity ? UInt64.from(capacity) : undefined,
|
|
69
79
|
engines,
|
|
@@ -71,6 +81,10 @@ export function createProjectedEntity(entity: Projectable): ProjectedEntity {
|
|
|
71
81
|
hauler,
|
|
72
82
|
loaders,
|
|
73
83
|
|
|
84
|
+
get cargoMass() {
|
|
85
|
+
return calcStacksMass(this.cargo)
|
|
86
|
+
},
|
|
87
|
+
|
|
74
88
|
get totalMass() {
|
|
75
89
|
let mass = UInt64.from(this.shipMass).adding(this.cargoMass)
|
|
76
90
|
if (this.loaders) {
|
|
@@ -107,7 +121,7 @@ export function createProjectedEntity(entity: Projectable): ProjectedEntity {
|
|
|
107
121
|
location: ServerContract.Types.coordinates.from(this.location),
|
|
108
122
|
energy: this.energy,
|
|
109
123
|
cargomass: UInt32.from(this.cargoMass),
|
|
110
|
-
cargo:
|
|
124
|
+
cargo: this.cargo.map(stackToCargoItem),
|
|
111
125
|
}
|
|
112
126
|
},
|
|
113
127
|
}
|
|
@@ -162,18 +176,23 @@ function applyFlightTask(
|
|
|
162
176
|
}
|
|
163
177
|
}
|
|
164
178
|
|
|
165
|
-
function
|
|
179
|
+
function addCargoItem(projected: ProjectedEntity, item: ServerContract.Types.cargo_item): void {
|
|
180
|
+
projected.cargo = mergeStacks(projected.cargo, cargoItemToStack(item))
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function removeCargoItem(projected: ProjectedEntity, item: ServerContract.Types.cargo_item): void {
|
|
184
|
+
projected.cargo = removeFromStacks(projected.cargo, cargoItemToStack(item))
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function applyAddCargoTask(projected: ProjectedEntity, task: ServerContract.Types.task): void {
|
|
166
188
|
for (const item of task.cargo) {
|
|
167
|
-
projected
|
|
189
|
+
addCargoItem(projected, item)
|
|
168
190
|
}
|
|
169
191
|
}
|
|
170
192
|
|
|
171
|
-
function
|
|
193
|
+
function applyRemoveCargoTask(projected: ProjectedEntity, task: ServerContract.Types.task): void {
|
|
172
194
|
for (const item of task.cargo) {
|
|
173
|
-
|
|
174
|
-
projected.cargoMass = projected.cargoMass.gt(cargoMass)
|
|
175
|
-
? projected.cargoMass.subtracting(cargoMass)
|
|
176
|
-
: UInt64.from(0)
|
|
195
|
+
removeCargoItem(projected, item)
|
|
177
196
|
}
|
|
178
197
|
}
|
|
179
198
|
|
|
@@ -191,75 +210,74 @@ function applyGatherTask(
|
|
|
191
210
|
options: {complete: boolean}
|
|
192
211
|
): void {
|
|
193
212
|
if (!options.complete) return
|
|
194
|
-
|
|
195
213
|
applyEnergyCost(projected, task)
|
|
196
|
-
|
|
197
|
-
for (const item of task.cargo) {
|
|
198
|
-
projected.cargoMass = projected.cargoMass.adding(calcCargoItemMass(item))
|
|
199
|
-
}
|
|
214
|
+
applyAddCargoTask(projected, task)
|
|
200
215
|
}
|
|
201
216
|
|
|
202
217
|
function applyCraftTask(projected: ProjectedEntity, task: ServerContract.Types.task): void {
|
|
203
218
|
applyEnergyCost(projected, task)
|
|
219
|
+
if (task.cargo.length === 0) return
|
|
204
220
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
const inputMass = calcCargoItemMass(task.cargo[i])
|
|
208
|
-
projected.cargoMass = projected.cargoMass.gt(inputMass)
|
|
209
|
-
? projected.cargoMass.subtracting(inputMass)
|
|
210
|
-
: UInt64.from(0)
|
|
211
|
-
}
|
|
212
|
-
const output = task.cargo[task.cargo.length - 1]
|
|
213
|
-
projected.cargoMass = projected.cargoMass.adding(calcCargoItemMass(output))
|
|
221
|
+
for (let i = 0; i < task.cargo.length - 1; i++) {
|
|
222
|
+
removeCargoItem(projected, task.cargo[i])
|
|
214
223
|
}
|
|
224
|
+
addCargoItem(projected, task.cargo[task.cargo.length - 1])
|
|
215
225
|
}
|
|
216
226
|
|
|
217
227
|
function applyDeployTask(projected: ProjectedEntity, task: ServerContract.Types.task): void {
|
|
218
228
|
applyEnergyCost(projected, task)
|
|
219
|
-
|
|
220
229
|
if (task.cargo.length > 0) {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
230
|
+
removeCargoItem(projected, task.cargo[0])
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function applyTask(projected: ProjectedEntity, task: ServerContract.Types.task): void {
|
|
235
|
+
switch (task.type.toNumber()) {
|
|
236
|
+
case TaskType.RECHARGE:
|
|
237
|
+
applyRechargeTask(projected, task, {complete: true})
|
|
238
|
+
break
|
|
239
|
+
case TaskType.TRAVEL:
|
|
240
|
+
applyFlightTask(projected, task, {complete: true})
|
|
241
|
+
break
|
|
242
|
+
case TaskType.LOAD:
|
|
243
|
+
case TaskType.UNWRAP:
|
|
244
|
+
applyAddCargoTask(projected, task)
|
|
245
|
+
break
|
|
246
|
+
case TaskType.UNLOAD:
|
|
247
|
+
case TaskType.WRAP:
|
|
248
|
+
applyRemoveCargoTask(projected, task)
|
|
249
|
+
break
|
|
250
|
+
case TaskType.GATHER:
|
|
251
|
+
applyGatherTask(projected, task, {complete: true})
|
|
252
|
+
break
|
|
253
|
+
case TaskType.CRAFT:
|
|
254
|
+
applyCraftTask(projected, task)
|
|
255
|
+
break
|
|
256
|
+
case TaskType.DEPLOY:
|
|
257
|
+
applyDeployTask(projected, task)
|
|
258
|
+
break
|
|
225
259
|
}
|
|
226
260
|
}
|
|
227
261
|
|
|
228
262
|
export function projectEntity(entity: Projectable): ProjectedEntity {
|
|
229
263
|
const projected = createProjectedEntity(entity)
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
264
|
+
if (!entity.schedule || entity.schedule.tasks.length === 0) return projected
|
|
265
|
+
for (const task of entity.schedule.tasks) {
|
|
266
|
+
applyTask(projected, task)
|
|
233
267
|
}
|
|
268
|
+
return projected
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
export function validateSchedule(entity: Projectable): void {
|
|
272
|
+
if (!entity.schedule || entity.schedule.tasks.length === 0) return
|
|
234
273
|
|
|
274
|
+
const projected = createProjectedEntity(entity)
|
|
235
275
|
for (const task of entity.schedule.tasks) {
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
break
|
|
240
|
-
case TaskType.TRAVEL:
|
|
241
|
-
applyFlightTask(projected, task, {complete: true})
|
|
242
|
-
break
|
|
243
|
-
case TaskType.LOAD:
|
|
244
|
-
applyLoadTask(projected, task)
|
|
245
|
-
break
|
|
246
|
-
case TaskType.UNLOAD:
|
|
247
|
-
applyUnloadTask(projected, task)
|
|
248
|
-
break
|
|
249
|
-
case TaskType.GATHER:
|
|
250
|
-
applyGatherTask(projected, task, {complete: true})
|
|
251
|
-
break
|
|
252
|
-
case TaskType.CRAFT:
|
|
253
|
-
applyCraftTask(projected, task)
|
|
254
|
-
break
|
|
255
|
-
case TaskType.DEPLOY:
|
|
256
|
-
case TaskType.DEPLOY_SHIP:
|
|
257
|
-
applyDeployTask(projected, task)
|
|
258
|
-
break
|
|
276
|
+
applyTask(projected, task)
|
|
277
|
+
if (projected.capacity && projected.cargoMass.gt(projected.capacity)) {
|
|
278
|
+
throw new Error(ENTITY_CAPACITY_EXCEEDED)
|
|
259
279
|
}
|
|
260
280
|
}
|
|
261
|
-
|
|
262
|
-
return projected
|
|
263
281
|
}
|
|
264
282
|
|
|
265
283
|
export function projectEntityAt(entity: Projectable, now: Date): ProjectedEntity {
|
|
@@ -290,30 +308,21 @@ export function projectEntityAt(entity: Projectable, now: Date): ProjectedEntity
|
|
|
290
308
|
applyFlightTask(projected, task, {complete: taskComplete, progress})
|
|
291
309
|
break
|
|
292
310
|
case TaskType.LOAD:
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
}
|
|
311
|
+
case TaskType.UNWRAP:
|
|
312
|
+
if (taskComplete) applyAddCargoTask(projected, task)
|
|
296
313
|
break
|
|
297
314
|
case TaskType.UNLOAD:
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
}
|
|
315
|
+
case TaskType.WRAP:
|
|
316
|
+
if (taskComplete) applyRemoveCargoTask(projected, task)
|
|
301
317
|
break
|
|
302
318
|
case TaskType.GATHER:
|
|
303
|
-
if (taskComplete) {
|
|
304
|
-
applyGatherTask(projected, task, {complete: true})
|
|
305
|
-
}
|
|
319
|
+
if (taskComplete) applyGatherTask(projected, task, {complete: true})
|
|
306
320
|
break
|
|
307
321
|
case TaskType.CRAFT:
|
|
308
|
-
if (taskComplete)
|
|
309
|
-
applyCraftTask(projected, task)
|
|
310
|
-
}
|
|
322
|
+
if (taskComplete) applyCraftTask(projected, task)
|
|
311
323
|
break
|
|
312
324
|
case TaskType.DEPLOY:
|
|
313
|
-
|
|
314
|
-
if (taskComplete) {
|
|
315
|
-
applyDeployTask(projected, task)
|
|
316
|
-
}
|
|
325
|
+
if (taskComplete) applyDeployTask(projected, task)
|
|
317
326
|
break
|
|
318
327
|
}
|
|
319
328
|
}
|
package/src/types.ts
CHANGED
package/src/utils/system.ts
CHANGED
|
@@ -36,10 +36,14 @@ export function isGatherableLocation(locationType: LocationType): boolean {
|
|
|
36
36
|
|
|
37
37
|
export function getLocationTypeName(type: LocationType): string {
|
|
38
38
|
switch (type) {
|
|
39
|
-
case LocationType.EMPTY:
|
|
40
|
-
|
|
41
|
-
case LocationType.
|
|
42
|
-
|
|
39
|
+
case LocationType.EMPTY:
|
|
40
|
+
return 'Empty'
|
|
41
|
+
case LocationType.PLANET:
|
|
42
|
+
return 'Planet'
|
|
43
|
+
case LocationType.ASTEROID:
|
|
44
|
+
return 'Asteroid'
|
|
45
|
+
case LocationType.NEBULA:
|
|
46
|
+
return 'Nebula'
|
|
43
47
|
}
|
|
44
48
|
}
|
|
45
49
|
|