diff --git a/main.py b/main.py index 5990b98..cb1321c 100644 --- a/main.py +++ b/main.py @@ -11,12 +11,13 @@ def main(args): a = StoreAnalyzer(verbose=True) a.run(args.analyze) else: - c = Commander(args.data_dir) + c = Commander(args.data_dir, auto=args.auto) c.run() if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('-d', '--data-dir', default='data') - parser.add_argument('-a', '--analyze', type=argparse.FileType('rb')) + parser.add_argument('--analyze', type=argparse.FileType('rb')) + parser.add_argument('-a', '--auto', action='store_true') args = parser.parse_args() main(args) diff --git a/nullptr/commander.py b/nullptr/commander.py index 88066b2..ba3bfd0 100644 --- a/nullptr/commander.py +++ b/nullptr/commander.py @@ -19,7 +19,7 @@ class CommandError(AppError): pass class Commander(CommandLine): - def __init__(self, data_dir='data'): + def __init__(self, data_dir='data', auto=False): store_file = os.path.join(data_dir, 'store.npt') hist_file = os.path.join(data_dir, 'cmd.hst') self.cred_file = os.path.join(data_dir, 'creds.txt') @@ -41,6 +41,8 @@ class Commander(CommandLine): self.ship = None self.stop_auto = False + if auto: + self.do_auto() super().__init__() ######## INFRA ######### @@ -406,6 +408,9 @@ class Commander(CommandLine): crew = self.resolve('Crew', arg) ship.crew = crew pprint(ship) + + def do_phase(self, phase): + self.agent.phase = phase ######## Crews ######### def do_create_crews(self): diff --git a/nullptr/general.py b/nullptr/general.py index 4ad4f39..940bf56 100644 --- a/nullptr/general.py +++ b/nullptr/general.py @@ -24,11 +24,29 @@ class General: self.create_default_crews() def find_shipyard(self, stype): + occ = [s.location.symbol for s in self.store.all('Ship') if s.status != 'IN_TRANSIT'] + best_price = -1 + best_yard = None for shipyard in self.store.all('Shipyard'): - if stype in shipyard.types: - return stype - return None + if stype in shipyard.prices: + price = shipyard.prices[stype] + if shipyard.symbol in occ: + if best_yard is None or price < best_price: + best_yard = shipyard + best_price = price + return best_yard, best_price + def maybe_purchase(self, stype, role): + sy, price = self.find_shipyard(stype) + if sy is None: + return False + traders = [s for s in self.store.all('Ship') if s.role == 'trader'] + safe_buffer = len(traders) * 100000 + 100000 + + if self.agent.credits < safe_buffer + price: + return # cant afford it! + ship = self.c.api.purchase(stype, sy) + ship.role = role def tick(self): phase = self.agent.phase @@ -50,12 +68,25 @@ class General: command.role = 'probe' if probe.role is None: probe.role = 'sitter' - + system = command.location.system + markets = list(self.store.all_members(system, 'Marketplace')) + discovered = len([m for m in markets if m.last_prices > 0]) + if discovered > len(markets) // 2: + return 'probes' def phase_probes(self): + ag = self.agent.symbol + command = self.store.get('Ship', f'{ag}-1') # * probes on all markets - pass - + if command.role != 'trader': + command.role = 'trader' + self.c.captain.init_mission(command, 'none') + self.maybe_purchase('SHIP_PROBE', 'sitter') + sitters = [s for s in self.store.all('Ship') if s.role == 'sitter'] + markets = [m for m in self.store.all('Marketplace')] + if len(sitters) >= len(markets): + return 'trade' + def phase_trade(self): # 20? traders pass diff --git a/nullptr/models/agent.py b/nullptr/models/agent.py index af2d1f8..b43291d 100644 --- a/nullptr/models/agent.py +++ b/nullptr/models/agent.py @@ -20,5 +20,6 @@ class Agent(Base): def f(self, detail=1): r = super().f(detail) if detail >2: - r += f' c:{self.credits}' + r += f' c:{self.credits}\n' + r+= f'phase: {self.phase}' return r diff --git a/nullptr/roles/probe.py b/nullptr/roles/probe.py index 31daa78..4027450 100644 --- a/nullptr/roles/probe.py +++ b/nullptr/roles/probe.py @@ -6,7 +6,7 @@ def assign_probe(c, s): m = [m.waypoint for m in c.store.all_members(system, 'Marketplace')] m = solve_tsp(c, m) hops = [w.symbol for w in m] - start_hop = randrange(0, len(hops)) + start_hop = 0 s.log(f'Assigning {s} to probe {len(hops)} starting at {hops[start_hop]}') c.captain.init_mission(s, 'probe') diff --git a/nullptr/roles/sitter.py b/nullptr/roles/sitter.py index aa37b4b..3468ea6 100644 --- a/nullptr/roles/sitter.py +++ b/nullptr/roles/sitter.py @@ -13,8 +13,6 @@ def assign_sitter(c, s): shipyards = c.store.all_members(system, 'Shipyard') occupied = [s.mission_state['dest'] for s in ships if s.mission=='sit'] probe_shipyard = [y for y in shipyards if 'SHIP_PROBE' in y.types][0] - print('oc', occupied) - print('proya', probe_shipyard) if probe_shipyard.symbol not in occupied: return assign_sitter_at(c, s, probe_shipyard)