from nullptr.missions.base import BaseMission, MissionParam from nullptr.models.waypoint import Waypoint class SiphonMission(BaseMission): def start_state(self): return 'travel-to' @classmethod def params(cls): return { 'site': MissionParam(Waypoint, True), } def step_siphon(self): result = self.api.siphon(self.ship) self.next_step = self.ship.cooldown if self.ship.cargo_space() > 5: return 'more' else: return 'full' def find_hauler(self, r): for s in self.store.all('Ship'): if s.mission != 'haul': continue if s.location != self.ship.location: continue if s.mission_status != 'load': continue if r not in s.mission_state['resources']: continue return s return None def step_unload(self): if len(self.ship.cargo) == 0: return 'done' r = list(self.ship.cargo.keys())[0] amt = self.ship.cargo[r] h = self.find_hauler(r) if h is None: self.api.jettison(self.ship, r) else: space = h.cargo_space() amt = min(space, amt) if amt > 0: self.api.transfer(self.ship, h, r, amt) return 'more' def steps(self): return { **self.travel_steps('to', 'site', 'siphon'), 'siphon': (self.step_siphon, { 'more': 'siphon', 'full': 'unload' }), 'unload': (self.step_unload, { 'more': 'unload', 'done': 'done' }) }