mirror of
https://github.com/spencershepard/RotorOps.git
synced 2025-11-10 15:45:30 +00:00
Apache update
-UI update with QTmodern library -mist lua script updated and modified to deal with ED bug on Unit.getGroupsByName returning dead units -pydcs updated with Apache -pydcs update fixes 'transportable' mission editor bug
This commit is contained in:
@@ -2,18 +2,26 @@ import math
|
||||
import sys
|
||||
import os
|
||||
import dcs
|
||||
from PyQt5.QtCore import QCoreApplication
|
||||
from PyQt5.uic.properties import QtCore
|
||||
|
||||
import RotorOpsMission as ROps
|
||||
import RotorOpsUtils
|
||||
import RotorOpsUnits
|
||||
import logging
|
||||
import json
|
||||
import yaml
|
||||
import requests
|
||||
|
||||
from PyQt5.QtWidgets import (
|
||||
QApplication, QDialog, QMainWindow, QMessageBox
|
||||
)
|
||||
from PyQt5 import QtGui
|
||||
from PyQt5 import Qt, QtCore
|
||||
from MissionGeneratorUI import Ui_MainWindow
|
||||
|
||||
import qtmodern.styles
|
||||
import qtmodern.windows
|
||||
|
||||
#Setup logfile and exception handler
|
||||
logger = logging.getLogger(__name__)
|
||||
@@ -21,6 +29,30 @@ logging.basicConfig(filename='generator.log', encoding='utf-8', level=logging.DE
|
||||
handler = logging.StreamHandler(stream=sys.stdout)
|
||||
logger.addHandler(handler)
|
||||
|
||||
user_files_url = 'https://dcs-helicopters.com/user-files/'
|
||||
|
||||
class directories:
|
||||
home_dir = scenarios = forces = scripts = sound = output = assets = imports = None
|
||||
|
||||
@classmethod
|
||||
def find(cls):
|
||||
current_dir = os.getcwd()
|
||||
if os.path.basename(os.getcwd()) == "Generator":
|
||||
os.chdir("..")
|
||||
cls.home_dir = os.getcwd()
|
||||
cls.scenarios = cls.home_dir + "\Generator\Scenarios"
|
||||
cls.forces = cls.home_dir + "\Generator\Forces"
|
||||
cls.scripts = cls.home_dir
|
||||
cls.sound = cls.home_dir + "\sound\embedded"
|
||||
cls.output = cls.home_dir + "\Generator\Output"
|
||||
cls.assets = cls.home_dir + "\Generator/assets"
|
||||
cls.imports = cls.home_dir + "\Generator\Imports"
|
||||
os.chdir(current_dir)
|
||||
|
||||
|
||||
directories.find()
|
||||
|
||||
|
||||
def handle_exception(exc_type, exc_value, exc_traceback):
|
||||
if issubclass(exc_type, KeyboardInterrupt): #example of handling error subclasses
|
||||
sys.__excepthook__(exc_type, exc_value, exc_traceback)
|
||||
@@ -36,8 +68,8 @@ def handle_exception(exc_type, exc_value, exc_traceback):
|
||||
sys.excepthook = handle_exception
|
||||
|
||||
|
||||
maj_version = 0
|
||||
minor_version = 6
|
||||
maj_version = 1
|
||||
minor_version = 1
|
||||
version_string = str(maj_version) + "." + str(minor_version)
|
||||
scenarios = []
|
||||
red_forces_files = []
|
||||
@@ -55,8 +87,8 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
|
||||
if getattr(sys, 'frozen', False) and hasattr(sys, '_MEIPASS'):
|
||||
logger.info('running in a PyInstaller bundle')
|
||||
home_dir = os.getcwd()
|
||||
os.chdir(home_dir + "/Generator")
|
||||
qtmodern.styles._STYLESHEET = directories.assets + '/style.qss'
|
||||
qtmodern.windows._FL_STYLESHEET = directories.assets + '/frameless.qss'
|
||||
else:
|
||||
logger.info('running in a normal Python process')
|
||||
|
||||
@@ -69,9 +101,9 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
self.populateForces("blue", self.blueforces_comboBox, blue_forces_files)
|
||||
self.populateSlotSelection()
|
||||
|
||||
self.blue_forces_label.setText(attackers_text)
|
||||
self.red_forces_label.setText(defenders_text)
|
||||
self.background_label.setPixmap(QtGui.QPixmap(self.m.assets_dir + "/background.PNG"))
|
||||
# self.blue_forces_label.setText(attackers_text)
|
||||
# self.red_forces_label.setText(defenders_text)
|
||||
self.background_label.setPixmap(QtGui.QPixmap(directories.assets + "/rotorops-dkgray.png"))
|
||||
self.statusbar.setStyleSheet(
|
||||
"QStatusBar{padding-left:5px;color:black;font-weight:bold;}")
|
||||
|
||||
@@ -82,9 +114,11 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
self.action_generateMission.triggered.connect(self.generateMissionAction)
|
||||
self.action_scenarioSelected.triggered.connect(self.scenarioChanged)
|
||||
self.action_defensiveModeChanged.triggered.connect(self.defensiveModeChanged)
|
||||
self.action_nextScenario.triggered.connect(self.nextScenario)
|
||||
self.action_prevScenario.triggered.connect(self.prevScenario)
|
||||
|
||||
def populateScenarios(self):
|
||||
os.chdir(self.m.scenarios_dir)
|
||||
os.chdir(directories.scenarios)
|
||||
path = os.getcwd()
|
||||
dir_list = os.listdir(path)
|
||||
logger.info("Looking for mission files in " + path)
|
||||
@@ -95,8 +129,8 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
self.scenario_comboBox.addItem(filename.removesuffix('.miz'))
|
||||
|
||||
def populateForces(self, side, combobox, files_list):
|
||||
os.chdir(self.m.home_dir)
|
||||
os.chdir(self.m.forces_dir + "/" + side)
|
||||
os.chdir(directories.home_dir)
|
||||
os.chdir(directories.forces + "/" + side)
|
||||
path = os.getcwd()
|
||||
dir_list = os.listdir(path)
|
||||
logger.info("Looking for " + side + " Forces files in '" + path)
|
||||
@@ -113,15 +147,16 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
self.slot_template_comboBox.addItem("None")
|
||||
|
||||
def defensiveModeChanged(self):
|
||||
if self.defense_checkBox.isChecked():
|
||||
self.red_forces_label.setText(attackers_text)
|
||||
self.blue_forces_label.setText(defenders_text)
|
||||
else:
|
||||
self.red_forces_label.setText(defenders_text)
|
||||
self.blue_forces_label.setText(attackers_text)
|
||||
# if self.defense_checkBox.isChecked():
|
||||
# self.red_forces_label.setText(attackers_text)
|
||||
# self.blue_forces_label.setText(defenders_text)
|
||||
# else:
|
||||
# self.red_forces_label.setText(defenders_text)
|
||||
# self.blue_forces_label.setText(attackers_text)
|
||||
|
||||
self.applyScenarioConfig()
|
||||
|
||||
|
||||
def loadScenarioConfig(self, filename):
|
||||
try:
|
||||
j = open(filename)
|
||||
@@ -165,7 +200,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
|
||||
|
||||
def scenarioChanged(self):
|
||||
os.chdir(self.m.scenarios_dir)
|
||||
os.chdir(directories.scenarios)
|
||||
filename = scenarios[self.scenario_comboBox.currentIndex()]
|
||||
source_mission = dcs.mission.Mission()
|
||||
source_mission.load_file(filename)
|
||||
@@ -228,12 +263,22 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
+ source_mission.description_text()
|
||||
)
|
||||
|
||||
path = directories.scenarios + "/" + filename.removesuffix(".miz") + ".jpg"
|
||||
if os.path.isfile(path):
|
||||
self.missionImage.setPixmap(QtGui.QPixmap(path))
|
||||
else:
|
||||
self.missionImage.setPixmap(QtGui.QPixmap(directories.assets + "/briefing1.png"))
|
||||
|
||||
|
||||
|
||||
|
||||
def generateMissionAction(self):
|
||||
red_forces_filename = red_forces_files[self.redforces_comboBox.currentIndex()]
|
||||
blue_forces_filename = blue_forces_files[self.blueforces_comboBox.currentIndex()]
|
||||
scenario_filename = scenarios[self.scenario_comboBox.currentIndex()]
|
||||
source = "offline"
|
||||
data = {
|
||||
"source": source,
|
||||
"scenario_filename": scenario_filename,
|
||||
"red_forces_filename": red_forces_filename,
|
||||
"blue_forces_filename": blue_forces_filename,
|
||||
@@ -258,7 +303,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
"transport_drop_qty": self.troop_drop_spinBox.value(),
|
||||
"smoke_pickup_zones": self.smoke_pickup_zone_checkBox.isChecked(),
|
||||
}
|
||||
os.chdir(self.m.home_dir + '/Generator')
|
||||
os.chdir(directories.home_dir + '/Generator')
|
||||
n = ROps.RotorOpsMission()
|
||||
result = n.generateMission(data)
|
||||
logger.info("Generating mission with options:")
|
||||
@@ -274,7 +319,7 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
msg = QMessageBox()
|
||||
msg.setWindowTitle("Mission Generated")
|
||||
msg.setText("Awesome, your mission is ready! It's located in this directory: \n" +
|
||||
self.m.output_dir + "\n" +
|
||||
directories.output + "\n" +
|
||||
"\n" +
|
||||
"Next, you should use the DCS Mission Editor to fine tune unit placements. Don't be afraid to edit the missions that this generator produces. \n" +
|
||||
"\n" +
|
||||
@@ -294,13 +339,74 @@ class Window(QMainWindow, Ui_MainWindow):
|
||||
msg.setText(result["failure_msg"])
|
||||
x = msg.exec_()
|
||||
|
||||
def prevScenario(self):
|
||||
self.scenario_comboBox.setCurrentIndex((self.scenario_comboBox.currentIndex() - 1))
|
||||
|
||||
def nextScenario(self):
|
||||
self.scenario_comboBox.setCurrentIndex((self.scenario_comboBox.currentIndex() + 1))
|
||||
|
||||
def loadOnlineContent(self):
|
||||
url = user_files_url + 'directory.yaml'
|
||||
r = requests.get(url, allow_redirects=False)
|
||||
user_files = yaml.safe_load(r.content)
|
||||
count = 0
|
||||
#todo: try/catch/fail here
|
||||
|
||||
# Download scenarios files
|
||||
os.chdir(directories.scenarios)
|
||||
if user_files["scenarios"]["files"]:
|
||||
for filename in user_files["scenarios"]["files"]:
|
||||
url = user_files_url + user_files["scenarios"]["dir"] + '/' + filename
|
||||
r = requests.get(url, allow_redirects=False)
|
||||
open(filename, 'wb').write(r.content)
|
||||
count = count + 1
|
||||
|
||||
|
||||
# Download blue forces files
|
||||
os.chdir(directories.forces + '/blue')
|
||||
if user_files["forces_blue"]["files"]:
|
||||
for filename in user_files["forces_blue"]["files"]:
|
||||
url = user_files_url + user_files["forces_blue"]["dir"] + '/' + filename
|
||||
r = requests.get(url, allow_redirects=False)
|
||||
open(filename, 'wb').write(r.content)
|
||||
count = count + 1
|
||||
|
||||
# Download red forces files
|
||||
os.chdir(directories.forces + '/red')
|
||||
if user_files["forces_red"]["files"]:
|
||||
for filename in user_files["forces_red"]["files"]:
|
||||
url = user_files_url + user_files["forces_red"]["dir"] + '/' + filename
|
||||
r = requests.get(url, allow_redirects=False)
|
||||
open(filename, 'wb').write(r.content)
|
||||
count = count + 1
|
||||
|
||||
# Download imports files
|
||||
os.chdir(directories.imports)
|
||||
if user_files["imports"]["files"]:
|
||||
for filename in user_files["imports"]["files"]:
|
||||
url = user_files_url + user_files["imports"]["dir"] + '/' + filename
|
||||
r = requests.get(url, allow_redirects=False)
|
||||
open(filename, 'wb').write(r.content)
|
||||
count = count + 1
|
||||
|
||||
msg = QMessageBox()
|
||||
msg.setWindowTitle("Downloaded Files")
|
||||
msg.setText("We've downloaded " + str(count) + " new files!")
|
||||
x = msg.exec_()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1"
|
||||
|
||||
app = QApplication(sys.argv)
|
||||
# QCoreApplication.setAttribute(QtCore.Qt.AA_DisableHighDpiScaling)
|
||||
win = Window()
|
||||
win.show()
|
||||
# win.show()
|
||||
# win.loadOnlineContent()
|
||||
|
||||
|
||||
qtmodern.styles.dark(app)
|
||||
mw = qtmodern.windows.ModernWindow(win)
|
||||
mw.show()
|
||||
sys.exit(app.exec())
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user