from time import sleep from enum import Enum from maneuvers.rendezvous import RendezvousManeuver from maneuvers.approach_rcs import ApproachRCSManeuver from maneuvers.docking import DockingManeuver from maneuvers.comsat import ComsatManeuver from lib import get_contract, get_rescuee_vessel, get_body, get_connexion class MissionType(Enum): transport = 1 orbit_rescue = 2 comsat = 3 class MissionStatus(Enum): Backlog = 1 Assigned = 2 InProgress = 3 Done = 4 class MissionReport: mission_status = None new_vessel_id = None new_missions = [] def __int__(self): pass class Mission: pass class TransportMission(Mission): type = MissionType.transport def __init__(self, kerbal_name, destination): self.kerbal_name = kerbal_name self.destination = destination class RescueMission(Mission): type = MissionType.orbit_rescue def __init__(self, contract_title): self.contract_title = contract_title self.contract = get_contract(contract_title) rescuee_first_name = contract_title.split()[1] self.rescuee_vessel = get_rescuee_vessel(rescuee_first_name) self.rescuee_vessel_name = self.rescuee_vessel.name self.rescuee_name = self.rescuee_vessel.crew[0].name def execute(self, mission_control): conn = get_connexion() sc = conn.space_center if sc.active_vessel.name != mission_control.vessel.name: sc.active_vessel = mission_control.vessel if sc.target_vessel is None or sc.target_vessel.name != self.rescuee_vessel.name: sc.target_vessel = self.rescuee_vessel rendezvous_done = RendezvousManeuver(conn, mission_control).execute() if rendezvous_done: reference_frame = sc.ReferenceFrame.create_relative( self.rescuee_vessel.reference_frame, rotation=(1., 0., 0., 0.) ) sc.active_vessel = mission_control.deliver_probe sc.active_vessel.parts.controlling = mission_control.get_grappling() target_approach_done = ApproachRCSManeuver(conn, mission_control, reference_frame).start() if target_approach_done: mission_control.toggle_grappling(True) target_docking_done = DockingManeuver(conn, mission_control, mission_control.get_grappling(), reference_frame).start() if target_docking_done: sc.active_vessel.parts.controlling = mission_control.get_probe_port() reference_frame = mission_control.get_bay_port().reference_frame mothership_approach_done = ApproachRCSManeuver(conn, mission_control, reference_frame).start() if mothership_approach_done: mothership_docking_done = DockingManeuver(conn, mission_control, mission_control.get_probe_port(), reference_frame).start() if mothership_docking_done: kerbal = mission_control.get_kerbal(self.rescuee_name) sc.transfer_crew(kerbal, mission_control.get_part_with_free_seat()) mission_control.toggle_grappling(False) mission_control.recover_probe() # Destroy Capsule report = MissionReport() report.mission_status = MissionStatus.Done report.new_missions.append( TransportMission(self.rescuee_name, 'kerbin_orbit') ) return report class ComSatNetworkMission: type = MissionType.comsat def __init__(self, body_name): self.body = get_body(body_name) def execute(self, mission_control): conn = get_connexion() sc = conn.space_center if sc.active_vessel.name != mission_control.vessel.name: sc.active_vessel = mission_control.vessel mission_control.toggle_engines(True) comsat_done = ComsatManeuver(conn, mission_control, self.body).execute() if comsat_done: report = MissionReport() report.mission_status = MissionStatus.Done return report