Ejemplo n.º 1
0
 def __init__(self, game_model: GameModel):
     super(QTopPanel, self).__init__()
     self.game_model = game_model
     self.setMaximumHeight(70)
     self.init_ui()
     GameUpdateSignal.get_instance().gameupdated.connect(self.setGame)
     GameUpdateSignal.get_instance().budgetupdated.connect(self.budget_update)
Ejemplo n.º 2
0
    def applySettings(self):
        self.game.settings.player_skill = CONST.SKILL_OPTIONS[self.playerCoalitionSkill.currentIndex()]
        self.game.settings.enemy_skill = CONST.SKILL_OPTIONS[self.enemyCoalitionSkill.currentIndex()]
        self.game.settings.enemy_vehicle_skill = CONST.SKILL_OPTIONS[self.enemyAASkill.currentIndex()]
        self.game.settings.labels = CONST.LABELS_OPTIONS[self.difficultyLabel.currentIndex()]
        self.game.settings.night_disabled = self.noNightMission.isChecked()
        self.game.settings.map_coalition_visibility = self.mapVisibiitySelection.currentData()
        self.game.settings.external_views_allowed = self.ext_views.isChecked()
        self.game.settings.generate_marks = self.generate_marks.isChecked()
        self.game.settings.include_jtac_if_available = self.include_jtac_if_available.isChecked()

        print(self.game.settings.map_coalition_visibility)

        self.game.settings.supercarrier = self.supercarrier.isChecked()

        self.game.settings.perf_red_alert_state = self.red_alert.isChecked()
        self.game.settings.perf_smoke_gen = self.smoke.isChecked()
        self.game.settings.perf_artillery = self.arti.isChecked()
        self.game.settings.perf_moving_units = self.moving_units.isChecked()
        self.game.settings.perf_infantry = self.infantry.isChecked()
        self.game.settings.perf_ai_parking_start = self.ai_parking_start.isChecked()
        self.game.settings.perf_destroyed_units = self.destroyed_units.isChecked()

        self.game.settings.perf_culling = self.culling.isChecked()
        self.game.settings.perf_culling_distance = int(self.culling_distance.value())

        GameUpdateSignal.get_instance().updateGame(self.game)
Ejemplo n.º 3
0
 def passTurn(self):
     start = timeit.default_timer()
     self.game.pass_turn(no_action=True)
     GameUpdateSignal.get_instance().updateGame(self.game)
     self.proceedButton.setEnabled(True)
     end = timeit.default_timer()
     logging.info("Skipping turn took %s", timedelta(seconds=end - start))
    def sceneMousePressEvent(self, event: QGraphicsSceneMouseEvent):
        if self.state == QLiberationMapState.MOVING_UNIT:
            if event.buttons() == Qt.RightButton:
                pass
            elif event.buttons() == Qt.LeftButton:
                if self.selected_cp is not None:
                    # Set movement position for the cp
                    pos = event.scenePos()
                    point = Point(int(pos.x()), int(pos.y()))
                    proj = self._scene_to_dcs_coords(point)

                    if self.is_valid_ship_pos(point):
                        self.selected_cp.control_point.target_position = proj
                    else:
                        self.selected_cp.control_point.target_position = None

                    GameUpdateSignal.get_instance().updateGame(
                        self.game_model.game)
            else:
                return
            self.state = QLiberationMapState.NORMAL
            try:
                self.scene().removeItem(self.movement_line)
            except:
                pass
            self.selected_cp = None
Ejemplo n.º 5
0
    def applySettings(self):
        self.game.settings.player_skill = CONST.SKILL_OPTIONS[self.playerCoalitionSkill.currentIndex()]
        self.game.settings.enemy_skill = CONST.SKILL_OPTIONS[self.enemyCoalitionSkill.currentIndex()]
        self.game.settings.enemy_vehicle_skill = CONST.SKILL_OPTIONS[self.enemyAASkill.currentIndex()]
        self.game.settings.player_income_multiplier = self.player_income.value
        self.game.settings.enemy_income_multiplier = self.enemy_income.value
        self.game.settings.manpads = self.manpads.isChecked()
        self.game.settings.labels = CONST.LABELS_OPTIONS[self.difficultyLabel.currentIndex()]
        self.game.settings.night_disabled = self.noNightMission.isChecked()
        self.game.settings.map_coalition_visibility = self.mapVisibiitySelection.currentData()
        self.game.settings.external_views_allowed = self.ext_views.isChecked()
        self.game.settings.generate_marks = self.generate_marks.isChecked()
        self.game.settings.never_delay_player_flights = self.never_delay_players.isChecked()

        self.game.settings.supercarrier = self.supercarrier.isChecked()

        self.game.settings.perf_red_alert_state = self.red_alert.isChecked()
        self.game.settings.perf_smoke_gen = self.smoke.isChecked()
        self.game.settings.perf_artillery = self.arti.isChecked()
        self.game.settings.perf_moving_units = self.moving_units.isChecked()
        self.game.settings.perf_infantry = self.infantry.isChecked()
        self.game.settings.perf_destroyed_units = self.destroyed_units.isChecked()

        self.game.settings.perf_culling = self.culling.isChecked()
        self.game.settings.perf_culling_distance = int(self.culling_distance.value())
        self.game.settings.perf_do_not_cull_carrier = self.culling_do_not_cull_carrier.isChecked()

        self.game.settings.show_red_ato = self.cheat_options.show_red_ato
        self.game.settings.enable_frontline_cheats = self.cheat_options.show_frontline_cheat
        self.game.settings.enable_base_capture_cheat = self.cheat_options.show_base_capture_cheat

        self.game.compute_conflicts_position()
        GameUpdateSignal.get_instance().updateGame(self.game)
Ejemplo n.º 6
0
 def cheatMoney(self, amount):
     logging.info("CHEATING FOR AMOUNT : " + str(amount) + "M")
     self.game.budget += amount
     if amount > 0:
         self.game.informations.append(Information("CHEATER", "You are a cheater and you should feel bad", self.game.turn))
     else:
         self.game.informations.append(Information("CHEATER", "You are still a cheater !", self.game.turn))
     GameUpdateSignal.get_instance().updateGame(self.game)
Ejemplo n.º 7
0
    def process_debriefing(self):
        with logged_duration("Turn processing"):
            self.sim_controller.process_results(self.debriefing)
            self.game.pass_turn()

            GameUpdateSignal.get_instance().sendDebriefing(self.debriefing)
            GameUpdateSignal.get_instance().updateGame(self.game)
        self.close()
 def openFile(self):
     file = QFileDialog.getOpenFileName(self, "Select game file to open",
                                            dir=persistency._dcs_saved_game_folder,
                                            filter="*.liberation")
     if file is not None:
         game = persistency.load_game(file[0])
         self.setGame(game)
         GameUpdateSignal.get_instance().updateGame(self.game)
Ejemplo n.º 9
0
    def saveGame(self):
        logging.info("Saving game")

        if self.game.savepath:
            persistency.save_game(self.game)
            GameUpdateSignal.get_instance().updateGame(self.game)
        else:
            self.saveGameAs()
Ejemplo n.º 10
0
    def process_debriefing(self):
        with logged_duration("Turn processing"):
            self.game.finish_event(event=self.gameEvent, debriefing=self.debriefing)
            self.game.pass_turn()

            GameUpdateSignal.get_instance().sendDebriefing(self.debriefing)
            GameUpdateSignal.get_instance().updateGame(self.game)
        self.close()
Ejemplo n.º 11
0
 def cheat_capture(self) -> None:
     events = GameUpdateEvents()
     self.cp.capture(self.game_model.game, events, for_player=not self.cp.captured)
     # Reinitialized ground planners and the like. The ATO needs to be reset because
     # missions planned against the flipped base are no longer valid.
     self.game_model.game.initialize_turn(events)
     EventStream.put_nowait(events)
     GameUpdateSignal.get_instance().updateGame(self.game_model.game)
    def process_debriefing(self):
        self.game.finish_event(event=self.gameEvent,
                               debriefing=self.debriefing)
        self.game.pass_turn()

        GameUpdateSignal.get_instance().sendDebriefing(self.game,
                                                       self.gameEvent,
                                                       self.debriefing)
        self.close()
Ejemplo n.º 13
0
    def saveGame(self):
        logging.info("Saving game")

        if self.game.savepath:
            persistency.save_game(self.game)
            GameUpdateSignal.get_instance().updateGame(self.game)
            liberation_install.setup_last_save_file(self.game.savepath)
            liberation_install.save_config()
        else:
            self.saveGameAs()
    def process_debriefing(self):
        start = timeit.default_timer()
        self.game.finish_event(event=self.gameEvent,
                               debriefing=self.debriefing)
        self.game.pass_turn()

        GameUpdateSignal.get_instance().sendDebriefing(self.debriefing)
        GameUpdateSignal.get_instance().updateGame(self.game)
        end = timeit.default_timer()
        logging.info("Turn processing took %s", timedelta(seconds=end - start))
        self.close()
Ejemplo n.º 15
0
    def applySettings(self):
        self.game.settings.show_red_ato = self.cheat_options.show_red_ato
        self.game.settings.enable_frontline_cheats = (
            self.cheat_options.show_frontline_cheat
        )
        self.game.settings.enable_base_capture_cheat = (
            self.cheat_options.show_base_capture_cheat
        )

        self.game.compute_unculled_zones()
        GameUpdateSignal.get_instance().updateGame(self.game)
Ejemplo n.º 16
0
 def update_game(self) -> None:
     events = GameUpdateEvents()
     events.update_tgo(self.ground_object)
     if any(
         package.target == self.ground_object
         for package in self.game.ato_for(player=False).packages
     ):
         # Replan if the tgo was a target of the redfor
         self.game.initialize_turn(events, for_red=True, for_blue=False)
     EventStream.put_nowait(events)
     GameUpdateSignal.get_instance().updateGame(self.game)
     # Refresh the dialog
     self.do_refresh_layout()
Ejemplo n.º 17
0
    def sell_all(self):
        self.update_total_value()
        self.game.budget = self.game.budget + self.total_value
        self.ground_object.groups = []

        # Replan if the tgo was a target of the redfor
        if any(
            package.target == self.ground_object
            for package in self.game.ato_for(player=False).packages
        ):
            self.game.initialize_turn(for_red=True, for_blue=False)

        self.do_refresh_layout()
        GameUpdateSignal.get_instance().updateGame(self.game)
Ejemplo n.º 18
0
 def __init__(self, game_model: GameModel) -> None:
     super().__init__()
     self.game_model = game_model
     self._map_center = [0, 0]
     self._control_points = []
     self._ground_objects = []
     self._supply_routes = []
     self._flights = []
     self._front_lines = []
     self._threat_zones = ThreatZoneContainerJs(
         ThreatZonesJs.empty(), ThreatZonesJs.empty()
     )
     self._navmeshes = NavMeshJs([], [])
     self._map_zones = MapZonesJs([], [], [])
     self._unculled_zones = []
     self._selected_flight_index: Optional[Tuple[int, int]] = None
     GameUpdateSignal.get_instance().game_loaded.connect(self.on_game_load)
     GameUpdateSignal.get_instance().flight_paths_changed.connect(self.reset_atos)
     GameUpdateSignal.get_instance().package_selection_changed.connect(
         self.set_package_selection
     )
     GameUpdateSignal.get_instance().flight_selection_changed.connect(
         self.set_flight_selection
     )
     self.reset()
Ejemplo n.º 19
0
 def cheat_alter_front_line(self, enemy_point: ControlPoint,
                            advance: bool) -> None:
     amount = 0.2
     if not advance:
         amount *= -1
     self.cp.base.affect_strength(amount)
     enemy_point.base.affect_strength(-amount)
     front_line = self.cp.front_line_with(enemy_point)
     front_line.update_position()
     events = GameUpdateEvents().update_front_line(front_line)
     # Clear the ATO to replan missions affected by the front line.
     self.game.initialize_turn(events)
     EventStream.put_nowait(events)
     GameUpdateSignal.get_instance().updateGame(self.game)
Ejemplo n.º 20
0
    def buySam(self):
        sam_generator = self.samCombo.itemData(self.samCombo.currentIndex())
        price = sam_generator.price - self.current_group_value
        if price > self.game.budget:
            self.error_money()
            return
        else:
            self.game.budget -= price

        self.ground_object.groups = list(sam_generator.groups)

        # Replan redfor missions
        self.game.initialize_turn(for_red=True, for_blue=False)

        GameUpdateSignal.get_instance().updateGame(self.game)
Ejemplo n.º 21
0
    def buy_ewr(self):
        ewr_generator = self.ewr_selector.itemData(self.ewr_selector.currentIndex())
        price = ewr_generator.price - self.current_group_value
        if price > self.game.budget:
            self.error_money()
            return
        else:
            self.game.budget -= price

        self.ground_object.groups = [ewr_generator.vg]

        # Replan redfor missions
        self.game.initialize_turn(for_red=True, for_blue=False)

        GameUpdateSignal.get_instance().updateGame(self.game)
Ejemplo n.º 22
0
    def repair_unit(self, unit, price):
        if self.game.blue.budget > price:
            self.game.blue.budget -= price
            unit.alive = True
            GameUpdateSignal.get_instance().updateGame(self.game)

            # Remove destroyed units in the vicinity
            destroyed_units = self.game.get_destroyed_units()
            for d in destroyed_units:
                p = Point(d["x"], d["z"], self.game.theater.terrain)
                if p.distance_to_point(unit.position) < 15:
                    destroyed_units.remove(d)
                    logging.info("Removed destroyed units " + str(d))
            logging.info(f"Repaired unit: {unit.unit_name}")

        self.update_game()
Ejemplo n.º 23
0
    def openFile(self):
        if self.game is not None and self.game.savepath:
            save_dir = self.game.savepath
        else:
            save_dir = str(persistency.save_dir())
        file = QFileDialog.getOpenFileName(
            self,
            "Select game file to open",
            dir=save_dir,
            filter="*.liberation",
        )
        if file is not None and file[0] != "":
            game = persistency.load_game(file[0])
            GameUpdateSignal.get_instance().game_loaded.emit(game)

            self.updateWindowTitle(file[0])
Ejemplo n.º 24
0
 def setGame(self, game: Optional[Game]):
     try:
         self.game = game
         if self.info_panel is not None:
             self.info_panel.setGame(game)
         self.game_model.set(self.game)
         if self.liberation_map is not None:
             self.liberation_map.setGame(game)
     except AttributeError:
         logging.exception("Incompatible save game")
         QMessageBox.critical(
             self, "Could not load save game",
             "The save game you have loaded is incompatible with this "
             "version of DCS Liberation.\n"
             "\n"
             f"{traceback.format_exc()}", QMessageBox.Ok)
         GameUpdateSignal.get_instance().updateGame(None)
Ejemplo n.º 25
0
    def repair_unit(self, group, unit, price):
        if self.game.budget > price:
            self.game.budget -= price
            group.units_losts = [u for u in group.units_losts if u.id != unit.id]
            group.units.append(unit)
            GameUpdateSignal.get_instance().updateGame(self.game)

            # Remove destroyed units in the vicinity
            destroyed_units = self.game.get_destroyed_units()
            for d in destroyed_units:
                p = Point(d["x"], d["z"])
                if p.distance_to_point(unit.position) < 15:
                    destroyed_units.remove(d)
                    logging.info("Removed destroyed units " + str(d))
            logging.info("Repaired unit : " + str(unit.id) + " " + str(unit.type))

        self.do_refresh_layout()
Ejemplo n.º 26
0
    def buySam(self):
        sam_generator = self.samCombo.itemData(self.samCombo.currentIndex())
        price = sam_generator.price - self.current_group_value
        if price > self.game.budget:
            self.error_money()
            return
        else:
            self.game.budget -= price

        # Generate SAM
        generator = sam_generator(self.game, self.ground_object)
        generator.generate()
        self.ground_object.groups = list(generator.groups)

        GameUpdateSignal.get_instance().updateBudget(self.game)

        self.changed.emit()
        self.close()
Ejemplo n.º 27
0
    def buyArmor(self):
        logging.info("Buying Armor ")
        utype = self.buyArmorCombo.itemData(self.buyArmorCombo.currentIndex())
        price = utype.price * self.amount.value() - self.current_group_value
        if price > self.game.budget:
            self.error_money()
            self.close()
            return
        else:
            self.game.budget -= price

        # Generate Armor
        group = generate_armor_group_of_type_and_size(
            self.game, self.ground_object, utype, int(self.amount.value())
        )
        self.ground_object.groups = [group]

        # Replan redfor missions
        self.game.initialize_turn(for_red=True, for_blue=False)

        GameUpdateSignal.get_instance().updateGame(self.game)
Ejemplo n.º 28
0
    def begin_runway_repair(self) -> None:
        if not self.can_afford_runway_repair:
            QMessageBox.critical(
                self,
                "Cannot repair runway",
                f"Runway repair costs ${db.RUNWAY_REPAIR_COST}M but you have "
                f"only ${self.game_model.game.budget}M available.",
                QMessageBox.Ok,
            )
            return
        if not self.can_repair_runway:
            QMessageBox.critical(
                self,
                "Cannot repair runway",
                f"Cannot repair this runway.",
                QMessageBox.Ok,
            )
            return

        self.cp.begin_runway_repair()
        self.game_model.game.budget -= db.RUNWAY_REPAIR_COST
        self.update_repair_button()
        self.update_intel_summary()
        GameUpdateSignal.get_instance().updateGame(self.game_model.game)
Ejemplo n.º 29
0
    def buyArmor(self):
        print("Buy Armor ")
        utype = self.buyArmorCombo.itemData(self.buyArmorCombo.currentIndex())
        print(utype)
        price = db.PRICES[utype] * self.amount.value(
        ) - self.current_group_value
        if price > self.game.budget:
            self.error_money()
            self.close()
            return
        else:
            self.game.budget -= price

        # Generate Armor
        group = generate_armor_group_of_type_and_size(self.game,
                                                      self.ground_object,
                                                      utype,
                                                      int(self.amount.value()))
        self.ground_object.groups = [group]

        GameUpdateSignal.get_instance().updateBudget(self.game)

        self.changed.emit()
        self.close()
Ejemplo n.º 30
0
    def change_map_package_selection(self, index: QModelIndex) -> None:
        if not index.isValid():
            GameUpdateSignal.get_instance().select_package(None)
            return

        package = self.ato_model.get_package_model(index)
        if package.rowCount() == 0:
            GameUpdateSignal.get_instance().select_package(None)
        else:
            GameUpdateSignal.get_instance().select_package(index.row())