From 95fd4cab05e7b93a75215296789dc37b903f2a18 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Fri, 13 Nov 2020 21:00:55 -0800 Subject: [PATCH 1/6] Fix error box in flight creation. (cherry picked from commit a81254cd1830cd8ad57ac41de017d94e1c9eb0a5) --- qt_ui/windows/mission/flight/QFlightCreator.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/qt_ui/windows/mission/flight/QFlightCreator.py b/qt_ui/windows/mission/flight/QFlightCreator.py index 7b9808f7..ee4b3354 100644 --- a/qt_ui/windows/mission/flight/QFlightCreator.py +++ b/qt_ui/windows/mission/flight/QFlightCreator.py @@ -3,6 +3,7 @@ from typing import Optional from PySide2.QtCore import Qt, Signal from PySide2.QtWidgets import ( QDialog, + QMessageBox, QPushButton, QVBoxLayout, ) @@ -95,7 +96,8 @@ class QFlightCreator(QDialog): def create_flight(self) -> None: error = self.verify_form() if error is not None: - self.error_box("Could not create flight", error) + QMessageBox.critical(self, "Could not create flight", error, + QMessageBox.Ok) return task = self.task_selector.currentData() From 9e32ea74130798b9da370ad7c9a0d2a418c3df3c Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Fri, 13 Nov 2020 21:14:53 -0800 Subject: [PATCH 2/6] Handle inventory when selling aircraft. This still leaves a bit to be desired, namely that selling aircraft happens immediately but buying aircraft takes a turn. However, that's how this behaved before, so this restores the 2.1 behavior. Worth investigating further in the future. (cherry picked from commit 75769df8e2e149504ff5abe2889e315fa95f4f57) --- .../airfield/QAircraftRecruitmentMenu.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py index 2dbba2f3..a01aaaa9 100644 --- a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py +++ b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py @@ -6,6 +6,7 @@ from PySide2.QtWidgets import ( QGridLayout, QHBoxLayout, QLabel, + QMessageBox, QScrollArea, QVBoxLayout, QWidget, @@ -88,7 +89,21 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): super().buy(unit_type) self.hangar_status.update_label(self.total_units, self.cp.available_aircraft_slots) - def sell(self, unit_type): + def sell(self, unit_type: UnitType): + # Don't need to remove aircraft from the inventory if we're canceling + # orders. + if self.deliveryEvent.units.get(unit_type, 0) <= 0: + global_inventory = self.game_model.game.aircraft_inventory + inventory = global_inventory.for_control_point(self.cp) + try: + inventory.remove_aircraft(unit_type, 1) + except ValueError: + QMessageBox.critical( + self, "Could not sell aircraft", + f"Attempted to sell one {unit_type.id} at {self.cp.name} " + "but none are available. Are all aircraft currently " + "assigned to a mission?", QMessageBox.Ok) + return super().sell(unit_type) self.hangar_status.update_label(self.total_units, self.cp.available_aircraft_slots) From f29cb995305874120b4f76d43d466288e197f17a Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Sat, 14 Nov 2020 01:39:20 -0800 Subject: [PATCH 3/6] Update the README with a more recent screenshot. (cherry picked from commit ef84703da98f16771fe0adea1d4e23b35280e511) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d29644a7..4d51bd19 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,10 @@ ![GitHub stars](https://img.shields.io/github/stars/khopa/dcs_liberation?style=social) ## About DCS Liberation -DCS Liberation is a [DCS World](https://www.digitalcombatsimulator.com/en/products/world/) turn based single-player semi dynamic campaign. +DCS Liberation is a [DCS World](https://www.digitalcombatsimulator.com/en/products/world/) turn based single-player or co-op dynamic campaign. It is an external program that generates full and complex DCS missions and manage a persistent combat environment. -![Logo](https://imgur.com/B6tvlBJ.png) +![Logo](https://i.imgur.com/4hq0rLq.png) ## Downloads From 1f43fbe16eaca5373fc44c56271eb997524535e1 Mon Sep 17 00:00:00 2001 From: Khopa Date: Sat, 14 Nov 2020 14:17:07 +0100 Subject: [PATCH 4/6] A-20G won't level bomb unit groups --- gen/aircraft.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gen/aircraft.py b/gen/aircraft.py index d1e93e37..a2847ba3 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -1387,7 +1387,7 @@ class SeadIngressBuilder(PydcsWaypointBuilder): class StrikeIngressBuilder(PydcsWaypointBuilder): def build(self) -> MovingPoint: - if self.group.units[0].unit_type in [B_17G, A_20G, B_52H, Tu_22M3]: + if self.group.units[0].unit_type in [B_17G, B_52H, Tu_22M3]: return self.build_bombing() else: return self.build_strike() From 0b902e19ee95cca7a61022cf0255719843999080 Mon Sep 17 00:00:00 2001 From: Khopa Date: Sat, 14 Nov 2020 14:48:48 +0100 Subject: [PATCH 5/6] Adding Persian gulf started mizdata files before release --- .../persiangulf/Al Ain International Airport.miz | Bin 0 -> 8857 bytes resources/mizdata/persiangulf/Fujairah.miz | Bin 0 -> 9658 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/mizdata/persiangulf/Al Ain International Airport.miz create mode 100644 resources/mizdata/persiangulf/Fujairah.miz diff --git a/resources/mizdata/persiangulf/Al Ain International Airport.miz b/resources/mizdata/persiangulf/Al Ain International Airport.miz new file mode 100644 index 0000000000000000000000000000000000000000..810f634964d62ccc019169532976c8e27933c5c2 GIT binary patch literal 8857 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 Date: Sat, 14 Nov 2020 12:17:15 -0600 Subject: [PATCH 6/6] fixes viggen client waypoints Only one target waypoint created when flight is Viggen client flight. M Waypoints not explicitly set anymore (they don't need to be when waypoint has a TOT) --- gen/aircraft.py | 34 ++++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/gen/aircraft.py b/gen/aircraft.py index a2847ba3..7c4eac80 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -115,6 +115,11 @@ GERMAN_WW2_CHANNEL = MHz(40) HELICOPTER_CHANNEL = MHz(127) UHF_FALLBACK_CHANNEL = MHz(251) +TARGET_WAYPOINTS = ( + FlightWaypointType.TARGET_GROUP_LOC, + FlightWaypointType.TARGET_POINT, + FlightWaypointType.TARGET_SHIP, + ) # TODO: Get radio information for all the special cases. def get_fallback_channel(unit_type: UnitType) -> RadioFrequency: @@ -1142,12 +1147,28 @@ class AircraftConflictGenerator: flight.from_cp) self.set_takeoff_time(takeoff_point, package, flight, group) - filtered_points = [] + filtered_points = [] # type: List[FlightWaypoint] + for point in flight.points: if point.only_for_player and not flight.client_count: continue filtered_points.append(point) - + # Only add 1 target waypoint for Viggens. This only affects player flights, + # the Viggen can't have more than 9 waypoints which leaves us with two target point + # under the current flight plans. + # TODO: Make this smarter, it currently selects a random unit in the group for target, + # this could be updated to make it pick the "best" two targets in the group. + if flight.unit_type is AJS37 and flight.client_count: + viggen_target_points = [ + (idx, point) for idx, point in enumerate(filtered_points) if point.waypoint_type in TARGET_WAYPOINTS + ] + keep_target = viggen_target_points[random.randint(0, len(viggen_target_points) - 1)] + filtered_points = [ + point for idx, point in enumerate(filtered_points) if ( + point.waypoint_type not in TARGET_WAYPOINTS or idx == keep_target[0] + ) + ] + for idx, point in enumerate(filtered_points): PydcsWaypointBuilder.for_waypoint( point, group, package, flight, self.m @@ -1265,14 +1286,9 @@ class PydcsWaypointBuilder: """Viggen player aircraft consider any waypoint with a TOT set to be a target ("M") waypoint. If the flight is a player controlled Viggen flight, no TOT should be set on any waypoint except actual target waypoints. """ - target_waypoints = ( - FlightWaypointType.TARGET_GROUP_LOC, - FlightWaypointType.TARGET_POINT, - FlightWaypointType.TARGET_SHIP, - ) if ( (self.flight.client_count > 0 and self.flight.unit_type == AJS37) and - (self.waypoint.waypoint_type not in target_waypoints) + (self.waypoint.waypoint_type not in TARGET_WAYPOINTS) ): return True else: @@ -1285,8 +1301,6 @@ class PydcsWaypointBuilder: self.group.add_nav_target_point(t.position, "PP" + str(i + 1)) if self.group.units[0].unit_type == F_14B and i == 0: self.group.add_nav_target_point(t.position, "ST") - if self.group.units[0].unit_type == AJS37 and i < 9: - self.group.add_nav_target_point(t.position, "M" + str(i + 1)) class DefaultWaypointBuilder(PydcsWaypointBuilder):