1
0
Fork 0

[node] send probes to visit all markets

This commit is contained in:
Julien Dessaux 2024-05-24 00:29:04 +02:00
parent 3306159369
commit d0f6c4343e
Signed by: adyxax
GPG key ID: F92E51B86E07177E
2 changed files with 60 additions and 30 deletions

View file

@ -1,5 +1,3 @@
import events from 'events';
import * as autoContracting from './contracting.ts'; import * as autoContracting from './contracting.ts';
import { debugLog, send, sleep } from '../lib/api.ts'; import { debugLog, send, sleep } from '../lib/api.ts';
import { getAgent } from '../lib/agent.ts'; import { getAgent } from '../lib/agent.ts';
@ -7,17 +5,18 @@ import { getShips, purchaseShip, Ship } from '../lib/ships.ts';
import { market, shipyard, trait, waypoint } from '../lib/systems.ts'; import { market, shipyard, trait, waypoint } from '../lib/systems.ts';
import { Waypoint } from '../lib/types.ts'; import { Waypoint } from '../lib/types.ts';
import { import {
are_we_done_visiting_all_markets,
distance, distance,
is_there_a_ship_at_this_waypoint,
sortByDistanceFrom, sortByDistanceFrom,
} from '../lib/utils.ts'; } from '../lib/utils.ts';
const bus = new events.EventEmitter(); // a bus to notify the agent to start purchasing ships
let running = false; let running = false;
let state = 0; let state = 0;
enum states { enum states {
start_running_contracts_with_the_command_ship = 0, start_running_contracts_with_the_command_ship = 0,
visit_all_shipyards, visit_all_shipyards,
send_the_starting_probe_to_a_shipyard_that_sells_probes, visit_all_markets,
} }
export async function run(): Promise<void> { export async function run(): Promise<void> {
@ -31,15 +30,17 @@ export async function run(): Promise<void> {
const ships = getShips(); const ships = getShips();
switch(state) { switch(state) {
case states.start_running_contracts_with_the_command_ship: case states.start_running_contracts_with_the_command_ship:
// TODO await autoContracting.run(ships[0]); autoContracting.run(ships[0]);
state++; state++;
continue; continue;
case states.visit_all_shipyards: case states.visit_all_shipyards:
await visit_all_shipyards(ships[1]); await visit_all_shipyards(ships[1]);
state++; state++;
continue; continue;
case states.send_the_starting_probe_to_a_shipyard_that_sells_probes: case states.visit_all_markets:
await send_the_starting_probe_to_a_shipyard_that_sells_probes(ships[1]); await visit_all_markets();
state++;
continue;
state++; state++;
continue; continue;
default: default:
@ -53,31 +54,47 @@ export async function run(): Promise<void> {
} }
} }
async function send_the_starting_probe_to_a_shipyard_that_sells_probes(probe: Ship) { async function visit_all_markets(): Promise<void> {
const probeWaypoint = await waypoint(probe.nav.waypointSymbol); if (await are_we_done_visiting_all_markets()) return;
const myShipyard = await shipyard(probeWaypoint); // send all our probes except the starting one to map the system's markets
if (myShipyard.shipTypes.some(t => t.type === 'SHIP_PROBE')) return; for (const probe of getShips().slice(2)) {
// our starting probe is not at a shipyard that sells probes, let's move if (probe.registration.role !== 'SATELLITE') continue;
const shipyardWaypoints = await trait(probe.nav.systemSymbol, 'SHIPYARD'); visit_next_markets(probe);
let candidates: Array<{price: number, waypoint: Waypoint}> = []; await sleep(10000); // we do not send them all at once so they can chose different destinations
for (const w of shipyardWaypoints) { }
const shipyardData = await shipyard(w); // buy more probes to speed up the process
const probeData = shipyardData.ships.filter(t => t.type === 'SHIP_PROBE'); while (true) {
if (probeData.length === 0) continue; if (await are_we_done_visiting_all_markets()) return;
candidates.push({price: probeData[0].purchasePrice, waypoint: w }); while (getAgent().credits < 250000) {
}; await sleep(60000);
candidates.sort(function(a, b) {
if (a.price < b.price) {
return -1;
} else if (a.price > b.price) {
return 1;
} }
return 0; const probe = await purchaseShip('SHIP_PROBE');
}); visit_next_markets(probe);
await probe.navigate(candidates[0].waypoint); await sleep(10000);
}
} }
async function visit_all_shipyards(probe: Ship) { async function visit_next_markets(probe: Ship): Promise<void> {
while (true) {
const probeWaypoint = await waypoint(probe.nav.waypointSymbol);
const marketplaceWaypoints = await trait(probe.nav.systemSymbol, 'MARKETPLACE');
let candidates: Array<Waypoint> = [];
for (const w of marketplaceWaypoints) {
const marketplaceData = await market(w);
if (marketplaceData.tradeGoods) continue;
if (is_there_a_ship_at_this_waypoint(w)) continue;
candidates.push(w);
}
if (candidates.length === 0) {
return;
}
const next = sortByDistanceFrom(probeWaypoint, candidates)[0].data;
await probe.navigate(next);
await market(next);
}
}
async function visit_all_shipyards(probe: Ship): Promise<void> {
const probeWaypoint = await waypoint(probe.nav.waypointSymbol); const probeWaypoint = await waypoint(probe.nav.waypointSymbol);
const shipyardWaypoints = await trait(probe.nav.systemSymbol, 'SHIPYARD'); const shipyardWaypoints = await trait(probe.nav.systemSymbol, 'SHIPYARD');
let candidates: Array<Waypoint> = []; let candidates: Array<Waypoint> = [];

View file

@ -3,7 +3,7 @@ import {
} from './api.ts'; } from './api.ts';
import { PriorityQueue } from './priority_queue.ts'; import { PriorityQueue } from './priority_queue.ts';
import { getShips } from './ships.ts'; import { getShips } from './ships.ts';
import { market } from './systems.ts'; import { market, trait } from './systems.ts';
import { import {
Cargo, Cargo,
CargoManifest, CargoManifest,
@ -25,6 +25,19 @@ type Price = {
price: number; price: number;
}; };
export async function are_we_done_visiting_all_markets(): Promise<boolean> {
const marketplaceWaypoints = await trait(getShips()[0].nav.systemSymbol, 'MARKETPLACE');
let done = true;
for (const w of marketplaceWaypoints) {
const marketplaceData = await market(w);
if (marketplaceData.tradeGoods !== undefined) continue;
if (is_there_a_ship_at_this_waypoint(w)) continue;
done = false;
break;
}
return done;
}
// cargo is a ship.cargo object, want is an optional symbol // cargo is a ship.cargo object, want is an optional symbol
export function categorizeCargo(cargo: Cargo, want?: string): CategorizedCargo { export function categorizeCargo(cargo: Cargo, want?: string): CategorizedCargo {
const wanted = cargo.inventory.filter(i => i.symbol === want || i.symbol === 'ANTIMATTER'); const wanted = cargo.inventory.filter(i => i.symbol === want || i.symbol === 'ANTIMATTER');