Exemplo n.º 1
0
    def test_finding(self):
        m = dcs.mission.Mission()

        usa = m.country("USA")
        caucasus = m.terrain  # type: dcs.terrain.Caucasus
        batumi = caucasus.batumi()
        self.assertIsNotNone(usa)
        pos = batumi.random_unit_zone().center()
        vg = m.vehicle_group(usa, "Tanks", dcs.countries.USA.Vehicle.Armor.MBT_M1A2_Abrams, pos)
        self.assertIsInstance(vg, dcs.unitgroup.VehicleGroup)
        pg = m.flight_group_inflight(usa, "Airgroup 1", dcs.planes.A_10C, dcs.Point(pos.x + 200, pos.y + 200), 2000)
        self.assertIsInstance(pg, dcs.unitgroup.PlaneGroup)
        pg = m.flight_group_inflight(usa, "Airgroup 2", dcs.planes.M_2000C, dcs.Point(pos.x + 200, pos.y + 200), 2000)
        self.assertIsInstance(pg, dcs.unitgroup.PlaneGroup)
        found_g = m.find_group("Tanks", "exact")
        self.assertIsInstance(found_g, dcs.unitgroup.VehicleGroup)

        found_g = m.find_group("Tank", "exact")
        self.assertIsNone(found_g)

        found_g = m.find_group("Tank", "match")
        self.assertIsInstance(found_g, dcs.unitgroup.VehicleGroup)

        found_g = m.find_group("Airgroup")
        self.assertIsNone(found_g)

        found_g = m.find_group("Airgroup", "match")
        self.assertIsInstance(found_g, dcs.unitgroup.PlaneGroup)

        found_g = m.find_group("Airgroup 1")
        self.assertIsInstance(found_g, dcs.unitgroup.PlaneGroup)
        self.assertEqual(found_g.units[0].unit_type, dcs.planes.A_10C)
Exemplo n.º 2
0
    def test_remove_trees_and_objects_in_zone(self):
        m = dcs.mission.Mission(terrain=dcs.terrain.Caucasus())

        usa = m.country("USA")
        point = dcs.Point(-217283, 564863, m.terrain)  # This is a compound north of sukhmi, with buildings and trees
        m.vehicle_group(usa, "Vehicle", dcs.countries.USA.Vehicle.AirDefence.Vulcan, position=point)

        # Create trigger zone
        removal_zone = m.triggers.add_triggerzone(point, 1000, False, "removal zone")

        # Add destruction zone trigger
        t = dcs.triggers.TriggerOnce(comment='Remove Trees')
        t.actions.append(dcs.action.RemoveSceneObjects(dcs.action.RemoveSceneObjectsMask.ALL, removal_zone.id))
        m.triggerrules.triggers.append(t)

        m.save('missions/test_mission_remove_all.miz')

        # Test reload the mission
        m2 = dcs.mission.Mission()
        self.assertEqual(0, len(m2.load_file('missions/test_mission_remove_all.miz')))
        self.assertEqual(m2.terrain.__class__, dcs.terrain.Caucasus)
        self.assertTrue(type(m2.triggerrules.triggers[0].actions[0]) is dcs.action.RemoveSceneObjects)
        self.assertEqual(m2.triggerrules.triggers[0].actions[0].objects_mask, dcs.action.RemoveSceneObjectsMask.ALL)
        self.assertEqual(m2.triggerrules.triggers[0].actions[0].meters, 1000)
        self.assertEqual(m2.triggerrules.triggers[0].actions[0].zone, removal_zone.id)
Exemplo n.º 3
0
    def test_create_scenery_destruction_zone(self):
        m = dcs.mission.Mission(terrain=dcs.terrain.Caucasus())

        usa = m.country("USA")
        point = dcs.Point(-217283, 564863, m.terrain)  # This is a compound north of sukhmi, with buildings and trees
        m.vehicle_group(usa, "Vehicle", dcs.countries.USA.Vehicle.AirDefence.Vulcan, position=point)

        # Create trigger zone
        destruction_zone = m.triggers.add_triggerzone(point, 1000, False, "destruction zone")

        # Add destruction zone trigger
        t = dcs.triggers.TriggerOnce(comment='Destruction')
        t.actions.append(dcs.action.SceneryDestructionZone(95, destruction_zone.id))
        m.triggerrules.triggers.append(t)

        m.save('missions/test_mission_scenery_destruction.miz')

        # Test reload the mission
        m2 = dcs.mission.Mission()
        self.assertEqual(0, len(m2.load_file('missions/test_mission_scenery_destruction.miz')))
        self.assertEqual(m2.terrain.__class__, dcs.terrain.Caucasus)
        self.assertTrue(type(m2.triggerrules.triggers[0].actions[0]) is dcs.action.SceneryDestructionZone)
        self.assertEqual(m2.triggerrules.triggers[0].actions[0].destruction_level, 95)
        self.assertEqual(m2.triggerrules.triggers[0].actions[0].meters, 1000)
        self.assertEqual(m2.triggerrules.triggers[0].actions[0].zone, destruction_zone.id)
def create_mission() -> Mission:
    m = dcs.Mission(dcs.terrain.Caucasus())

    batumi = m.terrain.batumi()
    batumi.set_blue()

    usa = m.country("USA")
    awacs = m.awacs_flight(usa,
                           "AWACS",
                           dcs.planes.E_3A,
                           batumi,
                           dcs.Point(batumi.position.x + 20000,
                                     batumi.position.y + 80000),
                           race_distance=120 * 1000,
                           heading=90)

    escort = m.escort_flight(usa, "Escort", dcs.planes.F_A_18C, batumi, awacs)
    escort.load_pylon(dcs.planes.F_A_18C.Pylon2.Mk_82___500lb_GP_Bomb_LD, 2)

    return m
Exemplo n.º 5
0
import dcs
import sys
import os
import random
import argparse

zone_abkhazia = dcs.Polygon([
    dcs.Point(-187092.85714285, 460857.14285714),
    dcs.Point(-149378.57142856, 476285.71428571),
    dcs.Point(-147664.28571428, 520000),
    dcs.Point(-175378.57142856, 599714.28571429),
    dcs.Point(-174521.42857142, 644000),
    dcs.Point(-199664.28571428, 624000),
    dcs.Point(-233949.99999999, 632857.14285714),
    dcs.Point(-271092.85714285, 596000)
])


def main():
    aircrafts = [x for x in dcs.planes.plane_map.values() if x.flyable]
    helicopters = [
        x for x in dcs.helicopters.helicopter_map.values() if x.flyable
    ]
    aircraft_types = [x.id for x in aircrafts + helicopters]

    parser = argparse.ArgumentParser(
        description="DCS random search and destroy oil convoy")
    parser.add_argument("-a",
                        "--aircrafttype",
                        default=dcs.planes.A_10C.id,
                        choices=aircraft_types,
Exemplo n.º 6
0
def create_mission(campaign):
    m = dcs.Mission(terrain.Caucasus())
    # setup airports
    for name, airport in campaign.airports.items():
        coal_name = airport.coalition.value
        print(coal_name)
        assert (m.terrain.airports[name].set_coalition(coal_name))

    usa = m.country("USA")
    russia = m.country("Russia")
    sochi = m.terrain.sochi_adler()
    ship_pos = sochi.position - dcs.Point(50000, 50000)
    print(f"{sochi.position=}")
    print(f"{ship_pos=}")
    cvbg = m.ship_group(country=usa,
                        name="CVN 74 Stennis",
                        _type=ships.CVN_74_John_C__Stennis,
                        position=ship_pos)

    tasks = cvbg.points[0].tasks
    tasks.append(ActivateICLSCommand(unit_id=cvbg.id, channel=5))
    tasks.append(
        ActivateBeaconCommand(unit_id=cvbg.id,
                              channel=69,
                              callsign="STN",
                              aa=False))
    cvbg.add_waypoint(ship_pos + dcs.Point(0, -100 * 1000))
    cvbg.add_waypoint(ship_pos + dcs.Point(-30 * 1000, -100 * 1000))
    cvbg.add_waypoint(ship_pos + dcs.Point(-30 * 1000, 0))
    # cvbg.add_waypoint(ship_pos)
    # cvbg.add_waypoint(ship_pos + dcs.Point(0, -100*1000))
    # cvbg.add_waypoint(ship_pos + dcs.Point(-30*1000, -100*1000))
    # cvbg.add_waypoint(ship_pos + dcs.Point(-30*1000, 0))
    # cvbg.add_waypoint(ship_pos)

    name = namegen.next_unit_name(usa)
    fg = m.flight_group_from_unit(country=usa,
                                  name=name,
                                  aircraft_type=planes.FA_18C_hornet,
                                  maintask=None,
                                  start_type=StartType.Warm,
                                  pad_group=cvbg,
                                  group_size=4)
    fg.set_client()

    offset = dcs.Point(random() * 1000.0, random() * 1000.0)
    orientation = random() * 360.
    sa2_pos = sochi.position + offset
    p = fg.add_waypoint(ship_pos + dcs.Point(1000, 3000), feet_to_meters(8000))
    pos = point_along_route(p.position, sochi.position, 50 * 2000)
    p = fg.add_waypoint(pos, feet_to_meters(26000))
    fg.add_waypoint(point_along_route(p.position, sochi.position, -1000),
                    feet_to_meters(26000))
    fg.land_at(cvbg)

    make_sa2_site(m, russia, sa2_pos, orientation)

    awacs = m.awacs_flight(usa,
                           "AWACS",
                           planes.E_3A,
                           None,
                           dcs.Point(sochi.position.x + 20000,
                                     sochi.position.y + 80000),
                           race_distance=80 * 1000,
                           heading=90,
                           speed=knots_to_kph(500),
                           altitude=feet_to_meters(30000))
    tasks = awacs.points[0].tasks
    tasks.append(EPLRS())
    campaign.mission = m
    return m
Exemplo n.º 7
0
def main():
    aircrafts = [x for x in dcs.planes.plane_map.values() if x.flyable]
    helicopters = [x for x in dcs.helicopters.helicopter_map.values() if x.flyable]
    aircraft_types = [x.id for x in aircrafts + helicopters]

    parser = argparse.ArgumentParser(description="DCS random search and destroy oil convoy")
    parser.add_argument("-a", "--aircrafttype", default=dcs.planes.A_10C.id,
                        choices=aircraft_types,
                        help="Player aircraft type")
    parser.add_argument("-u", "--unhide", action="store_true", default=False, help="Show enemy pre mission")
    parser.add_argument("-t", "--terrain", choices=["caucasus", "nevada"], default='caucasus')
    parser.add_argument("-d", "--difficulty", choices=["easy", "normal", "hard", "ohno"], default='normal')
    parser.add_argument("-m", "--multiplayer", action="store_true", default=False)
    parser.add_argument("-s", "--stats", action="store_false", default=True)
    parser.add_argument("-o", "--output", help="Name and path of the generated mission", default=None)

    args = parser.parse_args()
    terrain_map = {
        "caucasus": dcs.terrain.Caucasus,
        "nevada": dcs.terrain.Nevada
    }
    difficulty_map = {
        'easy': 0.25,
        'normal': 0.5,
        'hard': 0.7,
        'ohno': 0.9
    }
    difficulty = difficulty_map[args.difficulty]

    terrain = terrain_map[args.terrain]()

    zone_abkhazia = dcs.Polygon([
        dcs.Point(-187092.85714285, 460857.14285714, terrain),
        dcs.Point(-149378.57142856, 476285.71428571, terrain),
        dcs.Point(-147664.28571428, 520000, terrain),
        dcs.Point(-175378.57142856, 599714.28571429, terrain),
        dcs.Point(-174521.42857142, 644000, terrain),
        dcs.Point(-199664.28571428, 624000, terrain),
        dcs.Point(-233949.99999999, 632857.14285714, terrain),
        dcs.Point(-271092.85714285, 596000, terrain)
    ])

    destination_city = 'Adler'
    zone_enemy = zone_abkhazia

    if args.output is None:
        args.output = os.path.join(os.path.expanduser("~"), "Saved Games\\DCS\\Missions\\oil_transport.miz")
        if args.terrain == "caucasus":
            zone_enemy = zone_abkhazia
            destination_city = 'Adler'
    m = dcs.Mission(terrain)
    m.random_weather = True
    m.random_date()
    m.random_daytime('day')

    for a in m.terrain.default_red_airports():
        a.set_red()

    for b in m.terrain.default_blue_airports():
        b.set_blue()

    city_graph = m.terrain.city_graph

    destination_node = city_graph.node(destination_city)

    # find a startnode far away enough
    start_node = random.choice(city_graph.rated_nodes_within(zone_enemy))
    while start_node.position.distance_to_point(destination_node.position) < 70000:
        start_node = random.choice(city_graph.rated_nodes_within(zone_enemy))

    # create the oil convoy
    abkhazia = m.country(dcs.countries.Abkhazia.name)
    convoy_vehicles = []
    for i in range(0, 1 + int(max(difficulty, random.random()) * 10)):
        convoy_vehicles.append(dcs.vehicles.Unarmed.Fuel_Truck_ATZ_10)

    airdef = [
        dcs.countries.Abkhazia.Vehicle.AirDefence.AAA_ZU_23_on_Ural_375,
        dcs.countries.Abkhazia.Vehicle.AirDefence.SPAAA_ZSU_23_4_Shilka
    ]
    if random.random() < difficulty:
        convoy_vehicles.append(random.choice(airdef))

    oil_convoy = m.vehicle_group_platoon(
        abkhazia,
        "Oil Convoy",
        convoy_vehicles,
        start_node.position.random_point_within(50))
    oil_convoy.hidden = not args.unhide
    oil_convoy.points[0].tasks.append(dcs.task.OptDisparseUnderFire())
    oil_convoy.set_skill(dcs.unit.Skill.from_percentage(difficulty))
    oil_convoy.formation_scattered(0, 50)
    oil_convoy.add_waypoint(start_node.position, dcs.point.PointAction.OnRoad)
    _, path = city_graph.travel(oil_convoy, start_node, destination_node, 100)

    # add light air defence around and in cities on path
    aaa_def = [[dcs.countries.Abkhazia.Vehicle.AirDefence.AAA_ZU_23_Emplacement],
               [dcs.countries.Abkhazia.Vehicle.AirDefence.SAM_SA_18_Igla_MANPADS,
                dcs.countries.Abkhazia.Vehicle.AirDefence.SAM_SA_18_Igla_comm]]
    for city in city_graph.rated_nodes_within(zone_enemy, 50):
        use_building_pos = int(min(difficulty, random.random()) * len(city.air_defence_pos_small))
        small_aaa_pos = list(city.air_defence_pos_small)
        for i in range(0, use_building_pos):
            p = small_aaa_pos.pop(random.randrange(0, len(small_aaa_pos)))
            vg = m.vehicle_group_platoon(abkhazia,
                                         city.name + " AAA #" + str(len(small_aaa_pos)),
                                         random.choice(aaa_def),
                                         p,
                                         0)
            vg.set_skill(dcs.unit.Skill.from_percentage(difficulty))
            vg.hidden = not args.unhide
            vg.formation_scattered(random.randrange(0, 360), 15)

    aaa_def += [[dcs.countries.Abkhazia.Vehicle.AirDefence.SPAAA_ZSU_23_4_Shilka,
                 dcs.countries.Abkhazia.Vehicle.Armor.ARV_BRDM_2,
                 dcs.countries.Abkhazia.Vehicle.Armor.ARV_BRDM_2]]
    for node in city_graph.nodes_within(zone_enemy):
        if random.random() < (difficulty - 0.1):
            vg = m.vehicle_group_platoon(abkhazia,
                                         node.name,
                                         random.choice(aaa_def),
                                         node.position.random_point_within(100, 30),
                                         random.randrange(0, 360))
            vg.set_skill(dcs.unit.Skill.from_percentage(difficulty))
            vg.hidden = not args.unhide

    # add a buk site if difficulty is hard or higher
    if difficulty > 0.5:
        buk_node = random.choice(city_graph.rated_nodes_within(zone_enemy, 50))
        sa11 = dcs.templates.VehicleTemplate.sa11_site(
            m,
            abkhazia,
            buk_node.position.random_point_within(80, 30),
            120,
            skill=dcs.unit.Skill.from_percentage(difficulty))
        sa11.hidden = not args.unhide

    usa = m.country('USA')

    # place farp for helis
    zugdidi_ne = city_graph.node('Zugidi NE')
    farp = m.farp(usa, "FARP Zugdidi", zugdidi_ne.position + dcs.mapping.Point(0, 500), callsign_id=1)
    fg = m.flight_group_from_unit(
        usa, dcs.helicopters.Ka_50.id + " Client", dcs.helicopters.Ka_50, farp, dcs.task.CAS, group_size=2)
    fg.set_client()

    farp = m.farp(usa, "FARP Kvemo", zugdidi_ne.position + dcs.mapping.Point(0, -22 * 1000), callsign_id=2)
    fg = m.flight_group_from_unit(
        usa, dcs.helicopters.UH_1H.id + " Client", dcs.helicopters.UH_1H, farp, dcs.task.CAS, group_size=2)
    fg.set_client()

    # place player
    player_fg = None
    if args.multiplayer:
        for x in aircrafts:
            if dcs.task.CAS in x.tasks and x not in [dcs.planes.Su_33, dcs.planes.MiG_29A, dcs.planes.MiG_29S]:
                country = m.country(dcs.countries.Georgia.name) if x in [dcs.planes.Su_25T, dcs.planes.Su_25] else usa
                fg = m.flight_group_from_airport(
                    country, x.id + " Client", x, m.terrain.senaki_kolkhi(), dcs.task.CAS, group_size=2)
                fg.add_runway_waypoint(m.terrain.senaki_kolkhi())
                fg.set_client()
    else:
        aircraft_type = [x for x in aircrafts if x.id == args.aircrafttype][0]
        player_fg = m.flight_group_from_airport(usa, "Player", aircraft_type, m.terrain.senaki_kolkhi(), dcs.task.CAS)
        player_fg.add_runway_waypoint(m.terrain.senaki_kolkhi())
        player_fg.units[0].set_player()

    # CAP flight
    cap_type = random.choice([dcs.planes.F_16C_bl_52d, dcs.planes.F_A_18C, dcs.planes.F_15E])
    m.patrol_flight(usa, "CAP", cap_type, m.terrain.kutaisi(), zugdidi_ne.position,
                    zugdidi_ne.position.point_from_heading(random.randint(270, 350), 35 * 1000))

    notify_nodes = path[1:5]
    for i in range(0, int((1.3 - difficulty) * 3)):
        notifier_node = random.randrange(0, len(notify_nodes))
        notifier_node = city_graph.node(notify_nodes.pop(notifier_node))
        notify_zone = m.triggers.add_triggerzone(notifier_node.position, 300, hidden=False, name='notify_zone')
        notify_zone.hidden = True
        trig_notify = dcs.triggers.TriggerOnce(comment='NotifyConvoyPosition #' + str(i))
        trig_notify.rules.append(dcs.condition.PartOfGroupInZone(oil_convoy.id, notify_zone.id))
        trig_notify.actions.append(dcs.action.MessageToCoalition(
            dcs.action.Coalition.Blue,
            m.string('Intel just reported that the convoy just arrived at ' + notifier_node.name),
            20))
        m.triggerrules.triggers.append(trig_notify)

    trig_convoy_dead = dcs.triggers.TriggerOnce(dcs.triggers.Event.Destroy, comment='Convoy dead')
    trig_convoy_dead.rules.append(dcs.condition.GroupDead(oil_convoy.id))
    trig_convoy_dead.actions.append(dcs.action.MessageToCoalition(
        dcs.action.Coalition.Blue, m.string('Excellent job!\nIntelligence reports the convoy was destroyed!\nRTB'), 15))
    m.triggerrules.triggers.append(trig_convoy_dead)

    m.forced_options.civil_traffic = dcs.forcedoptions.ForcedOptions.CivilTraffic.Low

    g = dcs.goals.Goal("convoy destroyed", score=100)
    g.rules.append(dcs.condition.GroupDead(oil_convoy.id))
    if player_fg:
        g.rules.append(dcs.condition.GroupAlive(player_fg.id))
    m.goals.add_blue(g)
    m.goals.add_offline(g)

    m.set_sortie_text("Search and destroy the oil convoy")
    m.set_description_text("""Abkhazia is selling oil to Russia to silently finance their military investments.

US and Georgia forces decided to prevent these oil transports.""")
    m.set_description_bluetask_text("""You are tasked to search and destroy a current oil convoy.

The position of the convoy is unknown, but we have several agents in Abkhazia that will look out
for the current route of the oil convoy.
Last known position will be transmitted to you while in flight.
Keep in mind that there are man pads and several AAA air defences around cities in Abkazia that are just waiting
to shoot down an American or Georgian aircraft.

Mission objectives:
  * Find the convoy
  * Destroy the convoy
  * Head back in one piece to Senaki airport.""")

    if args.stats:
        m.print_stats(m.stats())
    m.save(args.output)

    return 0
Exemplo n.º 8
0
def load_graph(mission_file):
    m = dcs.mission.Mission()
    m.load_file(mission_file)

    graph = dcs.terrain.Graph()

    # add nodes
    for g in [
            x for x in m.country('USA').vehicle_group
            if x.units[0].type == dcs.vehicles.Armor.APC_AAV_7.id
    ]:
        splitname = str(g.name).split(' ')
        rating = None
        if not splitname[-1] in dcs.terrain.Graph.Edge_indicators \
                and not splitname[-1].startswith('#') \
                and not splitname[-1] == 'shortcut':
            rating = g.spawn_probability * 100
        graph.add_node(
            dcs.terrain.Node(str(g.name), rating,
                             dcs.Point(g.position.x, g.position.y)))

    # add building air defence positions
    for g in [
            x for x in m.country('USA').vehicle_group if x.units[0].type ==
            dcs.vehicles.AirDefence.SAM_Stinger_MANPADS.id
    ]:
        nodename = str(g.name)
        nodename = nodename.split(' ')[:-1][0]
        graph.node(nodename).air_defence_pos_small.append(g.position)

    # add node edges
    for g in [
            x for x in m.country('USA').vehicle_group
            if x.units[0].type == dcs.vehicles.Armor.APC_AAV_7.id
    ]:
        nodename = str(g.name)
        splitname = nodename.split(' ')
        if splitname[-1] in dcs.terrain.Graph.Edge_indicators or splitname[
                -1].startswith('#') or splitname[-1] == 'shortcut':
            from_node = graph.node(nodename)

            if not nodename.endswith('shortcut'):
                mainnode_name = ' '.join(splitname[:-1])
                main_node = graph.node(mainnode_name)
                graph.add_edge(
                    from_node, main_node,
                    g.position.distance_to_point(main_node.position))
                graph.add_edge(
                    main_node, from_node,
                    g.position.distance_to_point(main_node.position))
                # print(from_node, main_node)

            targets = str(g.units[0].name)
            targets = targets.split(',')
            for target in targets:
                target = target.strip()
                r = target.find('#')
                if r >= 0:
                    target = target[:r].strip()

                if target.endswith('.'):
                    on_road = False
                    target = target[:-1]
                else:
                    on_road = True

                # print(from_node, target)
                to_node = graph.node(target)
                dist = g.position.distance_to_point(to_node.position)
                graph.add_edge(from_node, to_node, dist, on_road)

    # print(self.nodes)

    return graph