Exemple #1
0
    def generate(self, is_awacs_enabled):
        player_cp = self.conflict.from_cp if self.conflict.from_cp.captured else self.conflict.to_cp

        CALLSIGNS = ["TKR", "TEX", "FUL", "FUE", ""]
        for i, tanker_unit_type in enumerate(
                db.find_unittype(Refueling, self.conflict.attackers_side)):
            self.generated_tankers.append(db.unit_type_name(tanker_unit_type))
            tanker_heading = self.conflict.to_cp.position.heading_between_point(
                self.conflict.from_cp.position) + TANKER_HEADING_OFFSET * i
            tanker_position = player_cp.position.point_from_heading(
                tanker_heading, TANKER_DISTANCE)
            tanker_group = self.mission.refuel_flight(
                country=self.mission.country(self.game.player_country),
                name=namegen.next_tanker_name(
                    self.mission.country(self.game.player_country)),
                airport=None,
                plane_type=tanker_unit_type,
                position=tanker_position,
                altitude=TANKER_ALT,
                race_distance=58000,
                frequency=130 + i,
                start_type=StartType.Warm,
                speed=574,
                tacanchannel="{}X".format(60 + i),
            )

            if tanker_unit_type != IL_78M:
                tanker_group.points[0].tasks.pop(
                )  # Override PyDCS tacan channel
                tanker_group.points[0].tasks.append(
                    ActivateBeaconCommand(97 + 1, "X", CALLSIGNS[i], True,
                                          tanker_group.units[0].id, True))

            tanker_group.points[0].tasks.append(SetInvisibleCommand(True))
            tanker_group.points[0].tasks.append(SetImmortalCommand(True))

        if is_awacs_enabled:
            try:
                awacs_unit = db.find_unittype(AWACS,
                                              self.conflict.attackers_side)[0]
                awacs_flight = self.mission.awacs_flight(
                    country=self.mission.country(self.game.player_country),
                    name=namegen.next_awacs_name(
                        self.mission.country(self.game.player_country)),
                    plane_type=awacs_unit,
                    altitude=AWACS_ALT,
                    airport=None,
                    position=self.conflict.position.random_point_within(
                        AWACS_DISTANCE, AWACS_DISTANCE),
                    frequency=233,
                    start_type=StartType.Warm,
                )
                awacs_flight.points[0].tasks.append(SetInvisibleCommand(True))
                awacs_flight.points[0].tasks.append(SetImmortalCommand(True))
            except:
                print("No AWACS for faction")
Exemple #2
0
    def init_ui(self):
        layout = QVBoxLayout()
        scroll_content = QWidget()
        intelLayout = QVBoxLayout()

        units = {
            CAP: db.find_unittype(CAP, self.game.enemy_name),
            Embarking: db.find_unittype(Embarking, self.game.enemy_name),
            CAS: db.find_unittype(CAS, self.game.enemy_name),
            PinpointStrike: db.find_unittype(PinpointStrike, self.game.enemy_name),
        }

        for task_type in units.keys():
            units_column = list(set(units[task_type]))

            if sum([self.cp.base.total_units_of_type(u) for u in units_column]) > 0:

                group = QGroupBox(db.task_name(task_type))
                groupLayout = QGridLayout()
                group.setLayout(groupLayout)

                row = 0
                for unit_type in units_column:
                    existing_units = self.cp.base.total_units_of_type(unit_type)
                    if existing_units == 0:
                        continue
                    groupLayout.addWidget(
                        QLabel(
                            "<b>"
                            + db.unit_get_expanded_info(
                                self.game.enemy_country, unit_type, "name"
                            )
                            + "</b>"
                        ),
                        row,
                        0,
                    )
                    groupLayout.addWidget(QLabel(str(existing_units)), row, 1)
                    row += 1

                intelLayout.addWidget(group)

        scroll_content.setLayout(intelLayout)
        scroll = QScrollArea()
        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        scroll.setWidgetResizable(True)
        scroll.setWidget(scroll_content)

        layout.addWidget(scroll)

        self.setLayout(layout)
Exemple #3
0
    def generate(self, is_awacs_enabled):
        player_cp = self.conflict.from_cp if self.conflict.from_cp.captured else self.conflict.to_cp

        for i, tanker_unit_type in enumerate(
                db.find_unittype(Refueling,
                                 self.conflict.attackers_side.name)):
            self.generated_tankers.append(db.unit_type_name(tanker_unit_type))
            tanker_heading = self.conflict.to_cp.position.heading_between_point(
                self.conflict.from_cp.position) + TANKER_HEADING_OFFSET * i
            tanker_position = player_cp.position.point_from_heading(
                tanker_heading, TANKER_DISTANCE)
            tanker_group = self.mission.refuel_flight(
                country=self.mission.country(self.game.player),
                name=namegen.next_tanker_name(
                    self.mission.country(self.game.player)),
                airport=None,
                plane_type=tanker_unit_type,
                position=tanker_position,
                altitude=TANKER_ALT,
                frequency=130 + i,
                start_type=StartType.Warm,
                tacanchannel="{}X".format(97 + i),
            )

            tanker_group.points[0].tasks.append(
                ActivateBeaconCommand(channel=97 + i,
                                      unit_id=tanker_group.id,
                                      aa=False))
            tanker_group.points[0].tasks.append(SetInvisibleCommand(True))
            tanker_group.points[0].tasks.append(SetImmortalCommand(True))

        if is_awacs_enabled:
            awacs_unit = db.find_unittype(AWACS,
                                          self.conflict.attackers_side.name)[0]
            awacs_flight = self.mission.awacs_flight(
                country=self.mission.country(self.game.player),
                name=namegen.next_awacs_name(
                    self.mission.country(self.game.player)),
                plane_type=awacs_unit,
                altitude=AWACS_ALT,
                airport=None,
                position=self.conflict.position.random_point_within(
                    AWACS_DISTANCE, AWACS_DISTANCE),
                frequency=133,
                start_type=StartType.Warm,
            )

            awacs_flight.points[0].tasks.append(SetInvisibleCommand(True))
            awacs_flight.points[0].tasks.append(SetImmortalCommand(True))
    def init_ui(self):
        main_layout = QVBoxLayout()

        units = {
            PinpointStrike:
            db.find_unittype(PinpointStrike, self.game_model.game.player_name),
        }

        scroll_content = QWidget()
        task_box_layout = QGridLayout()
        scroll_content.setLayout(task_box_layout)
        row = 0

        for task_type in units.keys():
            units_column = list(set(units[task_type]))
            if len(units_column) == 0:
                continue
            units_column.sort(key=lambda u: db.unit_get_expanded_info(
                self.game_model.game.player_country, u, "name"))
            for unit_type in units_column:
                row = self.add_purchase_row(unit_type, task_box_layout, row)
            stretch = QVBoxLayout()
            stretch.addStretch()
            task_box_layout.addLayout(stretch, row, 0)

        scroll_content.setLayout(task_box_layout)
        scroll = QScrollArea()
        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        scroll.setWidgetResizable(True)
        scroll.setWidget(scroll_content)
        main_layout.addWidget(scroll)
        self.setLayout(main_layout)
Exemple #5
0
    def generate_passengers(self, count: int):
        unit_type = random.choice(
            db.find_unittype(Nothing, self.conflict.attackers_side.name))

        self.m.vehicle_group(country=self.conflict.attackers_side,
                             name=namegen.next_unit_name(
                                 self.conflict.attackers_side, unit_type),
                             _type=unit_type,
                             position=self.conflict.ground_attackers_location,
                             group_size=count)
Exemple #6
0
    def init_ui(self):
        layout = QVBoxLayout()

        intel = QGroupBox("Intel")
        intelLayout = QVBoxLayout()

        units = {
            CAP: db.find_unittype(CAP, self.game.enemy_name),
            Embarking: db.find_unittype(Embarking, self.game.enemy_name),
            CAS: db.find_unittype(CAS, self.game.enemy_name),
            PinpointStrike: db.find_unittype(PinpointStrike,
                                             self.game.enemy_name),
        }

        for task_type in units.keys():
            units_column = list(set(units[task_type]))

            if sum([self.cp.base.total_units_of_type(u)
                    for u in units_column]) > 0:

                group = QGroupBox(db.task_name(task_type))
                groupLayout = QGridLayout()
                group.setLayout(groupLayout)

                row = 0
                for unit_type in units_column:
                    existing_units = self.cp.base.total_units_of_type(
                        unit_type)
                    if existing_units == 0:
                        continue
                    groupLayout.addWidget(
                        QLabel("<b>" + db.unit_type_name(unit_type) + "</b>"),
                        row, 0)
                    groupLayout.addWidget(QLabel(str(existing_units)), row, 1)
                    row += 1

                intelLayout.addWidget(group)

        intelLayout.addStretch()
        intel.setLayout(intelLayout)
        layout.addWidget(intel)
        layout.addStretch()
        self.setLayout(layout)
Exemple #7
0
    def init_ui(self):
        main_layout = QVBoxLayout()

        tasks = [CAP, CAS, AWACS]

        scroll_content = QWidget()
        task_box_layout = QGridLayout()
        row = 0

        unit_types: Set[Type[FlyingType]] = set()
        for task in tasks:
            units = db.find_unittype(task, self.game_model.game.player_name)
            if not units:
                continue
            for unit in units:
                if not issubclass(unit, FlyingType):
                    continue
                if self.cp.is_carrier and unit not in db.CARRIER_CAPABLE:
                    continue
                if self.cp.is_lha and unit not in db.LHA_CAPABLE:
                    continue
                if (self.cp.cptype
                        in [ControlPointType.FOB, ControlPointType.FARP]
                        and unit not in helicopter_map.values()):
                    continue
                unit_types.add(unit)

        sorted_units = sorted(
            unit_types,
            key=lambda u: db.unit_get_expanded_info(
                self.game_model.game.player_country, u, "name"),
        )
        for unit_type in sorted_units:
            row = self.add_purchase_row(
                unit_type,
                task_box_layout,
                row,
                disabled=not self.cp.can_operate(unit_type),
            )
            stretch = QVBoxLayout()
            stretch.addStretch()
            task_box_layout.addLayout(stretch, row, 0)

        scroll_content.setLayout(task_box_layout)
        scroll = QScrollArea()
        scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        scroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        scroll.setWidgetResizable(True)
        scroll.setWidget(scroll_content)
        main_layout.addLayout(self.hangar_status)
        main_layout.addWidget(scroll)
        self.setLayout(main_layout)
Exemple #8
0
    def player_attacking(self, flights: db.TaskForceDict):
        assert Embarking in flights and len(flights) == 1, "Invalid flights"

        op = InfantryTransportOperation(game=self.game,
                                        attacker_name=self.attacker_name,
                                        defender_name=self.defender_name,
                                        from_cp=self.from_cp,
                                        departure_cp=self.departure_cp,
                                        to_cp=self.to_cp)

        air_defense = db.find_unittype(AirDefence, self.defender_name)[0]
        op.setup(transport=flights[Embarking], aa={air_defense: 2})

        self.operation = op
Exemple #9
0
    def generate_carrier(self, for_units: typing.Collection[UnitType], country: str, at: Point) -> ShipGroup:
        type = db.find_unittype(Carriage, country)[0]
        for unit_type in for_units:
            if unit_type in db.CARRIER_TYPE_BY_PLANE:
                type = db.CARRIER_TYPE_BY_PLANE[unit_type]
                break

        group = self.m.ship_group(
            country=self.m.country(country),
            name=namegen.next_carrier_name(self.m.country(country)),
            _type=type,
            position=at)

        group.points[0].tasks.append(ActivateBeaconCommand(unit_id=group.id, channel=20, callsign="SHDW", aa=False))
        group.points[0].tasks.append(ActivateICLSCommand(unit_id=group.id, channel=1))
        return group
    def generate(self, is_awacs_enabled):
        player_cp = self.conflict.from_cp if self.conflict.from_cp.captured else self.conflict.to_cp

        fallback_tanker_number = 0

        for i, tanker_unit_type in enumerate(
                db.find_unittype(Refueling, self.conflict.attackers_side)):
            variant = db.unit_type_name(tanker_unit_type)
            freq = self.radio_registry.alloc_uhf()
            tacan = self.tacan_registry.alloc_for_band(TacanBand.Y)
            tanker_heading = self.conflict.to_cp.position.heading_between_point(
                self.conflict.from_cp.position) + TANKER_HEADING_OFFSET * i
            tanker_position = player_cp.position.point_from_heading(
                tanker_heading, TANKER_DISTANCE)
            tanker_group = self.mission.refuel_flight(
                country=self.mission.country(self.game.player_country),
                name=namegen.next_tanker_name(
                    self.mission.country(self.game.player_country),
                    tanker_unit_type),
                airport=None,
                plane_type=tanker_unit_type,
                position=tanker_position,
                altitude=TANKER_ALT,
                race_distance=58000,
                frequency=freq.mhz,
                start_type=StartType.Warm,
                speed=574,
                tacanchannel=str(tacan),
            )
            tanker_group.set_frequency(freq.mhz)

            callsign = callsign_for_support_unit(tanker_group)
            tacan_callsign = {
                "Texaco": "TEX",
                "Arco": "ARC",
                "Shell": "SHL",
            }.get(callsign)
            if tacan_callsign is None:
                # The dict above is all the callsigns currently in the game, but
                # non-Western countries don't use the callsigns and instead just
                # use numbers. It's possible that none of those nations have
                # TACAN compatible refueling aircraft, but fallback just in
                # case.
                tacan_callsign = f"TK{fallback_tanker_number}"
                fallback_tanker_number += 1

            if tanker_unit_type != IL_78M:
                # Override PyDCS tacan channel.
                tanker_group.points[0].tasks.pop()
                tanker_group.points[0].tasks.append(
                    ActivateBeaconCommand(tacan.number, tacan.band.value,
                                          tacan_callsign, True,
                                          tanker_group.units[0].id, True))

            tanker_group.points[0].tasks.append(SetInvisibleCommand(True))
            tanker_group.points[0].tasks.append(SetImmortalCommand(True))

            self.air_support.tankers.append(
                TankerInfo(str(tanker_group.name), callsign, variant, freq,
                           tacan))

        if is_awacs_enabled:
            try:
                freq = self.radio_registry.alloc_uhf()
                awacs_unit = db.find_unittype(AWACS,
                                              self.conflict.attackers_side)[0]
                awacs_flight = self.mission.awacs_flight(
                    country=self.mission.country(self.game.player_country),
                    name=namegen.next_awacs_name(
                        self.mission.country(self.game.player_country)),
                    plane_type=awacs_unit,
                    altitude=AWACS_ALT,
                    airport=None,
                    position=self.conflict.position.random_point_within(
                        AWACS_DISTANCE, AWACS_DISTANCE),
                    frequency=freq.mhz,
                    start_type=StartType.Warm,
                )
                awacs_flight.set_frequency(freq.mhz)

                awacs_flight.points[0].tasks.append(SetInvisibleCommand(True))
                awacs_flight.points[0].tasks.append(SetImmortalCommand(True))

                self.air_support.awacs.append(
                    AwacsInfo(str(awacs_flight.name),
                              callsign_for_support_unit(awacs_flight), freq))
            except:
                print("No AWACS for faction")
    def init_ui(self):
        faction = self.game.player_name

        # Sams

        possible_sams = get_faction_possible_sams_generator(faction)
        for sam in possible_sams:
            self.samCombo.addItem(sam.name + " [$" + str(sam.price) + "M]",
                                  userData=sam)
        self.samCombo.currentIndexChanged.connect(self.samComboChanged)

        self.buySamLayout.addWidget(QLabel("Site Type :"), 0, 0, Qt.AlignLeft)
        self.buySamLayout.addWidget(self.samCombo,
                                    0,
                                    1,
                                    alignment=Qt.AlignRight)
        self.buySamLayout.addWidget(self.buySamButton,
                                    1,
                                    1,
                                    alignment=Qt.AlignRight)
        stretch = QVBoxLayout()
        stretch.addStretch()
        self.buySamLayout.addLayout(stretch, 2, 0)

        self.buySamButton.clicked.connect(self.buySam)

        # Armored units

        armored_units = db.find_unittype(
            PinpointStrike, faction)  # Todo : refactor this legacy nonsense
        for unit in set(armored_units):
            self.buyArmorCombo.addItem(db.unit_type_name_2(unit) + " [$" +
                                       str(db.PRICES[unit]) + "M]",
                                       userData=unit)
        self.buyArmorCombo.currentIndexChanged.connect(self.armorComboChanged)

        self.amount.setMinimum(2)
        self.amount.setMaximum(8)
        self.amount.setValue(2)
        self.amount.valueChanged.connect(self.amountComboChanged)

        self.buyArmorLayout.addWidget(QLabel("Unit type :"), 0, 0,
                                      Qt.AlignLeft)
        self.buyArmorLayout.addWidget(self.buyArmorCombo,
                                      0,
                                      1,
                                      alignment=Qt.AlignRight)
        self.buyArmorLayout.addWidget(QLabel("Group size :"),
                                      1,
                                      0,
                                      alignment=Qt.AlignLeft)
        self.buyArmorLayout.addWidget(self.amount,
                                      1,
                                      1,
                                      alignment=Qt.AlignRight)
        self.buyArmorLayout.addWidget(self.buyArmorButton,
                                      2,
                                      1,
                                      alignment=Qt.AlignRight)
        stretch2 = QVBoxLayout()
        stretch2.addStretch()
        self.buyArmorLayout.addLayout(stretch2, 3, 0)

        self.buyArmorButton.clicked.connect(self.buyArmor)

        # Do layout
        self.buySamBox.setLayout(self.buySamLayout)
        self.buyArmorBox.setLayout(self.buyArmorLayout)

        self.mainLayout = QHBoxLayout()
        self.mainLayout.addWidget(self.buySamBox)

        if self.ground_object.airbase_group:
            self.mainLayout.addWidget(self.buyArmorBox)

        self.setLayout(self.mainLayout)

        try:
            self.samComboChanged(0)
            self.armorComboChanged(0)
        except:
            pass