mirror of
https://github.com/spencershepard/RotorOps.git
synced 2025-11-10 15:45:30 +00:00
advanced defenses feature
-allow disabling spinboxes in scenario config -enemy units with radar can be designated to deploy intercept fighters on detection -zone protect SAMs are now part of Advanced Defenses option -Harrier now available in player selection and template imports
This commit is contained in:
@@ -29,8 +29,8 @@ import qtmodern.windows
|
||||
|
||||
# UPDATE BUILD VERSION
|
||||
maj_version = 1
|
||||
minor_version = 2
|
||||
patch_version = 0
|
||||
minor_version = 3
|
||||
patch_version = 1
|
||||
|
||||
modules_version = 2
|
||||
modules_url = 'https://dcs-helicopters.com/user-files/modules/'
|
||||
@@ -421,6 +421,12 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
if qobj:
|
||||
qobj.setValue(config['spinboxes'][box])
|
||||
|
||||
for box in QObject.findChildren(self, QSpinBox):
|
||||
if 'disable_spinboxes' in config and config['disable_spinboxes'] is not None and box.objectName() in config['disable_spinboxes']:
|
||||
box.setEnabled(False)
|
||||
else:
|
||||
box.setEnabled(True)
|
||||
|
||||
for button in QObject.findChildren(self, QRadioButton):
|
||||
if 'radiobuttons' in config and button.objectName() in config['radiobuttons']:
|
||||
button.setChecked(True)
|
||||
@@ -570,7 +576,6 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
"game_display": self.game_status_checkBox.isChecked(),
|
||||
"defending": self.defense_checkBox.isChecked(),
|
||||
"slots": self.slot_template_comboBox.currentText(),
|
||||
"zone_protect_sams": self.zone_sams_checkBox.isChecked(),
|
||||
"zone_farps": self.farp_buttonGroup.checkedButton().objectName(),
|
||||
"e_transport_helos": self.e_transport_helos_spinBox.value(),
|
||||
"transport_drop_qty": self.troop_drop_spinBox.value(),
|
||||
@@ -588,6 +593,9 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
"logistics_farp_file": self.scenario.getConfigValue("logistics_farp_file", default=None),
|
||||
"zone_protect_file": self.scenario.getConfigValue("zone_protect_file", default=None),
|
||||
"script": self.scenario.getConfigValue("script", default=None),
|
||||
"advanced_defenses": self.advanced_defenses_checkBox.isChecked(),
|
||||
"red_cap": self.scenario.getConfigValue("red_cap", default=True),
|
||||
"blue_cap": self.scenario.getConfigValue("blue_cap", default=True),
|
||||
}
|
||||
|
||||
logger.info("Generating mission with options:")
|
||||
|
||||
@@ -34,20 +34,20 @@ class Ui_MainWindow(object):
|
||||
self.centralwidget = QtWidgets.QWidget(MainWindow)
|
||||
self.centralwidget.setObjectName("centralwidget")
|
||||
self.logistics_crates_checkBox = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.logistics_crates_checkBox.setGeometry(QtCore.QRect(980, 211, 251, 28))
|
||||
self.logistics_crates_checkBox.setGeometry(QtCore.QRect(980, 231, 251, 28))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(10)
|
||||
font.setBold(False)
|
||||
self.logistics_crates_checkBox.setFont(font)
|
||||
self.logistics_crates_checkBox.setChecked(True)
|
||||
self.logistics_crates_checkBox.setObjectName("logistics_crates_checkBox")
|
||||
self.zone_sams_checkBox = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.zone_sams_checkBox.setGeometry(QtCore.QRect(980, 320, 241, 28))
|
||||
self.advanced_defenses_checkBox = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.advanced_defenses_checkBox.setGeometry(QtCore.QRect(510, 350, 241, 28))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(10)
|
||||
font.setBold(False)
|
||||
self.zone_sams_checkBox.setFont(font)
|
||||
self.zone_sams_checkBox.setObjectName("zone_sams_checkBox")
|
||||
self.advanced_defenses_checkBox.setFont(font)
|
||||
self.advanced_defenses_checkBox.setObjectName("advanced_defenses_checkBox")
|
||||
self.red_forces_label = QtWidgets.QLabel(self.centralwidget)
|
||||
self.red_forces_label.setGeometry(QtCore.QRect(470, 80, 171, 27))
|
||||
font = QtGui.QFont()
|
||||
@@ -79,7 +79,7 @@ class Ui_MainWindow(object):
|
||||
self.description_textBrowser.setObjectName("description_textBrowser")
|
||||
self.defense_checkBox = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.defense_checkBox.setEnabled(True)
|
||||
self.defense_checkBox.setGeometry(QtCore.QRect(470, 130, 156, 28))
|
||||
self.defense_checkBox.setGeometry(QtCore.QRect(980, 140, 156, 28))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(11)
|
||||
font.setBold(False)
|
||||
@@ -109,7 +109,7 @@ class Ui_MainWindow(object):
|
||||
self.redforces_comboBox.setFont(font)
|
||||
self.redforces_comboBox.setObjectName("redforces_comboBox")
|
||||
self.scenario_label_8 = QtWidgets.QLabel(self.centralwidget)
|
||||
self.scenario_label_8.setGeometry(QtCore.QRect(570, 220, 271, 24))
|
||||
self.scenario_label_8.setGeometry(QtCore.QRect(570, 180, 271, 24))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(10)
|
||||
font.setBold(False)
|
||||
@@ -165,14 +165,14 @@ class Ui_MainWindow(object):
|
||||
self.version_label.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
|
||||
self.version_label.setObjectName("version_label")
|
||||
self.scenario_label_10 = QtWidgets.QLabel(self.centralwidget)
|
||||
self.scenario_label_10.setGeometry(QtCore.QRect(570, 260, 271, 24))
|
||||
self.scenario_label_10.setGeometry(QtCore.QRect(570, 220, 271, 24))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(10)
|
||||
font.setBold(False)
|
||||
self.scenario_label_10.setFont(font)
|
||||
self.scenario_label_10.setObjectName("scenario_label_10")
|
||||
self.e_transport_helos_spinBox = QtWidgets.QSpinBox(self.centralwidget)
|
||||
self.e_transport_helos_spinBox.setGeometry(QtCore.QRect(510, 260, 51, 31))
|
||||
self.e_transport_helos_spinBox.setGeometry(QtCore.QRect(510, 220, 51, 31))
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
@@ -187,7 +187,7 @@ class Ui_MainWindow(object):
|
||||
self.e_transport_helos_spinBox.setProperty("value", 1)
|
||||
self.e_transport_helos_spinBox.setObjectName("e_transport_helos_spinBox")
|
||||
self.e_attack_planes_spinBox = QtWidgets.QSpinBox(self.centralwidget)
|
||||
self.e_attack_planes_spinBox.setGeometry(QtCore.QRect(510, 220, 51, 31))
|
||||
self.e_attack_planes_spinBox.setGeometry(QtCore.QRect(510, 180, 51, 31))
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
@@ -202,7 +202,7 @@ class Ui_MainWindow(object):
|
||||
self.e_attack_planes_spinBox.setProperty("value", 1)
|
||||
self.e_attack_planes_spinBox.setObjectName("e_attack_planes_spinBox")
|
||||
self.e_attack_helos_spinBox = QtWidgets.QSpinBox(self.centralwidget)
|
||||
self.e_attack_helos_spinBox.setGeometry(QtCore.QRect(510, 180, 51, 31))
|
||||
self.e_attack_helos_spinBox.setGeometry(QtCore.QRect(510, 140, 51, 31))
|
||||
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
@@ -219,7 +219,7 @@ class Ui_MainWindow(object):
|
||||
self.e_attack_helos_spinBox.setProperty("value", 1)
|
||||
self.e_attack_helos_spinBox.setObjectName("e_attack_helos_spinBox")
|
||||
self.scenario_label_7 = QtWidgets.QLabel(self.centralwidget)
|
||||
self.scenario_label_7.setGeometry(QtCore.QRect(570, 180, 271, 24))
|
||||
self.scenario_label_7.setGeometry(QtCore.QRect(570, 140, 271, 24))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(10)
|
||||
font.setBold(False)
|
||||
@@ -239,7 +239,7 @@ class Ui_MainWindow(object):
|
||||
self.scenario_label_9.setFont(font)
|
||||
self.scenario_label_9.setObjectName("scenario_label_9")
|
||||
self.awacs_checkBox = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.awacs_checkBox.setGeometry(QtCore.QRect(980, 246, 241, 28))
|
||||
self.awacs_checkBox.setGeometry(QtCore.QRect(980, 266, 241, 28))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(10)
|
||||
font.setBold(False)
|
||||
@@ -247,7 +247,7 @@ class Ui_MainWindow(object):
|
||||
self.awacs_checkBox.setChecked(True)
|
||||
self.awacs_checkBox.setObjectName("awacs_checkBox")
|
||||
self.tankers_checkBox = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.tankers_checkBox.setGeometry(QtCore.QRect(980, 282, 241, 28))
|
||||
self.tankers_checkBox.setGeometry(QtCore.QRect(980, 302, 241, 28))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(10)
|
||||
font.setBold(False)
|
||||
@@ -277,14 +277,14 @@ class Ui_MainWindow(object):
|
||||
self.game_status_checkBox.setTristate(False)
|
||||
self.game_status_checkBox.setObjectName("game_status_checkBox")
|
||||
self.label = QtWidgets.QLabel(self.centralwidget)
|
||||
self.label.setGeometry(QtCore.QRect(570, 340, 261, 23))
|
||||
self.label.setGeometry(QtCore.QRect(570, 300, 261, 23))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(10)
|
||||
font.setBold(False)
|
||||
self.label.setFont(font)
|
||||
self.label.setObjectName("label")
|
||||
self.inf_spawn_spinBox = QtWidgets.QSpinBox(self.centralwidget)
|
||||
self.inf_spawn_spinBox.setGeometry(QtCore.QRect(510, 340, 51, 31))
|
||||
self.inf_spawn_spinBox.setGeometry(QtCore.QRect(510, 300, 51, 31))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(12)
|
||||
self.inf_spawn_spinBox.setFont(font)
|
||||
@@ -294,7 +294,7 @@ class Ui_MainWindow(object):
|
||||
self.inf_spawn_spinBox.setProperty("value", 0)
|
||||
self.inf_spawn_spinBox.setObjectName("inf_spawn_spinBox")
|
||||
self.troop_drop_spinBox = QtWidgets.QSpinBox(self.centralwidget)
|
||||
self.troop_drop_spinBox.setGeometry(QtCore.QRect(510, 300, 51, 31))
|
||||
self.troop_drop_spinBox.setGeometry(QtCore.QRect(510, 260, 51, 31))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(12)
|
||||
self.troop_drop_spinBox.setFont(font)
|
||||
@@ -312,14 +312,14 @@ class Ui_MainWindow(object):
|
||||
self.random_weather_checkBox.setTristate(False)
|
||||
self.random_weather_checkBox.setObjectName("random_weather_checkBox")
|
||||
self.label_3 = QtWidgets.QLabel(self.centralwidget)
|
||||
self.label_3.setGeometry(QtCore.QRect(570, 300, 281, 23))
|
||||
self.label_3.setGeometry(QtCore.QRect(570, 260, 281, 23))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(10)
|
||||
font.setBold(False)
|
||||
self.label_3.setFont(font)
|
||||
self.label_3.setObjectName("label_3")
|
||||
self.apcs_spawn_checkBox = QtWidgets.QCheckBox(self.centralwidget)
|
||||
self.apcs_spawn_checkBox.setGeometry(QtCore.QRect(980, 180, 251, 27))
|
||||
self.apcs_spawn_checkBox.setGeometry(QtCore.QRect(980, 200, 251, 27))
|
||||
font = QtGui.QFont()
|
||||
font.setPointSize(10)
|
||||
font.setBold(False)
|
||||
@@ -581,8 +581,8 @@ class Ui_MainWindow(object):
|
||||
MainWindow.setWindowTitle(_translate("MainWindow", "RotorOps Mission Generator"))
|
||||
self.logistics_crates_checkBox.setStatusTip(_translate("MainWindow", "Enable a base or FARP near the start position that can spawn CTLD crates for building ground units and air defenses. Sling load the logistics containers to create new logistics sites."))
|
||||
self.logistics_crates_checkBox.setText(_translate("MainWindow", "Logistics Base"))
|
||||
self.zone_sams_checkBox.setStatusTip(_translate("MainWindow", "Inactive conflict zones will be protected by SAMs. When a zone is cleared, SAMs at next active zone will be destroyed. No effect if Blue on defense."))
|
||||
self.zone_sams_checkBox.setText(_translate("MainWindow", "Protect Inactive Zones"))
|
||||
self.advanced_defenses_checkBox.setStatusTip(_translate("MainWindow", "Each enemy conflict zone spawns a template of AA defenses and radar units that may spawn fighter intercepts for detected aircraft. A good difficulty multiplier for multiplayer."))
|
||||
self.advanced_defenses_checkBox.setText(_translate("MainWindow", "Enemy Advanced Defenses"))
|
||||
self.red_forces_label.setText(_translate("MainWindow", "Red Forces:"))
|
||||
self.scenario_comboBox.setStatusTip(_translate("MainWindow", "Tip: You can create your own templates that include mission options like kneeboards, briefings, weather, static units, triggers, scripts, etc."))
|
||||
self.description_textBrowser.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>980</x>
|
||||
<y>211</y>
|
||||
<y>231</y>
|
||||
<width>251</width>
|
||||
<height>28</height>
|
||||
</rect>
|
||||
@@ -75,11 +75,11 @@
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QCheckBox" name="zone_sams_checkBox">
|
||||
<widget class="QCheckBox" name="advanced_defenses_checkBox">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>980</x>
|
||||
<y>320</y>
|
||||
<x>510</x>
|
||||
<y>350</y>
|
||||
<width>241</width>
|
||||
<height>28</height>
|
||||
</rect>
|
||||
@@ -91,10 +91,10 @@
|
||||
</font>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string>Inactive conflict zones will be protected by SAMs. When a zone is cleared, SAMs at next active zone will be destroyed. No effect if Blue on defense.</string>
|
||||
<string>Each enemy conflict zone spawns a template of AA defenses and radar units that may spawn fighter intercepts for detected aircraft. A good difficulty multiplier for multiplayer.</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Protect Inactive Zones</string>
|
||||
<string>Enemy Advanced Defenses</string>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QLabel" name="red_forces_label">
|
||||
@@ -190,8 +190,8 @@ p, li { white-space: pre-wrap; }
|
||||
</property>
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>470</x>
|
||||
<y>130</y>
|
||||
<x>980</x>
|
||||
<y>140</y>
|
||||
<width>156</width>
|
||||
<height>28</height>
|
||||
</rect>
|
||||
@@ -271,7 +271,7 @@ p, li { white-space: pre-wrap; }
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>570</x>
|
||||
<y>220</y>
|
||||
<y>180</y>
|
||||
<width>271</width>
|
||||
<height>24</height>
|
||||
</rect>
|
||||
@@ -438,7 +438,7 @@ p, li { white-space: pre-wrap; }
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>570</x>
|
||||
<y>260</y>
|
||||
<y>220</y>
|
||||
<width>271</width>
|
||||
<height>24</height>
|
||||
</rect>
|
||||
@@ -460,7 +460,7 @@ p, li { white-space: pre-wrap; }
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>510</x>
|
||||
<y>260</y>
|
||||
<y>220</y>
|
||||
<width>51</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
@@ -496,7 +496,7 @@ p, li { white-space: pre-wrap; }
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>510</x>
|
||||
<y>220</y>
|
||||
<y>180</y>
|
||||
<width>51</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
@@ -532,7 +532,7 @@ p, li { white-space: pre-wrap; }
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>510</x>
|
||||
<y>180</y>
|
||||
<y>140</y>
|
||||
<width>51</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
@@ -574,7 +574,7 @@ p, li { white-space: pre-wrap; }
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>570</x>
|
||||
<y>180</y>
|
||||
<y>140</y>
|
||||
<width>271</width>
|
||||
<height>24</height>
|
||||
</rect>
|
||||
@@ -633,7 +633,7 @@ p, li { white-space: pre-wrap; }
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>980</x>
|
||||
<y>246</y>
|
||||
<y>266</y>
|
||||
<width>241</width>
|
||||
<height>28</height>
|
||||
</rect>
|
||||
@@ -658,7 +658,7 @@ p, li { white-space: pre-wrap; }
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>980</x>
|
||||
<y>282</y>
|
||||
<y>302</y>
|
||||
<width>241</width>
|
||||
<height>28</height>
|
||||
</rect>
|
||||
@@ -758,7 +758,7 @@ p, li { white-space: pre-wrap; }
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>570</x>
|
||||
<y>340</y>
|
||||
<y>300</y>
|
||||
<width>261</width>
|
||||
<height>23</height>
|
||||
</rect>
|
||||
@@ -780,7 +780,7 @@ p, li { white-space: pre-wrap; }
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>510</x>
|
||||
<y>340</y>
|
||||
<y>300</y>
|
||||
<width>51</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
@@ -810,7 +810,7 @@ p, li { white-space: pre-wrap; }
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>510</x>
|
||||
<y>300</y>
|
||||
<y>260</y>
|
||||
<width>51</width>
|
||||
<height>31</height>
|
||||
</rect>
|
||||
@@ -867,7 +867,7 @@ p, li { white-space: pre-wrap; }
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>570</x>
|
||||
<y>300</y>
|
||||
<y>260</y>
|
||||
<width>281</width>
|
||||
<height>23</height>
|
||||
</rect>
|
||||
@@ -889,7 +889,7 @@ p, li { white-space: pre-wrap; }
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>980</x>
|
||||
<y>180</y>
|
||||
<y>200</y>
|
||||
<width>251</width>
|
||||
<height>27</height>
|
||||
</rect>
|
||||
|
||||
@@ -74,14 +74,14 @@ def triggerSetup(rops, options):
|
||||
# dcs.action.DoScript(dcs.action.String("ctld.createRadioBeaconAtZone('" + c_zone + "','blue', 1440,'" + c_zone + "')")))
|
||||
# rops.m.triggerrules.triggers.append(trig)
|
||||
|
||||
# Zone protection SAMs
|
||||
if options["zone_protect_sams"]:
|
||||
for index, zone_name in enumerate(rops.conflict_zones):
|
||||
z_sams_trig = dcs.triggers.TriggerOnce(comment="Deactivate " + zone_name + " SAMs")
|
||||
z_sams_trig.rules.append(dcs.condition.FlagEquals(game_flag, index + 1))
|
||||
z_sams_trig.actions.append(dcs.action.DoScript(
|
||||
dcs.action.String("Group.destroy(Group.getByName('Static " + zone_name + " Protection SAM'))")))
|
||||
rops.m.triggerrules.triggers.append(z_sams_trig)
|
||||
# # Zone protection SAMs
|
||||
# if options["zone_protect_sams"]:
|
||||
# for index, zone_name in enumerate(rops.conflict_zones):
|
||||
# z_sams_trig = dcs.triggers.TriggerOnce(comment="Deactivate " + zone_name + " SAMs")
|
||||
# z_sams_trig.rules.append(dcs.condition.FlagEquals(game_flag, index + 1))
|
||||
# z_sams_trig.actions.append(dcs.action.DoScript(
|
||||
# dcs.action.String("Group.destroy(Group.getByName('" + zone_name + " Protect Static'))")))
|
||||
# rops.m.triggerrules.triggers.append(z_sams_trig)
|
||||
|
||||
# Deactivate zone FARPs and player slots in defensive mode:
|
||||
# this will also deactivate players already in the air.
|
||||
@@ -178,24 +178,31 @@ def triggerSetup(rops, options):
|
||||
dcs.action.String("RotorOps.spawnTranspHelos(8," + str(options["transport_drop_qty"]) + ")")))
|
||||
rops.m.triggerrules.triggers.append(z_weak_trig)
|
||||
|
||||
# Add enemy CAP spawn trigger
|
||||
cap_trig = dcs.triggers.TriggerContinious(comment="Spawn Enemy CAP")
|
||||
cap_trig.rules.append(dcs.condition.TimeAfter(10))
|
||||
cap_trig.rules.append(dcs.condition.Predicate(dcs.action.String("return RotorOps.predSpawnRedCap()")))
|
||||
cap_trig.actions.append(dcs.action.DoScript(dcs.action.String("RotorOps.deployFighters()")))
|
||||
rops.m.triggerrules.triggers.append(cap_trig)
|
||||
|
||||
# Add game won/lost triggers
|
||||
|
||||
|
||||
# Add game won triggers
|
||||
trig = dcs.triggers.TriggerOnce(comment="RotorOps Conflict WON")
|
||||
trig.rules.append(dcs.condition.FlagEquals(game_flag, 99))
|
||||
# Add game won triggers
|
||||
trig = dcs.triggers.TriggerOnce(comment="RotorOps Conflict WON")
|
||||
trig.rules.append(dcs.condition.FlagEquals(game_flag, 99))
|
||||
trig.actions.append(
|
||||
dcs.action.DoScript(dcs.action.String("---Add an action you want to happen when the game is WON")))
|
||||
if options["end_trigger"] is not False:
|
||||
trig.actions.append(
|
||||
dcs.action.DoScript(dcs.action.String("---Add an action you want to happen when the game is WON")))
|
||||
if options["end_trigger"] is not False:
|
||||
trig.actions.append(
|
||||
dcs.action.DoScript(dcs.action.String("RotorOps.gameMsg(RotorOps.gameMsgs.success)")))
|
||||
rops.m.triggerrules.triggers.append(trig)
|
||||
dcs.action.DoScript(dcs.action.String("RotorOps.gameMsg(RotorOps.gameMsgs.success)")))
|
||||
rops.m.triggerrules.triggers.append(trig)
|
||||
|
||||
# Add game lost triggers
|
||||
trig = dcs.triggers.TriggerOnce(comment="RotorOps Conflict LOST")
|
||||
trig.rules.append(dcs.condition.FlagEquals(game_flag, 98))
|
||||
trig.actions.append(
|
||||
dcs.action.DoScript(dcs.action.String("---Add an action you want to happen when the game is LOST")))
|
||||
if options["end_trigger"] is not False:
|
||||
trig.actions.append(dcs.action.DoScript(dcs.action.String("RotorOps.gameMsg(RotorOps.gameMsgs.failure)")))
|
||||
rops.m.triggerrules.triggers.append(trig)
|
||||
# Add game lost triggers
|
||||
trig = dcs.triggers.TriggerOnce(comment="RotorOps Conflict LOST")
|
||||
trig.rules.append(dcs.condition.FlagEquals(game_flag, 98))
|
||||
trig.actions.append(
|
||||
dcs.action.DoScript(dcs.action.String("---Add an action you want to happen when the game is LOST")))
|
||||
if options["end_trigger"] is not False:
|
||||
trig.actions.append(dcs.action.DoScript(dcs.action.String("RotorOps.gameMsg(RotorOps.gameMsgs.failure)")))
|
||||
rops.m.triggerrules.triggers.append(trig)
|
||||
@@ -126,6 +126,7 @@ class ImportObjects:
|
||||
group.units[0].heading)
|
||||
|
||||
# ng.units[0].livery_id = group.units[0].livery_id
|
||||
ng.units[0].name = dest_name + " " + group.units[i].name
|
||||
new_groups.append(ng)
|
||||
|
||||
else:
|
||||
@@ -211,6 +212,7 @@ class ImportObjects:
|
||||
group.units[0].heading)
|
||||
unit_count = unit_count + 1
|
||||
# new_group.units[0].livery_id = group.units[0].livery_id
|
||||
new_group.units[0].name = dest_name + " " + group.units[i].name
|
||||
|
||||
else:
|
||||
|
||||
|
||||
@@ -32,6 +32,10 @@ class RotorOpsMission:
|
||||
self.res_map = {}
|
||||
self.config = None # not used
|
||||
self.imports = None
|
||||
self.red_zones = {}
|
||||
self.blue_zones = {}
|
||||
self.primary_e_airport = None
|
||||
|
||||
|
||||
class RotorOpsZone:
|
||||
def __init__(self, name: str, flag: int, position: dcs.point, size: int):
|
||||
@@ -215,11 +219,11 @@ class RotorOpsMission:
|
||||
elif zone.name.rfind("SPAWN") >= 0:
|
||||
self.addZone(self.spawn_zones, self.RotorOpsZone(zone.name, None, zone.position, zone.radius))
|
||||
|
||||
blue_zones = self.staging_zones
|
||||
red_zones = self.conflict_zones
|
||||
self.blue_zones = self.staging_zones
|
||||
self.red_zones = self.conflict_zones
|
||||
if options["defending"]:
|
||||
blue_zones = self.conflict_zones
|
||||
red_zones = self.staging_zones
|
||||
self.blue_zones = self.conflict_zones
|
||||
self.red_zones = self.staging_zones
|
||||
# swap airport sides
|
||||
self.swapSides(options)
|
||||
|
||||
@@ -229,119 +233,10 @@ class RotorOpsMission:
|
||||
if options["player_hotstart"]:
|
||||
start_type = dcs.mission.StartType.Warm
|
||||
|
||||
# Adds vehicles as a single group (for easy late activation), and helicopters if enabled in settings
|
||||
# def addZoneFARP(_zone_name, country, file):
|
||||
#
|
||||
# farp_flag = self.m.find_group(_zone_name)
|
||||
#
|
||||
# if farp_flag:
|
||||
# farp_position = farp_flag.units[0].position
|
||||
# farp_heading = farp_flag.units[0].heading
|
||||
# else:
|
||||
# farp_position = self.all_zones[_zone_name].position
|
||||
# farp_heading = 0
|
||||
#
|
||||
# # Add the basic invisible farp object
|
||||
# farp = self.m.farp(self.m.country(country), _zone_name + " FARP", farp_position,
|
||||
# hidden=False, dead=False,
|
||||
# farp_type=dcs.unit.InvisibleFARP)
|
||||
#
|
||||
# # Use alternate template file if it has been defined in scenario config
|
||||
# if options["zone_farp_file"]:
|
||||
#
|
||||
# for i in imports:
|
||||
# if i.filename.removesuffix('.miz') == options["zone_farp_file"]:
|
||||
# file = i.path
|
||||
# # if multiple files found, we want the latest file to override the first
|
||||
#
|
||||
# i = ImportObjects(file)
|
||||
# i.anchorByGroupName("ANCHOR")
|
||||
# farp_group = i.copyVehiclesAsGroup(self.m, country, _zone_name + " FARP Static", farp_position,
|
||||
# farp_heading)
|
||||
# # Add client helicopters
|
||||
# if options["farp_spawns"]:
|
||||
# helicopter_groups = i.copyHelicopters(self.m, jtf_blue, "ZONE " + _zone_name + " EMPTY ", farp_position, farp_heading)
|
||||
# for group in helicopter_groups:
|
||||
# self.all_zones[_zone_name].player_helo_spawns.append(group)
|
||||
#
|
||||
# return farp_group
|
||||
|
||||
# # Adds statics, vehicles, and helicopters. Late activation is not possible
|
||||
# def addLogisticsZone(_zone_name, country, file, config_name, helicopters=False):
|
||||
# flag = self.m.find_group(_zone_name)
|
||||
# if flag:
|
||||
# position = flag.units[0].position
|
||||
# heading = flag.units[0].heading
|
||||
# else:
|
||||
# position = self.all_zones[_zone_name].position
|
||||
# heading = 0
|
||||
#
|
||||
# # Use alternate template file if it has been defined in scenario config
|
||||
# if options[config_name]:
|
||||
#
|
||||
# for i in imports:
|
||||
# if i.filename.removesuffix('.miz') == options[config_name]:
|
||||
# file = i.path
|
||||
# # if multiple files found, we want the latest file to override the first
|
||||
#
|
||||
# # Import statics and vehicles
|
||||
# i = ImportObjects(file)
|
||||
# i.anchorByGroupName("ANCHOR")
|
||||
# i.copyStatics(self.m, country, _zone_name + " Logistics Zone",
|
||||
# position, heading)
|
||||
# i.copyVehicles(self.m, country, _zone_name + " Logistics Zone",
|
||||
# position, heading)
|
||||
#
|
||||
# # Add client helicopters
|
||||
# if helicopters:
|
||||
# helicopter_groups = i.copyHelicopters(self.m, jtf_blue, "ZONE " + _zone_name + " EMPTY ", position,
|
||||
# heading)
|
||||
# for group in helicopter_groups:
|
||||
# self.all_zones[_zone_name].player_helo_spawns.append(group)
|
||||
|
||||
# Adds statics, vehicles, and helicopters (if enabled). Late activation is not possible.
|
||||
# def addDefensiveFARP(_zone_name, country, file):
|
||||
#
|
||||
# farp_flag = self.m.find_group(_zone_name)
|
||||
#
|
||||
# if farp_flag:
|
||||
# farp_position = farp_flag.units[0].position
|
||||
# farp_heading = farp_flag.units[0].heading
|
||||
# else:
|
||||
# farp_position = self.all_zones[_zone_name].position
|
||||
# farp_heading = 0
|
||||
#
|
||||
# # Add the basic invisible farp object
|
||||
# farp = self.m.farp(self.m.country(country), _zone_name + " FARP", farp_position,
|
||||
# hidden=False, dead=False,
|
||||
# farp_type=dcs.unit.InvisibleFARP)
|
||||
#
|
||||
# # Use alternate template file if it has been defined in scenario config
|
||||
# if options["defensive_farp_file"]:
|
||||
#
|
||||
# for i in imports:
|
||||
# if i.filename.removesuffix('.miz') == options["defensive_farp_file"]:
|
||||
# file = i.path
|
||||
# # if multiple files found, we want the latest file to override the first
|
||||
#
|
||||
# # Import statics and vehicles
|
||||
# i = ImportObjects(file)
|
||||
# i.anchorByGroupName("ANCHOR")
|
||||
# i.copyStatics(self.m, country, _zone_name + " Logistics Zone",
|
||||
# farp_position, farp_heading)
|
||||
# i.copyVehicles(self.m, country, _zone_name + " Logistics Zone",
|
||||
# farp_position, farp_heading)
|
||||
#
|
||||
# # Import player helicopters
|
||||
# if options["farp_spawns"]:
|
||||
# helicopter_groups = i.copyHelicopters(self.m, jtf_blue, "ZONE " + _zone_name + " EMPTY ", farp_position,
|
||||
# farp_heading)
|
||||
# for group in helicopter_groups:
|
||||
# self.all_zones[_zone_name].player_helo_spawns.append(group)
|
||||
|
||||
for zone_name in red_zones:
|
||||
for zone_name in self.red_zones:
|
||||
if red_forces["vehicles"]:
|
||||
self.addGroundGroups(red_zones[zone_name], self.m.country(jtf_red), red_forces["vehicles"],
|
||||
self.addGroundGroups(self.red_zones[zone_name], self.m.country(jtf_red), red_forces["vehicles"],
|
||||
options["red_quantity"])
|
||||
|
||||
if options["zone_farps"] != "farp_never" and not options["defending"]:
|
||||
@@ -367,34 +262,21 @@ class RotorOpsMission:
|
||||
)
|
||||
vehicle_group.late_activation = True
|
||||
|
||||
# For SAMs: Add vehicles as a single group (for easy late activation)
|
||||
if options["zone_protect_sams"]:
|
||||
|
||||
if options["advanced_defenses"]:
|
||||
sam_group = self.addZoneBase(options, zone_name, jtf_red,
|
||||
file=zone_protect,
|
||||
config_name="zone_protect_file",
|
||||
copy_vehicles=True,
|
||||
vehicles_name=zone_name + " Protect Static",
|
||||
vehicles_single_group=True
|
||||
vehicles_name=zone_name + " Defense Static",
|
||||
vehicles_single_group=False
|
||||
)
|
||||
# farp_flag = self.m.find_group(zone_name)
|
||||
#
|
||||
# if farp_flag:
|
||||
# farp_position = farp_flag.units[0].position
|
||||
# farp_heading = farp_flag.units[0].heading
|
||||
# else:
|
||||
# farp_position = self.all_zones[zone_name].position
|
||||
# farp_heading = 0
|
||||
#
|
||||
# i = ImportObjects(zone_protect)
|
||||
# i.anchorByGroupName("ANCHOR")
|
||||
# farp_group = i.copyVehiclesAsGroup(self.m, jtf_red, "Static " + zone_name + " Protection SAM",
|
||||
# farp_position,
|
||||
# farp_heading)
|
||||
|
||||
|
||||
# Populate Blue zones with ground units
|
||||
for i, zone_name in enumerate(blue_zones):
|
||||
for i, zone_name in enumerate(self.blue_zones):
|
||||
if blue_forces["vehicles"]:
|
||||
self.addGroundGroups(blue_zones[zone_name], self.m.country(jtf_blue), blue_forces["vehicles"],
|
||||
self.addGroundGroups(self.blue_zones[zone_name], self.m.country(jtf_blue), blue_forces["vehicles"],
|
||||
options["blue_quantity"])
|
||||
|
||||
# Add blue zone FARPS (not late activated) for defensive mode
|
||||
@@ -404,7 +286,7 @@ class RotorOpsMission:
|
||||
if options["farp_spawns"]:
|
||||
helicopters = True
|
||||
|
||||
if options["crates"] and i == len(blue_zones) - 1:
|
||||
if options["crates"] and i == len(self.blue_zones) - 1:
|
||||
# add a logistics zone to the last conflict zone
|
||||
# addLogisticsZone(zone_name, jtf_blue, logistics_farp, "logistics_farp_file", helicopters)
|
||||
self.addZoneBase(options, zone_name, jtf_blue,
|
||||
@@ -458,7 +340,9 @@ class RotorOpsMission:
|
||||
|
||||
# Add player slots
|
||||
window.statusBar().showMessage("Adding flights to mission...", 10000)
|
||||
if options["slots"] != "Locked to Scenario" and options["slots"] != "None":
|
||||
if options["slots"] == "Locked to Scenario" or options["slots"] == "None":
|
||||
pass
|
||||
else:
|
||||
self.addPlayerHelos(options)
|
||||
|
||||
# Add AI Flights
|
||||
@@ -728,7 +612,7 @@ class RotorOpsMission:
|
||||
for helicopter in dcs.helicopters.helicopter_map:
|
||||
if helicopter == options["slots"]:
|
||||
client_helos = [dcs.helicopters.helicopter_map[
|
||||
helicopter]] # if out ui slot option matches a specific helicopter type name
|
||||
helicopter]] # if our ui slot option matches a specific helicopter type name
|
||||
|
||||
# get loadouts from miz file and put into a simple dict
|
||||
default_loadouts = {}
|
||||
@@ -782,6 +666,8 @@ class RotorOpsMission:
|
||||
helotype = None
|
||||
if helicopter_id in dcs.helicopters.helicopter_map:
|
||||
helotype = dcs.helicopters.helicopter_map[helicopter_id]
|
||||
elif helicopter_id in dcs.planes.plane_map:
|
||||
helotype = dcs.planes.plane_map[helicopter_id]
|
||||
else:
|
||||
continue
|
||||
if carrier:
|
||||
@@ -871,7 +757,7 @@ class RotorOpsMission:
|
||||
heading = enemy_heading + random.randrange(70, 110)
|
||||
race_dist = random.randrange(40 * 1000, 80 * 1000)
|
||||
center_pt = dcs.mapping.point_from_heading(friendly_pt.x, friendly_pt.y,
|
||||
enemy_heading - random.randrange(140, 220), 10000)
|
||||
enemy_heading - random.randrange(140, 220), 20000)
|
||||
pt1 = dcs.mapping.point_from_heading(center_pt[0], center_pt[1], enemy_heading - 90,
|
||||
random.randrange(20 * 1000, 40 * 1000))
|
||||
return dcs.mapping.Point(pt1[0], pt1[1], terrain), heading, race_dist
|
||||
@@ -882,6 +768,7 @@ class RotorOpsMission:
|
||||
friendly_airports, primary_f_airport = self.getCoalitionAirports("blue")
|
||||
enemy_airports, primary_e_airport = self.getCoalitionAirports("red")
|
||||
|
||||
|
||||
# find enemy carriers and farps
|
||||
carrier = self.m.country(jtf_red).find_ship_group(name="HELO_CARRIER")
|
||||
if not carrier:
|
||||
@@ -901,6 +788,27 @@ class RotorOpsMission:
|
||||
primary_f_airport.position.y
|
||||
)
|
||||
|
||||
self.primary_e_airport = primary_e_airport
|
||||
self.m.triggers.add_triggerzone(primary_e_airport.position, 1500, hidden=True, name="RED_AIRBASE")
|
||||
|
||||
if options["red_cap"]:
|
||||
scenario_red_cap_spawn_zone = None
|
||||
for zone in self.m.triggers.zones():
|
||||
if zone.name == "RED_CAP_SPAWN":
|
||||
scenario_red_cap_spawn_zone = True
|
||||
if not scenario_red_cap_spawn_zone:
|
||||
e_cap_spawn_point = primary_e_airport.position.point_from_heading(e_airport_heading, 100000)
|
||||
self.m.triggers.add_triggerzone(e_cap_spawn_point, 30000, hidden=True, name="RED_CAP_SPAWN")
|
||||
|
||||
if options["blue_cap"]:
|
||||
scenario_blue_cap_spawn_zone = None
|
||||
for zone in self.m.triggers.zones():
|
||||
if zone.name == "BLUE_CAP_SPAWN":
|
||||
scenario_blue_cap_spawn_zone = True
|
||||
if not scenario_blue_cap_spawn_zone:
|
||||
f_cap_spawn_point = primary_f_airport.position.point_from_heading(e_airport_heading + 180, 100000)
|
||||
self.m.triggers.add_triggerzone(f_cap_spawn_point, 30000, hidden=True, name="BLUE_CAP_SPAWN")
|
||||
|
||||
if options["f_awacs"]:
|
||||
awacs_name = "AWACS"
|
||||
awacs_freq = 266
|
||||
@@ -987,6 +895,7 @@ class RotorOpsMission:
|
||||
t1_freq) + ".00 " + t1_tac + "\n" + t2_name + " " + str(t2_freq) + ".00 " + t2_tac + "\n\n"
|
||||
self.m.set_description_text(briefing)
|
||||
|
||||
|
||||
def zone_attack(fg, airport):
|
||||
fg.set_skill(dcs.unit.Skill.High)
|
||||
fg.late_activation = True
|
||||
@@ -1118,6 +1027,139 @@ class RotorOpsMission:
|
||||
unit.pylons = source_helo.pylons
|
||||
unit.livery_id = source_helo.livery_id
|
||||
|
||||
if False:
|
||||
for i in range(1,4):
|
||||
randzone = random.choice(list(self.red_zones))
|
||||
pt2 = self.red_zones[randzone].position
|
||||
source_plane = None
|
||||
if red_forces["fighter_planes"]:
|
||||
source_group = random.choice(red_forces["fighter_planes"])
|
||||
source_plane = source_group.units[0]
|
||||
plane_type = source_plane.unit_type
|
||||
group_size = random.randrange(1, 2)
|
||||
|
||||
else:
|
||||
group_size = random.randrange(1, 2)
|
||||
plane_type = random.choice(RotorOpsUnits.e_attack_helos)
|
||||
|
||||
airport = self.getParking(primary_e_airport, plane_type, enemy_airports, group_size)
|
||||
|
||||
enemy_cap = self.m.patrol_flight(airport=airport,
|
||||
name="Enemy CAP " + str(i),
|
||||
country=combinedJointTaskForcesRed,
|
||||
patrol_type=plane_type,
|
||||
pos1=primary_e_airport.position,
|
||||
pos2=pt2,
|
||||
altitude=3000,
|
||||
group_size=group_size,
|
||||
max_engage_distance=40 * 1000
|
||||
)
|
||||
|
||||
# enemy_cap.points[0].tasks[0] = dcs.task.EngageTargets(max_engage_distance, [dcs.task.Targets.All.Air.Planes])
|
||||
|
||||
for unit in enemy_cap.units:
|
||||
unit.skill = dcs.unit.Skill.Random
|
||||
|
||||
if source_plane:
|
||||
for unit in enemy_cap.units:
|
||||
unit.pylons = source_plane.pylons
|
||||
unit.livery_id = source_plane.livery_id
|
||||
|
||||
if options["red_cap"]:
|
||||
|
||||
if red_forces["fighter_planes"]:
|
||||
for fighter_plane_group in red_forces["fighter_planes"]:
|
||||
source_group = random.choice(red_forces["fighter_planes"])
|
||||
source_plane = source_group.units[0]
|
||||
plane_type = source_plane.unit_type
|
||||
|
||||
enemy_cap = self.m.flight_group(
|
||||
country=combinedJointTaskForcesRed,
|
||||
name="RED CAP",
|
||||
aircraft_type=plane_type,
|
||||
airport=None,
|
||||
maintask=dcs.task.CAP,
|
||||
group_size=1,
|
||||
position=e_cap_spawn_point,
|
||||
altitude=5000,
|
||||
speed=300
|
||||
)
|
||||
|
||||
enemy_cap.late_activation = True
|
||||
|
||||
for unit in enemy_cap.units:
|
||||
unit.skill = dcs.unit.Skill.Random
|
||||
unit.pylons = source_plane.pylons
|
||||
unit.livery_id = source_plane.livery_id
|
||||
|
||||
else:
|
||||
plane_type = random.choice(RotorOpsUnits.e_fighter_planes)
|
||||
|
||||
enemy_cap = self.m.flight_group(
|
||||
country=combinedJointTaskForcesRed,
|
||||
name="RED CAP",
|
||||
aircraft_type=plane_type,
|
||||
airport=None,
|
||||
maintask=dcs.task.CAP,
|
||||
group_size=1,
|
||||
position=e_cap_spawn_point,
|
||||
altitude=5000,
|
||||
speed=300
|
||||
)
|
||||
|
||||
enemy_cap.late_activation = True
|
||||
|
||||
for unit in enemy_cap.units:
|
||||
unit.skill = dcs.unit.Skill.Random
|
||||
|
||||
if options["blue_cap"]:
|
||||
|
||||
if blue_forces["fighter_planes"]:
|
||||
for fighter_plane_group in blue_forces["fighter_planes"]:
|
||||
source_group = random.choice(blue_forces["fighter_planes"])
|
||||
source_plane = source_group.units[0]
|
||||
plane_type = source_plane.unit_type
|
||||
|
||||
friendly_cap = self.m.flight_group(
|
||||
country=combinedJointTaskForcesBlue,
|
||||
name="BLUE CAP",
|
||||
aircraft_type=plane_type,
|
||||
airport=None,
|
||||
maintask=dcs.task.CAP,
|
||||
group_size=1,
|
||||
position=f_cap_spawn_point,
|
||||
altitude=5000,
|
||||
speed=300
|
||||
)
|
||||
|
||||
friendly_cap.late_activation = True
|
||||
|
||||
for unit in friendly_cap.units:
|
||||
unit.skill = dcs.unit.Skill.Random
|
||||
unit.pylons = source_plane.pylons
|
||||
unit.livery_id = source_plane.livery_id
|
||||
|
||||
else:
|
||||
plane_type = random.choice(RotorOpsUnits.f_fighter_planes)
|
||||
|
||||
friendly_cap = self.m.flight_group(
|
||||
country=combinedJointTaskForcesBlue,
|
||||
name="BLUE CAP",
|
||||
aircraft_type=plane_type,
|
||||
airport=None,
|
||||
maintask=dcs.task.CAP,
|
||||
group_size=1,
|
||||
position=f_cap_spawn_point,
|
||||
altitude=5000,
|
||||
speed=300
|
||||
)
|
||||
|
||||
friendly_cap.late_activation = True
|
||||
|
||||
for unit in friendly_cap.units:
|
||||
unit.skill = dcs.unit.Skill.Random
|
||||
|
||||
|
||||
def importObjects(self, data):
|
||||
|
||||
imports = data["objects"]["imports"]
|
||||
|
||||
@@ -20,6 +20,7 @@ player_helos = [
|
||||
dcs.helicopters.SA342Mistral,
|
||||
dcs.helicopters.UH_1H,
|
||||
aircraftMods.UH_60L,
|
||||
dcs.planes.AV8BNA,
|
||||
]
|
||||
|
||||
e_attack_helos = [
|
||||
@@ -39,6 +40,14 @@ e_attack_planes = [
|
||||
dcs.planes.A_10C,
|
||||
]
|
||||
|
||||
e_fighter_planes = [
|
||||
dcs.planes.Su_27,
|
||||
]
|
||||
|
||||
f_fighter_planes = [
|
||||
dcs.planes.FA_18C_hornet,
|
||||
]
|
||||
|
||||
e_zone_sams = [
|
||||
dcs.vehicles.AirDefence.Strela_10M3,
|
||||
]
|
||||
Binary file not shown.
Reference in New Issue
Block a user