62 lines
1.5 KiB
Python
62 lines
1.5 KiB
Python
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)
|
|
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'
|
|
})
|
|
}
|
|
|
|
|
|
|