From d77558b8def94fd1e1efecc3cfebb7dd3b6d6ae3 Mon Sep 17 00:00:00 2001 From: Julien Dessaux Date: Tue, 21 May 2024 00:26:17 +0200 Subject: [node] implement agent automation that visits all shipyards with the starting probe --- nodejs/automation/agent.ts | 66 ++++++++++++++++++++++++++++++++++++++++ nodejs/automation/contracting.ts | 2 +- nodejs/lib/ships.ts | 17 +++++++++++ nodejs/lib/systems.ts | 6 ++-- nodejs/lib/utils.ts | 2 +- nodejs/main.ts | 20 +++++++----- 6 files changed, 101 insertions(+), 12 deletions(-) create mode 100644 nodejs/automation/agent.ts diff --git a/nodejs/automation/agent.ts b/nodejs/automation/agent.ts new file mode 100644 index 0000000..429c83f --- /dev/null +++ b/nodejs/automation/agent.ts @@ -0,0 +1,66 @@ +import events from 'events'; + +import * as autoContracting from './contracting.ts'; +import { debugLog, send, sleep } from '../lib/api.ts'; +import { getAgent } from '../lib/agent.ts'; +import { getShips, Ship } from '../lib/ships.ts'; +import { market, shipyard, trait, waypoint } from '../lib/systems.ts'; +import { Waypoint } from '../lib/types.ts'; +import { + distance, + sortByDistanceFrom, +} from '../lib/utils.ts'; + +const bus = new events.EventEmitter(); // a bus to notify the agent to start purchasing ships +let running = false; +let state = 0; +enum states { + start_running_contracts_with_the_command_ship = 0, + visit_all_shipyards, +} + +export async function run(): Promise { + if (running) { + throw 'refusing to start a second agent processor'; + } + running = true; + state = 0; + try { + while(true) { + const ships = getShips(); + switch(state) { + case states.start_running_contracts_with_the_command_ship: + //await autoContracting.run(ships[0]); + state++; + continue; + case states.visit_all_shipyards: + await visit_all_shipyards(ships[1]); + state++; + continue; + default: + debugLog('No more agent processor states implemented, exiting!') + return; + } + } + } catch (e) { + running = false; + throw e; + } +} + +async function visit_all_shipyards(probe: Ship) { + const probeWaypoint = await waypoint(probe.nav.waypointSymbol); + const shipyardWaypoints = await trait(probe.nav.systemSymbol, 'SHIPYARD'); + let candidates: Array = []; + for (const w of shipyardWaypoints) { + const shipyardData = await shipyard(w); + if (shipyardData.ships) continue; + candidates.push(w); + } + const nexts = sortByDistanceFrom(probeWaypoint, candidates).map(o => o.data); + for (const next of nexts) { + await probe.navigate(next); + await market(next); + await shipyard(next); + } +} diff --git a/nodejs/automation/contracting.ts b/nodejs/automation/contracting.ts index 2215b2c..80569ef 100644 --- a/nodejs/automation/contracting.ts +++ b/nodejs/automation/contracting.ts @@ -33,7 +33,7 @@ async function runOne(contract: Contract, ship: Ship): Promise { //if (contract.terms.deliver[0].tradeSymbol.match(/_ORE$/)) { // await runOreProcurement(contract, ship); //} else { - await runTradeProcurement(contract, ship); + await runTradeProcurement(contract, ship); //} break; default: diff --git a/nodejs/lib/ships.ts b/nodejs/lib/ships.ts index e4875f8..7daae71 100644 --- a/nodejs/lib/ships.ts +++ b/nodejs/lib/ships.ts @@ -88,6 +88,22 @@ export class Ship { await sleep(response.data.cooldown.remainingSeconds*1000); return this.cargo; } + //async flightMode(mode: string): Promise { + // if (this.nav.flightMode === mode) return; + // const response = await send