0ptr/nullptr/missions/haul.py

74 lines
2.2 KiB
Python
Raw Normal View History

2024-01-20 19:33:50 +00:00
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')
}