from nullptr.missions.base import BaseMission, MissionParam from nullptr.models.waypoint import Waypoint class HaulMission(BaseMission): def start_state(self): return 'travel-to' def step_turn(self): self.ship.log('starting haul load') def wait_turn(self): for s in self.store.all('Ship'): if s.mission != 'haul': continue if s.location != self.ship.location: continue if s.mission_state['dest'] != self.st('dest'): continue if s.mission_status != 'load': continue return False return True def wait_cargo(self): dmkt = self.store.get('Marketplace', self.st('dest')) sellables = dmkt.prices.keys() for s in self.store.all("Ship"): if s.location != self.ship.location: continue if s.mission not in ['mine','siphon']: continue for r, a in s.cargo.items(): if r not in sellables: continue return True return False def step_load(self): cargo_space = self.ship.cargo_capacity - self.ship.cargo_units dmkt = self.store.get('Marketplace', self.st('dest')) sellables = dmkt.prices.keys() for s in self.store.all("Ship"): if s.location != self.ship.location: continue if s.mission not in ['mine','siphon']: continue for r, a in s.cargo.items(): if r not in sellables: continue amount = min(cargo_space, a) res = self.api.transfer(s, self.ship, r, amount) return 'done' if amount == cargo_space else 'more' return 'more' @classmethod def params(cls): return { 'site': MissionParam(Waypoint, True), 'dest': MissionParam(Waypoint, True), } def steps(self): return { **self.travel_steps('to', 'site', 'wait-turn'), 'wait-turn': (self.step_turn, 'load', self.wait_turn), 'load': (self.step_load, { 'more': 'load', 'done': 'travel-back' }, self.wait_cargo), **self.travel_steps('back', 'dest', 'dock-dest'), 'dock-dest': (self.step_dock, 'unload'), 'unload': (self.step_sell, { 'more': 'unload', 'done': 'market-dest' }), 'market-dest': (self.step_market, 'report'), 'report': (self.step_done, 'done') }