Beispiel #1
0
 def test_cost(self):
   s = ship.Ship("6A", 521.8, 32)
   self.assertAlmostEqual(s.cost(39.63), 8, 2)
   s.supercharge('N')
   self.assertAlmostEqual(s.cost(39.63), 0.22, 2)
   s.range_boost = 10.5
   self.assertAlmostEqual(s.cost(39.63), 0.12, 2)
Beispiel #2
0
 def test_range(self):
   s = ship.Ship("6A", 521.8, 32)
   self.assertAlmostEqual(s.range(), 39.63, 2)
   s.range_boost = 10.5
   self.assertAlmostEqual(s.range(), 50.13, 2)
   s.supercharge('N')
   self.assertAlmostEqual(s.range(), 200.53, 2)
Beispiel #3
0
  def do_set_ship(self, args):
    ap = argparse.ArgumentParser(fromfile_prefix_chars="@", prog = "set_ship")
    ap.add_argument("-f", "--fsd", type=str, required=True, help="The ship's frame shift drive in the form 'A6 or '6A'")
    ap.add_argument("-m", "--mass", type=float, required=True, help="The ship's unladen mass excluding fuel")
    ap.add_argument("-t", "--tank", type=float, required=True, help="The ship's fuel tank size")
    ap.add_argument("-B", "--range-boost", type=float, default=0, help="The bonus from the ship's Guardian FSD booster")
    ap.add_argument("-T", "--reserve-tank", type=float, default=0, help="The ship's reserve tank size")
    ap.add_argument("-c", "--cargo", type=int, default=0, help="The ship's cargo capacity")
    ap.add_argument(      "--fsd-optmass", type=str, help="The optimal mass of your FSD, either as a number in T or modified percentage value (including %% sign)")
    ap.add_argument(      "--fsd-mass", type=str, help="The mass of your FSD, either as a number in T or modified percentage value (including %% sign)")
    ap.add_argument(      "--fsd-maxfuel", type=str, help="The max fuel per jump of your FSD, either as a number in T or modified percentage value (including %% sign)")
    try:
      argobj = ap.parse_args(shlex.split(args))
    except SystemExit:
      return True
    s = ship.Ship(argobj.fsd, argobj.mass, argobj.tank, max_cargo = argobj.cargo, reserve_tank = argobj.reserve_tank, range_boost = argobj.range_boost)
    if argobj.fsd_optmass is not None or argobj.fsd_mass is not None or argobj.fsd_maxfuel is not None:
      fsd_optmass = util.parse_number_or_add_percentage(argobj.fsd_optmass, s.fsd.stock_optmass)
      fsd_mass = util.parse_number_or_add_percentage(argobj.fsd_mass, s.fsd.stock_mass)
      fsd_maxfuel = util.parse_number_or_add_percentage(argobj.fsd_maxfuel, s.fsd.stock_maxfuel)
      s = s.get_modified(optmass=fsd_optmass, fsdmass=fsd_mass, maxfuel=fsd_maxfuel)
    self.state['ship'] = s

    print("")
    print(str(s))
    print("")

    return True
Beispiel #4
0
 def test_reserve_tank(self):
   s = ship.Ship("6A", 521.8, 32, reserve_tank = 2.0)
   self.assertEqual(s.unladen_mass, 523.8)
   self.assertAlmostEqual(s.range(), 39.49, 2)
   self.assertAlmostEqual(s.cost(39.49), 8, 2)
   s.range_boost = 10.5
   self.assertAlmostEqual(s.range(), 49.99, 2)
   self.assertAlmostEqual(s.cost(41.42), 4.91, 2)
   s.supercharge('N')
   self.assertAlmostEqual(s.range(), 199.95, 2)
   self.assertAlmostEqual(s.cost(100.0), 1.32, 2)
Beispiel #5
0
def parse_args(arg, hosted, state):
    ap_parents = [env.arg_parser] if not hosted else []
    ap = argparse.ArgumentParser(description="Elite: Dangerous TSP Solver",
                                 fromfile_prefix_chars="@",
                                 parents=ap_parents,
                                 prog=edts.app_name)
    ap.add_argument("--ship",
                    metavar="filename",
                    type=str,
                    required=False,
                    help="Load ship data from export file")
    ap.add_argument(
        "-f",
        "--fsd",
        type=str,
        required=False,
        help="The ship's frame shift drive in the form 'A6 or '6A'")
    ap.add_argument(
        "-b",
        "--boost",
        type=str.upper,
        choices=['0', '1', '2', '3', 'D', 'N'],
        help="FSD boost level (0 for none, D for white dwarf, N for neutron)")
    ap.add_argument("-B",
                    "--range-boost",
                    type=float,
                    help="The bonus from the ship's Guardian FSD booster")
    ap.add_argument("-m",
                    "--mass",
                    type=float,
                    required=False,
                    help="The ship's unladen mass excluding fuel")
    ap.add_argument("-t",
                    "--tank",
                    type=float,
                    required=False,
                    help="The ship's fuel tank size")
    ap.add_argument("-T",
                    "--reserve-tank",
                    type=float,
                    required=False,
                    help="The ship's reserve tank size")
    ap.add_argument("--starting-fuel",
                    type=float,
                    required=False,
                    help="The starting fuel quantity (default: tank size)")
    ap.add_argument("-c",
                    "--cargo",
                    type=int,
                    default=edts.default_cargo,
                    help="Cargo to collect at each station")
    ap.add_argument("-C",
                    "--initial-cargo",
                    type=int,
                    default=edts.default_initial_cargo,
                    help="Cargo already carried at the start of the journey")
    ap.add_argument(
        "--fsd-optmass",
        type=str,
        help=
        "The optimal mass of your FSD, either as a number in T or modified percentage value (including %% sign)"
    )
    ap.add_argument(
        "--fsd-mass",
        type=str,
        help=
        "The mass of your FSD, either as a number in T or modified percentage value (including %% sign)"
    )
    ap.add_argument(
        "--fsd-maxfuel",
        type=str,
        help=
        "The max fuel per jump of your FSD, either as a number in T or modified percentage value (including %% sign)"
    )
    ap.add_argument(
        "-j",
        "--jump-range",
        type=float,
        required=False,
        help="The ship's max jump range with full fuel and empty cargo")
    ap.add_argument("-w",
                    "--witchspace-time",
                    type=int,
                    default=edts.default_ws_time,
                    help="Time in seconds spent in hyperspace jump")
    ap.add_argument(
        "-s",
        "--start",
        type=str,
        required=False,
        help="The starting station, in the form 'system/station' or 'system'")
    ap.add_argument(
        "-e",
        "--end",
        type=str,
        required=False,
        help="The end station, in the form 'system/station' or 'system'")
    ap.add_argument(
        "-n",
        "--num-jumps",
        default=None,
        type=int,
        help="The number of stations to visit, not including the start/end")
    ap.add_argument("-p",
                    "--pad-size",
                    default=edts.default_pad_size,
                    type=str.upper,
                    choices=['S', 'M', 'L'],
                    help="The landing pad size of the ship (S/M/L)")
    ap.add_argument(
        "-d",
        "--jump-decay",
        type=float,
        default=edts.default_jump_decay,
        help=
        "An estimate of the range decay per jump in LY (e.g. due to taking on cargo)"
    )
    ap.add_argument(
        "-r",
        "--route",
        default=False,
        action='store_true',
        help="Whether to try to produce a full route rather than just legs")
    ap.add_argument("--route-filters",
                    required=False,
                    metavar='filter',
                    nargs='*',
                    help="Only travel via systems that match the filters")
    ap.add_argument("-o",
                    "--ordered",
                    default=False,
                    action='store_true',
                    help="Whether the stations are already in a set order")
    ap.add_argument("-O",
                    "--tour",
                    metavar="system[/station]",
                    action='append',
                    type=str,
                    nargs='*',
                    help="Following stations must be visited in order")
    ap.add_argument("-R",
                    "--route-set",
                    metavar="system[/station]",
                    nargs='+',
                    action=ApplicationAction,
                    help="Choose a subset of the following stations")
    ap.add_argument(
        "--route-set-min",
        type=int,
        default=1,
        action=ApplicationAction,
        help="Minimum number of stations to visit in the --route-set.")
    ap.add_argument(
        "--route-set-max",
        type=int,
        default=1,
        action=ApplicationAction,
        help="Maximum number of stations to visit in the --route-set.")
    ap.add_argument(
        "-l",
        "--long-jumps",
        default=False,
        action='store_true',
        help="Whether to allow for jumps only possible at low fuel when routing"
    )
    ap.add_argument(
        "-a",
        "--accurate",
        dest='route_strategy',
        action='store_const',
        const='trunkle',
        default=edts.default_route_strategy,
        help=
        "Use a more accurate but slower routing method (equivalent to --route-strategy=trunkle)"
    )
    ap.add_argument("-x",
                    "--avoid",
                    metavar='system',
                    action='append',
                    type=str,
                    nargs='?',
                    help="Reject routes that pass through named system(s)")
    ap.add_argument("--format",
                    default='long',
                    type=str.lower,
                    choices=['long', 'summary', 'short', 'csv'],
                    help="The format to display the output in")
    ap.add_argument("--reverse",
                    default=False,
                    action='store_true',
                    help="Whether to reverse the generated route")
    ap.add_argument(
        "--diff-limit",
        type=float,
        default=edts.default_diff_limit,
        help=
        "The multiplier of the fastest route which a route must be over to be discounted"
    )
    ap.add_argument(
        "--slf",
        type=float,
        default=edts.default_slf,
        help=
        "The multiplier to apply to multi-jump legs to account for imperfect system positions"
    )
    ap.add_argument("--route-strategy",
                    default=edts.default_route_strategy,
                    choices=rx.route_strategies,
                    help="The strategy to use for route plotting")
    ap.add_argument("--fuel-strategy",
                    default=edts.default_fuel_strategy,
                    choices=rx.fuel_strategies,
                    help="The strategy to use for refueling")
    ap.add_argument(
        "--rbuffer",
        type=float,
        default=edts.default_rbuffer,
        help=
        "A minimum buffer distance, in LY, used to search for valid stars for routing"
    )
    ap.add_argument(
        "--hbuffer",
        type=float,
        default=edts.default_hbuffer,
        help=
        "A minimum buffer distance, in LY, used to search for valid next legs. Not used by the 'astar' strategy."
    )
    ap.add_argument("--solve-mode",
                    type=str,
                    default=edts.default_solve_mode,
                    choices=solver.modes,
                    help="The mode used by the travelling salesman solver")
    ap.add_argument("--tolerance",
                    type=float,
                    default=edts.default_tolerance,
                    help="Tolerance checking for obscured jumps")
    ap.add_argument(
        "stations",
        metavar="system[/station]",
        nargs="*",
        help="A station to travel via, in the form 'system/station' or 'system'"
    )

    parsed = ap.parse_args(arg)

    if parsed.fsd is not None and parsed.mass is not None and parsed.tank is not None:
        # If user has provided full ship data in this invocation, use it
        # TODO: support cargo capacity?
        parsed.ship = ship.Ship.from_args(fsd=parsed.fsd,
                                          mass=parsed.mass,
                                          tank=parsed.tank,
                                          reserve_tank=parsed.reserve_tank,
                                          range_boost=parsed.range_boost,
                                          fsd_optmass=parsed.fsd_optmass,
                                          fsd_mass=parsed.fsd_mass,
                                          fsd_maxfuel=parsed.fsd_maxfuel)
    elif parsed.ship:
        loaded = ship.Ship.from_file(parsed.ship)
        fsd = parsed.fsd if parsed.fsd is not None else loaded.fsd
        mass = parsed.mass if parsed.mass is not None else loaded.mass
        tank = parsed.tank if parsed.tank is not None else loaded.tank_size
        reserve_tank = parsed.reserve_tank if parsed.reserve_tank is not None else loaded.reserve_tank
        range_boost = parsed.range_boost if parsed.range_boost is not None else loaded.range_boost
        parsed.ship = ship.Ship(fsd,
                                mass,
                                tank,
                                reserve_tank=reserve_tank,
                                range_boost=range_boost)
    elif 'ship' in state:
        # If we have a cached ship, use that (with any overrides provided as part of this invocation)
        fsd = parsed.fsd if parsed.fsd is not None else state['ship'].fsd
        mass = parsed.mass if parsed.mass is not None else state['ship'].mass
        tank = parsed.tank if parsed.tank is not None else state[
            'ship'].tank_size
        reserve_tank = parsed.reserve_tank if parsed.reserve_tank is not None else state[
            'ship'].reserve_tank
        range_boost = parsed.range_boost if parsed.range_boost is not None else state[
            'ship'].range_boost
        parsed.ship = ship.Ship(fsd,
                                mass,
                                tank,
                                reserve_tank=reserve_tank,
                                range_boost=range_boost)
    else:
        parsed.ship = None

    return parsed
Beispiel #6
0
def parse_args(arg, hosted, state):
    ap_parents = [env.arg_parser] if not hosted else []
    ap = argparse.ArgumentParser(
        description="Recalculate next hop if jump is obscured",
        fromfile_prefix_chars="@",
        parents=ap_parents,
        prog=obscured.app_name)
    ap.add_argument("-d",
                    "--min-deviation",
                    type=int,
                    required=False,
                    default=obscured.default_min_deviation,
                    help="Minimum required deviation in angle")
    ap.add_argument("-e",
                    "--end",
                    type=str,
                    required=False,
                    help="The ultimate destination system")
    ap.add_argument(
        "-j",
        "--jump-range",
        type=float,
        required=False,
        help="The ship's max jump range with full fuel and empty cargo")
    ap.add_argument("-n",
                    "--num",
                    type=int,
                    required=False,
                    default=obscured.default_num,
                    help="Show the specified number of candidate systems")
    ap.add_argument("-s",
                    "--start",
                    type=str,
                    required=True,
                    help="The starting system")
    ap.add_argument("--sort",
                    type=str.upper,
                    choices=[
                        obscured.DEVIATION, obscured.DISTANCE_FROM,
                        obscured.DISTANCE_TO
                    ],
                    default=obscured.default_sort,
                    help='Sort results by distance or deviation')
    ap.add_argument("--ship",
                    metavar="filename",
                    type=str,
                    required=False,
                    help="Load ship data from export file")
    ap.add_argument(
        "-f",
        "--fsd",
        type=str,
        required=False,
        help="The ship's frame shift drive in the form 'A6 or '6A'")
    ap.add_argument("-m",
                    "--mass",
                    type=float,
                    required=False,
                    help="The ship's unladen mass excluding fuel")
    ap.add_argument("-t",
                    "--tank",
                    type=float,
                    required=False,
                    help="The ship's fuel tank size")
    ap.add_argument("-T",
                    "--reserve-tank",
                    type=float,
                    required=False,
                    help="The ship's reserve tank size")
    ap.add_argument(
        "--fsd-optmass",
        type=str,
        help=
        "The optimal mass of your FSD, either as a number in T or modified percentage value (including % sign)"
    )
    ap.add_argument(
        "--fsd-mass",
        type=str,
        help=
        "The mass of your FSD, either as a number in T or modified percentage value (including % sign)"
    )
    ap.add_argument(
        "--fsd-maxfuel",
        type=str,
        help=
        "The max fuel per jump of your FSD, either as a number in T or modified percentage value (including % sign)"
    )
    ap.add_argument("obscured", type=str, help="The obscured system")

    parsed = ap.parse_args(arg)

    if parsed.fsd is not None and parsed.mass is not None and parsed.tank is not None:
        parsed.ship = ship.Ship.from_args(fsd=parsed.fsd,
                                          mass=parsed.mass,
                                          tank=parsed.tank,
                                          reserve_tank=parsed.reserve_tank,
                                          fsd_optmass=parsed.fsd_optmass,
                                          fsd_mass=parsed.fsd_mass,
                                          fsd_maxfuel=parsed.fsd_maxfuel)
    elif parsed.ship:
        loaded = ship.Ship.from_file(parsed.ship)
        fsd = parsed.fsd if parsed.fsd is not None else loaded.fsd
        mass = parsed.mass if parsed.mass is not None else loaded.mass
        tank = parsed.tank if parsed.tank is not None else loaded.tank_size
        reserve_tank = parsed.reserve_tank if parsed.reserve_tank is not None else loaded.reserve_tank
        parsed.ship = ship.Ship(fsd, mass, tank, reserve_tank=reserve_tank)
    elif 'ship' in state:
        fsd = parsed.fsd if parsed.fsd is not None else state['ship'].fsd
        mass = parsed.mass if parsed.mass is not None else state['ship'].mass
        tank = parsed.tank if parsed.tank is not None else state[
            'ship'].tank_size
        reserve_tank = parsed.reserve_tank if parsed.reserve_tank is not None else state[
            'ship'].reserve_tank
        parsed.ship = ship.Ship(fsd, mass, tank, reserve_tank=reserve_tank)
    else:
        parsed.ship = None

    if parsed.fsd_optmass is not None or parsed.fsd_mass is not None or parsed.fsd_maxfuel is not None:
        fsd_optmass = util.parse_number_or_add_percentage(
            parsed.fsd_optmass, parsed.ship.fsd.stock_optmass)
        fsd_mass = util.parse_number_or_add_percentage(
            parsed.fsd_mass, parsed.ship.fsd.stock_mass)
        fsd_maxfuel = util.parse_number_or_add_percentage(
            parsed.fsd_maxfuel, parsed.ship.fsd.stock_maxfuel)
        parsed.ship = parsed.ship.get_modified(optmass=fsd_optmass,
                                               fsdmass=fsd_mass,
                                               maxfuel=fsd_maxfuel)

    return parsed
Beispiel #7
0
def parse_args(arg, hosted, state):
    ap_parents = [env.arg_parser] if not hosted else []
    ap = argparse.ArgumentParser(description="Plot jump distance matrix",
                                 fromfile_prefix_chars="@",
                                 parents=ap_parents,
                                 prog=fuel_usage.app_name)
    ap.add_argument("--ship",
                    metavar="filename",
                    type=str,
                    required=False,
                    help="Load ship data from export file")
    ap.add_argument(
        "-f",
        "--fsd",
        type=str,
        required=False,
        help="The ship's frame shift drive in the form 'A6 or '6A'")
    ap.add_argument(
        "-b",
        "--boost",
        type=str.upper,
        choices=['0', '1', '2', '3', 'D', 'N'],
        help="FSD boost level (0 for none, D for white dwarf, N for neutron)")
    ap.add_argument("-B",
                    "--range-boost",
                    type=float,
                    help="The bonus from the ship's Guardian FSD booster")
    ap.add_argument("-m",
                    "--mass",
                    type=float,
                    required=False,
                    help="The ship's unladen mass excluding fuel")
    ap.add_argument("-t",
                    "--tank",
                    type=float,
                    required=False,
                    help="The ship's fuel tank size")
    ap.add_argument("-T",
                    "--reserve-tank",
                    type=float,
                    required=False,
                    help="The ship's reserve tank size")
    ap.add_argument("-s",
                    "--starting-fuel",
                    type=float,
                    required=False,
                    help="The starting fuel quantity (default: tank size)")
    ap.add_argument("-c",
                    "--cargo",
                    type=int,
                    default=fuel_usage.default_cargo,
                    help="Cargo on board the ship")
    ap.add_argument(
        "--fsd-optmass",
        type=str,
        help=
        "The optimal mass of your FSD, either as a number in T or modified percentage value (including %% sign)"
    )
    ap.add_argument(
        "--fsd-mass",
        type=str,
        help=
        "The mass of your FSD, either as a number in T or modified percentage value (including %% sign)"
    )
    ap.add_argument(
        "--fsd-maxfuel",
        type=str,
        help=
        "The max fuel per jump of your FSD, either as a number in T or modified percentage value (including %% sign)"
    )
    ap.add_argument(
        "-r",
        "--refuel",
        action='store_true',
        default=False,
        help=
        "Assume that the ship can be refueled as needed, e.g. by fuel scooping"
    )
    ap.add_argument("systems", metavar="system", nargs='+', help="Systems")

    parsed = ap.parse_args(arg)

    if parsed.fsd is not None and parsed.mass is not None and parsed.tank is not None:
        parsed.ship = ship.Ship.from_args(fsd=parsed.fsd,
                                          mass=parsed.mass,
                                          tank=parsed.tank,
                                          reserve_tank=parsed.reserve_tank,
                                          range_boost=parsed.range_boost,
                                          fsd_optmass=parsed.fsd_optmass,
                                          fsd_mass=parsed.fsd_mass,
                                          fsd_maxfuel=parsed.fsd_maxfuel)
    elif parsed.ship:
        loaded = ship.Ship.from_file(parsed.ship)
        fsd = parsed.fsd if parsed.fsd is not None else loaded.fsd
        mass = parsed.mass if parsed.mass is not None else loaded.mass
        tank = parsed.tank if parsed.tank is not None else loaded.tank_size
        reserve_tank = parsed.reserve_tank if parsed.reserve_tank is not None else loaded.reserve_tank
        range_boost = parsed.range_boost if parsed.range_boost is not None else loaded.range_boost
        parsed.ship = ship.Ship(fsd,
                                mass,
                                tank,
                                reserve_tank=reserve_tank,
                                range_boost=range_boost)
    elif 'ship' in state:
        fsd = parsed.fsd if parsed.fsd is not None else state['ship'].fsd
        mass = parsed.mass if parsed.mass is not None else state['ship'].mass
        tank = parsed.tank if parsed.tank is not None else state[
            'ship'].tank_size
        reserve_tank = parsed.reserve_tank if parsed.reserve_tank is not None else state[
            'ship'].reserve_tank
        range_boost = parsed.range_boost if parsed.range_boost is not None else state[
            'ship'].range_boost
        parsed.ship = ship.Ship(fsd,
                                mass,
                                tank,
                                reserve_tank=reserve_tank,
                                range_boost=range_boost)
    else:
        parsed.ship = None

    if parsed.fsd_optmass is not None or parsed.fsd_mass is not None or parsed.fsd_maxfuel is not None:
        fsd_optmass = util.parse_number_or_add_percentage(
            parsed.fsd_optmass, parsed.ship.fsd.stock_optmass)
        fsd_mass = util.parse_number_or_add_percentage(
            parsed.fsd_mass, parsed.ship.fsd.stock_mass)
        fsd_maxfuel = util.parse_number_or_add_percentage(
            parsed.fsd_maxfuel, parsed.ship.fsd.stock_maxfuel)
        parsed.ship = parsed.ship.get_modified(optmass=fsd_optmass,
                                               fsdmass=fsd_mass,
                                               maxfuel=fsd_maxfuel)

    return parsed