diff --git a/changelog.md b/changelog.md index 9585f432..a1b4353b 100644 --- a/changelog.md +++ b/changelog.md @@ -1,19 +1,27 @@ -2.0 RC 6 --------- +#2.0 RC 6 -Features/Improvements : -* Supercarrier support (You have to go to settings to enable it, if you have the supercarrier module) -* Carrier ICLS channel will now be configured (check your briefing) -* When a base is captured, refill the "base defenses" group with units for the new owner. -* SAM units will spawn on RED Alarm state -* AI Flight planner now creates its own STRIKE flights -* Added performance settings to allow disabling : smoke, artillery strike, moving units, infantry, SAM alert mode. -* Added support for newest WW2 Units +Saves file from RC5 are not compatible with the new version. +Sorry :( -Fixes : +##Features/Improvements : + +* **[Units/Factions]** Supercarrier support (You have to go to settings to enable it, if you have the supercarrier module) +* **[Units/Factions]** Added 'Modern Bluefor' factions, containing all most popular DCS flyable units +* **[Units/Factions]** Factions US 2005 / 1990 will sometimes use Arleigh Burke instead of Perry as carrier escorts +* **[Units/Factions]** Added support for newest WW2 Units +* **[Campaign logic]** When a base is captured, refill the "base defenses" group with units for the new owner. +* **[Mission Generator]** Carrier ICLS channel will now be configured (check your briefing) +* **[Mission Generator]** SAM units will spawn on RED Alarm state +* **[Mission Generator]** AI Flight planner now creates its own STRIKE flights +* **[Mission Generator]** AI units assigned to Strike flight will now actually engage the buildings they have been assigned. +* **[Mission Generator]** Added performance settings to allow disabling : smoke, artillery strike, moving units, infantry, SAM Red alert mode. +* **[UX]** : Improved flight selection behaviour in the Mission Planning Window -* Fixed : CAS waypoints created from the "Predefined waypoint selector" would not be at the exact location of the frontline -* Fixed : Game generation does not work when "no night mission" settings was selected and the current time was "day" -* Fixed : Game generation does not work when the player selected faction has no AWACS -* Fixed : Base defenses would not be generated on normandy map -* Fixed : CAP mission flown from airbase are not named BARCAP anymore (CAP from carrier is still named BARCAP) +##Fixed issues : + +* **[Mission Generator]** Payloads were not correctly assigned in the release version. +* **[Mission Generator]** Game generation does not work when "no night mission" settings was selected and the current time was "day" +* **[Mission Generator]** Game generation does not work when the player selected faction has no AWACS +* **[Campaign Generator]** Base defenses would not be generated on Normandy map +* **[Mission Planning]** CAS waypoints created from the "Predefined waypoint selector" would not be at the exact location of the frontline +* **[Naming]** CAP mission flown from airbase are not named BARCAP anymore (CAP from carrier is still named BARCAP) diff --git a/game/factions/bluefor_modern.py b/game/factions/bluefor_modern.py index b694e5b0..0167291c 100644 --- a/game/factions/bluefor_modern.py +++ b/game/factions/bluefor_modern.py @@ -15,6 +15,7 @@ BLUEFOR_MODERN = { JF_17, M_2000C, F_5E_3, + Su_27, Su_25T, A_10A, diff --git a/qt_ui/main.py b/qt_ui/main.py index 7116ca98..b71975a8 100644 --- a/qt_ui/main.py +++ b/qt_ui/main.py @@ -21,12 +21,13 @@ if __name__ == "__main__": if os.path.exists(custom_payloads): dcs.planes.FlyingType.payload_dirs.append(custom_payloads) else: + # For release version the path is different. custom_payloads = os.path.join(os.path.dirname(os.path.realpath(__file__)), "resources\\customized_payloads") if os.path.exists(custom_payloads): dcs.planes.FlyingType.payload_dirs.append(custom_payloads) - VERSION_STRING = "2.0" + VERSION_STRING = "2.0RC6" logging_module.setup_version_string(VERSION_STRING) logging.info("Using {} as userdata folder".format(persistency.base_path())) diff --git a/qt_ui/windows/QNewGameWizard.py b/qt_ui/windows/QNewGameWizard.py index e3864502..01c95652 100644 --- a/qt_ui/windows/QNewGameWizard.py +++ b/qt_ui/windows/QNewGameWizard.py @@ -38,6 +38,7 @@ class NewGameWizard(QtWidgets.QWizard): isTerrainNttr = self.field("isTerrainNttr") isTerrainCaucasusSmall = self.field("isTerrainCaucasusSmall") isTerrainCaucasusSmallInverted = self.field("isTerrainCaucasusSmallInverted") + isTerrainCaucasusNorth= self.field("isTerrainCaucasusNorth") isIranianCampaignTheater = self.field("isIranianCampaignTheater") isTerrainNormandy = self.field("isTerrainNormandy") isTerrainEmirates = self.field("isTerrainEmirates") @@ -56,6 +57,8 @@ class NewGameWizard(QtWidgets.QWizard): conflicttheater = caucasus.WesternGeorgia() elif isTerrainCaucasusSmallInverted: conflicttheater = caucasus.WesternGeorgiaInverted() + elif isTerrainCaucasusNorth: + conflicttheater = caucasus.NorthCaucasus() elif isIranianCampaignTheater: conflicttheater = persiangulf.IranianCampaign() elif isTerrainEmirates: @@ -218,12 +221,14 @@ class TheaterConfiguration(QtWidgets.QWizardPage): # Terrain selection terrainGroup = QtWidgets.QGroupBox("Terrain") - terrainCaucasusSmall = QtWidgets.QRadioButton("Caucasus - Western Georgia [RECOMMENDED]") + terrainCaucasusSmall = QtWidgets.QRadioButton("Caucasus - Western Georgia [RECOMMENDED - Early Cold War Era]") terrainCaucasusSmall.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Caucasus"])) - terrainCaucasusSmallInverted = QtWidgets.QRadioButton("Caucasus - Western Georgia Inverted [RECOMMENDED]") + terrainCaucasusSmallInverted = QtWidgets.QRadioButton("Caucasus - Western Georgia Inverted [RECOMMENDED - Early Cold War Era]") terrainCaucasusSmallInverted.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Caucasus"])) terrainCaucasus = QtWidgets.QRadioButton("Caucasus - Full map [NOT TESTED]") terrainCaucasus.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Caucasus"])) + terrainCaucasusNorth = QtWidgets.QRadioButton("Caucasus - North - [RECOMMENDED - Modern Era]") + terrainCaucasusNorth.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Caucasus"])) terrainPg = QtWidgets.QRadioButton("Persian Gulf - Full Map [NOT TESTED]") terrainPg.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Persian_Gulf"])) @@ -250,6 +255,7 @@ class TheaterConfiguration(QtWidgets.QWizardPage): self.registerField('isTerrainCaucasus', terrainCaucasus) self.registerField('isTerrainCaucasusSmall', terrainCaucasusSmall) self.registerField('isTerrainCaucasusSmallInverted', terrainCaucasusSmallInverted) + self.registerField('isTerrainCaucasusNorth', terrainCaucasusNorth) self.registerField('isTerrainPg', terrainPg) self.registerField('isIranianCampaignTheater', terrainIran) self.registerField('isTerrainEmirates', terrainEmirates) @@ -261,6 +267,7 @@ class TheaterConfiguration(QtWidgets.QWizardPage): terrainGroupLayout = QtWidgets.QVBoxLayout() terrainGroupLayout.addWidget(terrainCaucasusSmall) terrainGroupLayout.addWidget(terrainCaucasusSmallInverted) + terrainGroupLayout.addWidget(terrainCaucasusNorth) terrainGroupLayout.addWidget(terrainCaucasus) terrainGroupLayout.addWidget(terrainIran) terrainGroupLayout.addWidget(terrainEmirates) diff --git a/resources/caulandmap.p b/resources/caulandmap.p index f07d541f..a13651d1 100644 Binary files a/resources/caulandmap.p and b/resources/caulandmap.p differ diff --git a/resources/tools/cau_terrain.miz b/resources/tools/cau_terrain.miz index 03674769..dc94b0d5 100644 Binary files a/resources/tools/cau_terrain.miz and b/resources/tools/cau_terrain.miz differ diff --git a/theater/caucasus.py b/theater/caucasus.py index b3a0e1d1..fa1e3d7f 100644 --- a/theater/caucasus.py +++ b/theater/caucasus.py @@ -73,11 +73,6 @@ class CaucasusTheater(ConflictTheater): self.carrier_1.captured = True self.batumi.captured = True - def add_controlpoint(self, point: ControlPoint, connected_to: typing.Collection[ControlPoint] = []): - point.name = " ".join(re.split(r"[ -]", point.name)[:1]) - - super(CaucasusTheater, self).add_controlpoint(point, connected_to=connected_to) - """ A smaller version of the caucasus map in western georgia. @@ -160,4 +155,51 @@ class WesternGeorgiaInverted(ConflictTheater): self.add_controlpoint(self.carrier_1) self.carrier_1.captured = True - self.sochi.captured = True \ No newline at end of file + self.sochi.captured = True + + + + +class NorthCaucasus(ConflictTheater): + terrain = caucasus.Caucasus() + overview_image = "caumap.gif" + reference_points = {(-317948.32727306, 635639.37385346): (278.5*4, 319*4), + (-355692.3067714, 617269.96285781): (263*4, 352*4), } + + landmap = load_landmap("resources\\caulandmap.p") + daytime_map = { + "dawn": (6, 9), + "day": (9, 18), + "dusk": (18, 20), + "night": (0, 5), + } + + carrier_1 = ControlPoint.carrier("Carrier", mapping.Point(-305810.6875, 406399.1875)) + + def __init__(self, load_ground_objects=True): + super(NorthCaucasus, self).__init__() + + self.kutaisi = ControlPoint.from_airport(caucasus.Kutaisi, LAND, SIZE_SMALL, IMPORTANCE_LOW) + self.soganlug = ControlPoint.from_airport(caucasus.Soganlug, LAND, SIZE_SMALL, IMPORTANCE_LOW) + self.maykop = ControlPoint.from_airport(caucasus.Maykop_Khanskaya, LAND, SIZE_LARGE, IMPORTANCE_HIGH) + self.beslan = ControlPoint.from_airport(caucasus.Beslan, LAND, SIZE_REGULAR, IMPORTANCE_LOW) + self.nalchik = ControlPoint.from_airport(caucasus.Nalchik, LAND, SIZE_REGULAR, 1.1) + self.mineralnye = ControlPoint.from_airport(caucasus.Mineralnye_Vody, LAND, SIZE_BIG, 1.3) + self.mozdok = ControlPoint.from_airport(caucasus.Mozdok, LAND, SIZE_BIG, 1.1) + self.carrier_1 = ControlPoint.carrier("Carrier", mapping.Point(-285810.6875, 496399.1875)) + + self.soganlug.frontline_offset = 0.5 + self.soganlug.base.strength = 1 + + self.add_controlpoint(self.kutaisi, connected_to=[self.soganlug]) + self.add_controlpoint(self.soganlug, connected_to=[self.beslan, self.kutaisi]) + self.add_controlpoint(self.beslan, connected_to=[self.soganlug, self.mozdok, self.nalchik]) + self.add_controlpoint(self.nalchik, connected_to=[self.beslan, self.mozdok, self.mineralnye]) + self.add_controlpoint(self.mozdok, connected_to=[self.nalchik, self.beslan, self.mineralnye]) + self.add_controlpoint(self.mineralnye, connected_to=[self.nalchik, self.mozdok, self.maykop]) + self.add_controlpoint(self.maykop, connected_to=[self.mineralnye]) + self.add_controlpoint(self.carrier_1, connected_to=[]) + + self.carrier_1.captured = True + self.soganlug.captured = True + self.kutaisi.captured = True