From 91d394dfc9bfa18e60031bbe1507e14e017240f3 Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Sun, 7 Apr 2024 23:04:38 +0200 Subject: [node] Implemented multi hops in system navigation --- nodejs/lib/ships.ts | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) (limited to 'nodejs/lib/ships.ts') diff --git a/nodejs/lib/ships.ts b/nodejs/lib/ships.ts index 67dca00..4ae64c7 100644 --- a/nodejs/lib/ships.ts +++ b/nodejs/lib/ships.ts @@ -10,6 +10,7 @@ import { ShipIsStillOnCooldownError, ShipRequiresMoreFuelForNavigationError, } from './errors.ts'; +import * as libSystems from './systems.ts'; import { Agent, Cargo, @@ -20,7 +21,11 @@ import { Registration, Waypoint, } from './types.ts'; +import { + shortestPath, +} from './utils.ts'; import * as dbAgents from '../database/agents.ts'; +import * as dbContracts from '../database/contracts.ts'; export async function getShips(): Promise> { const response = await send>({endpoint: `/my/ships`, page: 1}); @@ -98,26 +103,32 @@ export class Ship { return this.cargo.units >= this.cargo.capacity * 0.9; } async navigate(waypoint: Waypoint): Promise { - if (this.nav.waypointSymbol === waypoint.symbol) return; - // TODO compute fuel consumption and refuel if we do not have enough OR if the destination does not sell fuel? - await this.refuel(); + let path = shortestPath(await libSystems.waypoint(this.nav.route.destination.symbol), waypoint, this.fuel.capacity, await libSystems.waypoints(this.nav.systemSymbol)); + while (path.length > 0) { + const next = path.pop(); + if (next === undefined) break; + if (next.fuel > this.fuel.current) { + // TODO also refuel if the destination does not sell fuel? + await this.refuel(); + } + await this.navigateTo(next.symbol); + } + } + private async navigateTo(symbol: string): Promise { await this.orbit(); - // TODO if we do not have enough fuel, make a stop to refuel along the way or drift to the destination - const response = await send<{fuel: Fuel, nav: Nav}>({endpoint: `/my/ships/${this.symbol}/navigate`, method: 'POST', payload: { waypointSymbol: waypoint.symbol }}); // TODO events field + const response = await send<{fuel: Fuel, nav: Nav}>({endpoint: `/my/ships/${this.symbol}/navigate`, method: 'POST', payload: { waypointSymbol: symbol }}); // TODO events field if (response.error) { switch(response.error.code) { case 4203: // not enough fuel + // This should not happen given the logic in navigate() const srmffne = response.error.data as ShipRequiresMoreFuelForNavigationError; - // TODO test if it exceeds our maximum - // find an intermediate stop to refuel if that is the case debugLog(response); + debugLog(srmffne); throw response; - //await refuel(ship); - //return await navigate(ship, waypoint); case 4214: const sicite = response.error.data as ShipIsCurrentlyInTransitError; await sleep(sicite.secondsToArrival * 1000); - return await this.navigate(waypoint); + return await this.navigateTo(symbol); default: // yet unhandled error debugLog(response); throw response; -- cgit v1.2.3