mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
New Game Wizard with Qt UI
This commit is contained in:
parent
b66bf4cc36
commit
dc91f5004e
125
game/db.py
125
game/db.py
@ -99,6 +99,10 @@ PRICES = {
|
|||||||
E_3A: 8,
|
E_3A: 8,
|
||||||
C_130: 8,
|
C_130: 8,
|
||||||
|
|
||||||
|
# WW2
|
||||||
|
P_51D_30_NA: 3,
|
||||||
|
P_51D: 3,
|
||||||
|
|
||||||
# armor
|
# armor
|
||||||
Armor.APC_MTLB: 4,
|
Armor.APC_MTLB: 4,
|
||||||
Armor.ARV_MTLB_U_BOMAN: 5,
|
Armor.ARV_MTLB_U_BOMAN: 5,
|
||||||
@ -187,9 +191,12 @@ UNIT_BY_TASK = {
|
|||||||
F_14B,
|
F_14B,
|
||||||
F_16C_bl_52d,
|
F_16C_bl_52d,
|
||||||
M_2000C,
|
M_2000C,
|
||||||
Mirage_2000_5
|
Mirage_2000_5,
|
||||||
|
P_51D_30_NA,
|
||||||
|
P_51D
|
||||||
],
|
],
|
||||||
CAS: [
|
CAS: [
|
||||||
|
F_86F_Sabre,
|
||||||
MiG_15bis,
|
MiG_15bis,
|
||||||
MiG_19P,
|
MiG_19P,
|
||||||
L_39ZA,
|
L_39ZA,
|
||||||
@ -379,76 +386,46 @@ country : DCS Country name
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
FACTIONS = {
|
FACTIONS = {
|
||||||
"Russia 2010": {
|
|
||||||
"country": "Russia",
|
|
||||||
"side":"red",
|
|
||||||
"units": [
|
|
||||||
AJS37,
|
|
||||||
MiG_23MLD,
|
|
||||||
Su_25,
|
|
||||||
Su_27,
|
|
||||||
Su_33,
|
|
||||||
MiG_21Bis,
|
|
||||||
MiG_29A,
|
|
||||||
MiG_29S,
|
|
||||||
|
|
||||||
Su_25T,
|
"Russia 1955": {
|
||||||
Su_34,
|
"country": "Russia",
|
||||||
Su_24MR,
|
"side": "red",
|
||||||
L_39ZA,
|
"units": [
|
||||||
|
MiG_15bis,
|
||||||
|
|
||||||
IL_76MD,
|
IL_76MD,
|
||||||
IL_78M,
|
IL_78M,
|
||||||
An_26B,
|
An_26B,
|
||||||
An_30M,
|
An_30M,
|
||||||
Yak_40,
|
Yak_40,
|
||||||
A_50,
|
|
||||||
|
|
||||||
Ka_50,
|
|
||||||
SA342M,
|
|
||||||
UH_1H,
|
|
||||||
Mi_8MT,
|
|
||||||
|
|
||||||
AirDefence.SPAAA_ZSU_23_4_Shilka,
|
|
||||||
AirDefence.SAM_SA_9_Strela_1_9P31,
|
|
||||||
AirDefence.SAM_SA_8_Osa_9A33,
|
|
||||||
AirDefence.AAA_ZU_23_Closed,
|
AirDefence.AAA_ZU_23_Closed,
|
||||||
AirDefence.SAM_SA_19_Tunguska_2S6,
|
|
||||||
AirDefence.SAM_SA_6_Kub_LN_2P25,
|
AirDefence.SAM_SA_6_Kub_LN_2P25,
|
||||||
AirDefence.SAM_SA_3_S_125_LN_5P73,
|
AirDefence.SAM_SA_3_S_125_LN_5P73,
|
||||||
AirDefence.SAM_SA_11_Buk_LN_9A310M1,
|
|
||||||
|
|
||||||
Armor.APC_BTR_80,
|
|
||||||
Armor.MBT_T_90,
|
|
||||||
Armor.MBT_T_80U,
|
|
||||||
Armor.MBT_T_72B,
|
|
||||||
|
|
||||||
|
Armor.ARV_BRDM_2,
|
||||||
|
Armor.ARV_MTLB_U_BOMAN,
|
||||||
|
Armor.APC_MTLB,
|
||||||
|
Armor.MBT_T_55,
|
||||||
|
|
||||||
Unarmed.Transport_Ural_375,
|
Unarmed.Transport_Ural_375,
|
||||||
Unarmed.Transport_UAZ_469,
|
Unarmed.Transport_UAZ_469,
|
||||||
Infantry.Soldier_AK,
|
Infantry.Soldier_AK,
|
||||||
|
|
||||||
CV_1143_5_Admiral_Kuznetsov,
|
CV_1143_5_Admiral_Kuznetsov,
|
||||||
Bulk_cargo_ship_Yakushev,
|
Bulk_cargo_ship_Yakushev,
|
||||||
Dry_cargo_ship_Ivanov,
|
Dry_cargo_ship_Ivanov,
|
||||||
Tanker_Elnya_160,
|
Tanker_Elnya_160
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
"Russia 1988": {
|
"Russia 1965": {
|
||||||
"country": "Russia",
|
"country": "Russia",
|
||||||
"side": "red",
|
"side": "red",
|
||||||
"units": [
|
"units": [
|
||||||
|
MiG_15bis,
|
||||||
MiG_23MLD,
|
MiG_19P,
|
||||||
MiG_25PD,
|
MiG_21Bis,
|
||||||
MiG_29A,
|
|
||||||
MiG_29S,
|
|
||||||
MiG_31,
|
|
||||||
Su_27,
|
|
||||||
|
|
||||||
Su_24M,
|
|
||||||
Su_24MR,
|
|
||||||
Su_25,
|
|
||||||
|
|
||||||
IL_76MD,
|
IL_76MD,
|
||||||
IL_78M,
|
IL_78M,
|
||||||
@ -459,7 +436,6 @@ FACTIONS = {
|
|||||||
A_50,
|
A_50,
|
||||||
|
|
||||||
Mi_8MT,
|
Mi_8MT,
|
||||||
Mi_24V,
|
|
||||||
|
|
||||||
AirDefence.AAA_ZU_23_Closed,
|
AirDefence.AAA_ZU_23_Closed,
|
||||||
AirDefence.SAM_SA_6_Kub_LN_2P25,
|
AirDefence.SAM_SA_6_Kub_LN_2P25,
|
||||||
@ -467,6 +443,7 @@ FACTIONS = {
|
|||||||
|
|
||||||
Armor.ARV_BRDM_2,
|
Armor.ARV_BRDM_2,
|
||||||
Armor.APC_BTR_80,
|
Armor.APC_BTR_80,
|
||||||
|
Armor.ARV_BTR_RD,
|
||||||
Armor.IFV_BMD_1,
|
Armor.IFV_BMD_1,
|
||||||
Armor.IFV_BMP_1,
|
Armor.IFV_BMP_1,
|
||||||
Armor.MBT_T_55,
|
Armor.MBT_T_55,
|
||||||
@ -528,13 +505,21 @@ FACTIONS = {
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
"Russia 1965": {
|
"Russia 1988": {
|
||||||
"country": "Russia",
|
"country": "Russia",
|
||||||
"side": "red",
|
"side": "red",
|
||||||
"units": [
|
"units": [
|
||||||
MiG_15bis,
|
|
||||||
MiG_19P,
|
MiG_23MLD,
|
||||||
MiG_21Bis,
|
MiG_25PD,
|
||||||
|
MiG_29A,
|
||||||
|
MiG_29S,
|
||||||
|
MiG_31,
|
||||||
|
Su_27,
|
||||||
|
|
||||||
|
Su_24M,
|
||||||
|
Su_24MR,
|
||||||
|
Su_25,
|
||||||
|
|
||||||
IL_76MD,
|
IL_76MD,
|
||||||
IL_78M,
|
IL_78M,
|
||||||
@ -545,6 +530,7 @@ FACTIONS = {
|
|||||||
A_50,
|
A_50,
|
||||||
|
|
||||||
Mi_8MT,
|
Mi_8MT,
|
||||||
|
Mi_24V,
|
||||||
|
|
||||||
AirDefence.AAA_ZU_23_Closed,
|
AirDefence.AAA_ZU_23_Closed,
|
||||||
AirDefence.SAM_SA_6_Kub_LN_2P25,
|
AirDefence.SAM_SA_6_Kub_LN_2P25,
|
||||||
@ -552,7 +538,6 @@ FACTIONS = {
|
|||||||
|
|
||||||
Armor.ARV_BRDM_2,
|
Armor.ARV_BRDM_2,
|
||||||
Armor.APC_BTR_80,
|
Armor.APC_BTR_80,
|
||||||
Armor.ARV_BTR_RD,
|
|
||||||
Armor.IFV_BMD_1,
|
Armor.IFV_BMD_1,
|
||||||
Armor.IFV_BMP_1,
|
Armor.IFV_BMP_1,
|
||||||
Armor.MBT_T_55,
|
Armor.MBT_T_55,
|
||||||
@ -568,35 +553,53 @@ FACTIONS = {
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
"Russia 1955": {
|
"Russia 2010": {
|
||||||
"country": "Russia",
|
"country": "Russia",
|
||||||
"side": "red",
|
"side":"red",
|
||||||
"units": [
|
"units": [
|
||||||
MiG_15bis,
|
AJS37,
|
||||||
|
MiG_23MLD,
|
||||||
|
Su_25,
|
||||||
|
Su_27,
|
||||||
|
Su_33,
|
||||||
|
MiG_29S,
|
||||||
|
|
||||||
|
Su_25T,
|
||||||
|
Su_34,
|
||||||
|
Su_24MR,
|
||||||
|
L_39ZA,
|
||||||
|
|
||||||
IL_76MD,
|
IL_76MD,
|
||||||
IL_78M,
|
IL_78M,
|
||||||
An_26B,
|
An_26B,
|
||||||
An_30M,
|
An_30M,
|
||||||
Yak_40,
|
Yak_40,
|
||||||
|
A_50,
|
||||||
|
|
||||||
|
Ka_50,
|
||||||
|
Mi_8MT,
|
||||||
|
|
||||||
|
AirDefence.SPAAA_ZSU_23_4_Shilka,
|
||||||
|
AirDefence.SAM_SA_9_Strela_1_9P31,
|
||||||
|
AirDefence.SAM_SA_8_Osa_9A33,
|
||||||
AirDefence.AAA_ZU_23_Closed,
|
AirDefence.AAA_ZU_23_Closed,
|
||||||
|
AirDefence.SAM_SA_19_Tunguska_2S6,
|
||||||
AirDefence.SAM_SA_6_Kub_LN_2P25,
|
AirDefence.SAM_SA_6_Kub_LN_2P25,
|
||||||
AirDefence.SAM_SA_3_S_125_LN_5P73,
|
AirDefence.SAM_SA_3_S_125_LN_5P73,
|
||||||
|
AirDefence.SAM_SA_11_Buk_LN_9A310M1,
|
||||||
|
|
||||||
Armor.ARV_BRDM_2,
|
Armor.APC_BTR_80,
|
||||||
Armor.ARV_MTLB_U_BOMAN,
|
Armor.MBT_T_90,
|
||||||
Armor.APC_MTLB,
|
Armor.MBT_T_80U,
|
||||||
Armor.MBT_T_55,
|
Armor.MBT_T_72B,
|
||||||
|
|
||||||
Unarmed.Transport_Ural_375,
|
Unarmed.Transport_Ural_375,
|
||||||
Unarmed.Transport_UAZ_469,
|
Unarmed.Transport_UAZ_469,
|
||||||
Infantry.Soldier_AK,
|
Infantry.Soldier_AK,
|
||||||
|
|
||||||
CV_1143_5_Admiral_Kuznetsov,
|
CV_1143_5_Admiral_Kuznetsov,
|
||||||
Bulk_cargo_ship_Yakushev,
|
Bulk_cargo_ship_Yakushev,
|
||||||
Dry_cargo_ship_Ivanov,
|
Dry_cargo_ship_Ivanov,
|
||||||
Tanker_Elnya_160
|
Tanker_Elnya_160,
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@ -86,10 +86,6 @@ PLAYER_BUDGET_BASE = 14
|
|||||||
PLAYER_BUDGET_IMPORTANCE_LOG = 2
|
PLAYER_BUDGET_IMPORTANCE_LOG = 2
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class Game:
|
class Game:
|
||||||
settings = None # type: Settings
|
settings = None # type: Settings
|
||||||
budget = PLAYER_BUDGET_INITIAL
|
budget = PLAYER_BUDGET_INITIAL
|
||||||
|
|||||||
@ -14,7 +14,7 @@ if __name__ == "__main__":
|
|||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
|
|
||||||
# Splash screen setup
|
# Splash screen setup
|
||||||
pixmap = QPixmap("../resources/ui/splash_screen.png")
|
pixmap = QPixmap("./resources/ui/splash_screen.png")
|
||||||
splash = QSplashScreen(pixmap)
|
splash = QSplashScreen(pixmap)
|
||||||
splash.show()
|
splash.show()
|
||||||
|
|
||||||
|
|||||||
@ -36,18 +36,22 @@ ICONS: Dict[str, QPixmap] = {}
|
|||||||
|
|
||||||
def load_icons():
|
def load_icons():
|
||||||
|
|
||||||
ICONS["New"] = QPixmap("../resources/ui/misc/new.png")
|
ICONS["New"] = QPixmap("./resources/ui/misc/new.png")
|
||||||
ICONS["Open"] = QPixmap("../resources/ui/misc/open.png")
|
ICONS["Open"] = QPixmap("./resources/ui/misc/open.png")
|
||||||
ICONS["Save"] = QPixmap("../resources/ui/misc/save.png")
|
ICONS["Save"] = QPixmap("./resources/ui/misc/save.png")
|
||||||
|
|
||||||
ICONS["Dawn"] = QPixmap("../resources/ui/daytime/dawn.png")
|
ICONS["Terrain_Caucasus"] = QPixmap("./resources/ui/terrain_caucasus.gif")
|
||||||
ICONS["Day"] = QPixmap("../resources/ui/daytime/day.png")
|
ICONS["Terrain_Persian_Gulf"] = QPixmap("./resources/ui/terrain_pg.gif")
|
||||||
ICONS["Dusk"] = QPixmap("../resources/ui/daytime/dusk.png")
|
ICONS["Terrain_Nevada"] = QPixmap("./resources/ui/terrain_nevada.gif")
|
||||||
ICONS["Night"] = QPixmap("../resources/ui/daytime/night.png")
|
|
||||||
ICONS["Money"] = QPixmap("../resources/ui/misc/money_icon.png")
|
|
||||||
ICONS["Ordnance"] = QPixmap("../resources/ui/misc/ordnance_icon.png")
|
|
||||||
|
|
||||||
ICONS["target"] = QPixmap("../resources/ui/ground_assets/target.png")
|
ICONS["Dawn"] = QPixmap("./resources/ui/daytime/dawn.png")
|
||||||
ICONS["cleared"] = QPixmap("../resources/ui/ground_assets/cleared.png")
|
ICONS["Day"] = QPixmap("./resources/ui/daytime/day.png")
|
||||||
|
ICONS["Dusk"] = QPixmap("./resources/ui/daytime/dusk.png")
|
||||||
|
ICONS["Night"] = QPixmap("./resources/ui/daytime/night.png")
|
||||||
|
ICONS["Money"] = QPixmap("./resources/ui/misc/money_icon.png")
|
||||||
|
ICONS["Ordnance"] = QPixmap("./resources/ui/misc/ordnance_icon.png")
|
||||||
|
|
||||||
|
ICONS["target"] = QPixmap("./resources/ui/ground_assets/target.png")
|
||||||
|
ICONS["cleared"] = QPixmap("./resources/ui/ground_assets/cleared.png")
|
||||||
for category in CATEGORY_MAP.keys():
|
for category in CATEGORY_MAP.keys():
|
||||||
ICONS[category] = QPixmap("../resources/ui/ground_assets/" + category + ".png")
|
ICONS[category] = QPixmap("./resources/ui/ground_assets/" + category + ".png")
|
||||||
|
|||||||
@ -27,7 +27,7 @@ class QLiberationMap(QGraphicsView):
|
|||||||
"ally_sam_ranges": True
|
"ally_sam_ranges": True
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, game: Game):
|
||||||
super(QLiberationMap, self).__init__()
|
super(QLiberationMap, self).__init__()
|
||||||
QLiberationMap.instance = self
|
QLiberationMap.instance = self
|
||||||
|
|
||||||
@ -37,7 +37,6 @@ class QLiberationMap(QGraphicsView):
|
|||||||
self.setMaximumHeight(2160)
|
self.setMaximumHeight(2160)
|
||||||
self._zoom = 0
|
self._zoom = 0
|
||||||
self.init_scene()
|
self.init_scene()
|
||||||
game = persistency.restore_game()
|
|
||||||
self.loadGame(game)
|
self.loadGame(game)
|
||||||
|
|
||||||
def init_scene(self):
|
def init_scene(self):
|
||||||
@ -58,10 +57,13 @@ class QLiberationMap(QGraphicsView):
|
|||||||
scene = self.scene()
|
scene = self.scene()
|
||||||
self.reload_scene()
|
self.reload_scene()
|
||||||
|
|
||||||
|
def setGame(self, game: Game):
|
||||||
|
self.loadGame(game)
|
||||||
|
|
||||||
def reload_scene(self):
|
def reload_scene(self):
|
||||||
scene = self.scene()
|
scene = self.scene()
|
||||||
scene.clear()
|
scene.clear()
|
||||||
scene.addPixmap(QPixmap("../resources/" + self.game.theater.overview_image))
|
scene.addPixmap(QPixmap("./resources/" + self.game.theater.overview_image))
|
||||||
for cp in self.game.theater.controlpoints:
|
for cp in self.game.theater.controlpoints:
|
||||||
|
|
||||||
pos = self._transform_point(cp.position)
|
pos = self._transform_point(cp.position)
|
||||||
|
|||||||
@ -1,15 +1,20 @@
|
|||||||
from PySide2.QtGui import QIcon
|
from PySide2.QtGui import QIcon
|
||||||
from PySide2.QtWidgets import QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QMenuBar, QMainWindow, QAction, QToolBar
|
from PySide2.QtWidgets import QWidget, QPushButton, QHBoxLayout, QVBoxLayout, QMenuBar, QMainWindow, QAction, QToolBar, \
|
||||||
|
QFrame
|
||||||
import webbrowser
|
import webbrowser
|
||||||
|
|
||||||
from qt_ui.uiconstants import URLS
|
from qt_ui.uiconstants import URLS
|
||||||
from qt_ui.windows.QLiberationMap import QLiberationMap
|
from qt_ui.windows.QLiberationMap import QLiberationMap
|
||||||
import qt_ui.uiconstants as CONST
|
import qt_ui.uiconstants as CONST
|
||||||
|
from qt_ui.windows.QNewGameWizard import NewGameWizard
|
||||||
|
from userdata import persistency
|
||||||
|
from game import Game
|
||||||
|
|
||||||
class QLiberationWindow(QMainWindow):
|
class QLiberationWindow(QMainWindow):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
super(QLiberationWindow, self).__init__()
|
super(QLiberationWindow, self).__init__()
|
||||||
|
self.game = persistency.restore_game()
|
||||||
self.init_ui()
|
self.init_ui()
|
||||||
|
|
||||||
def init_ui(self):
|
def init_ui(self):
|
||||||
@ -18,44 +23,50 @@ class QLiberationWindow(QMainWindow):
|
|||||||
self.setWindowTitle("DCS Liberation")
|
self.setWindowTitle("DCS Liberation")
|
||||||
self.setWindowIcon(QIcon("../resources/icon.png"))
|
self.setWindowIcon(QIcon("../resources/icon.png"))
|
||||||
self.statusBar().showMessage('Ready')
|
self.statusBar().showMessage('Ready')
|
||||||
|
|
||||||
|
|
||||||
|
self.initActions()
|
||||||
self.init_menubar()
|
self.init_menubar()
|
||||||
self.init_toolbar()
|
self.init_toolbar()
|
||||||
|
|
||||||
okButton = QPushButton("OK")
|
|
||||||
cancelButton = QPushButton("Cancel")
|
|
||||||
|
|
||||||
hbox = QHBoxLayout()
|
hbox = QHBoxLayout()
|
||||||
hbox.addStretch(1)
|
hbox.addStretch(1)
|
||||||
"""hbox.addWidget(okButton)
|
self.liberation_map = QLiberationMap(self.game)
|
||||||
hbox.addWidget(cancelButton)"""
|
|
||||||
|
|
||||||
self.liberation_map = QLiberationMap()
|
|
||||||
|
|
||||||
hbox.addWidget(self.liberation_map)
|
hbox.addWidget(self.liberation_map)
|
||||||
|
|
||||||
vbox = QVBoxLayout()
|
vbox = QVBoxLayout()
|
||||||
vbox.addStretch(1)
|
vbox.setMargin(0)
|
||||||
|
frame = QFrame()
|
||||||
|
frame.setFrameShape(frame.Box)
|
||||||
|
vbox.addWidget(frame)
|
||||||
vbox.addLayout(hbox)
|
vbox.addLayout(hbox)
|
||||||
|
|
||||||
central_widget = QWidget()
|
central_widget = QWidget()
|
||||||
central_widget.setLayout(vbox)
|
central_widget.setLayout(vbox)
|
||||||
self.setCentralWidget(central_widget)
|
self.setCentralWidget(central_widget)
|
||||||
|
|
||||||
|
def initActions(self):
|
||||||
|
self.newGameAction = QAction("New Game", self)
|
||||||
|
self.newGameAction.setIcon(QIcon(CONST.ICONS["New"]))
|
||||||
|
self.newGameAction.triggered.connect(self.newGame)
|
||||||
|
|
||||||
|
self.saveGameAction = QAction("Save", self)
|
||||||
|
self.saveGameAction.setIcon(QIcon(CONST.ICONS["Save"]))
|
||||||
|
self.saveGameAction.triggered.connect(self.saveGame)
|
||||||
|
|
||||||
def init_toolbar(self):
|
def init_toolbar(self):
|
||||||
self.tool_bar = self.addToolBar("File")
|
self.tool_bar = self.addToolBar("File")
|
||||||
self.tool_bar.addAction(QIcon(CONST.ICONS["New"]), "New")
|
self.tool_bar.addAction(self.newGameAction)
|
||||||
self.tool_bar.addAction(QIcon(CONST.ICONS["Open"]), "Open")
|
self.tool_bar.addAction(QIcon(CONST.ICONS["Open"]), "Open")
|
||||||
self.tool_bar.addAction(QIcon(CONST.ICONS["Save"]), "Save")
|
self.tool_bar.addAction(self.saveGameAction)
|
||||||
|
|
||||||
|
|
||||||
def init_menubar(self):
|
def init_menubar(self):
|
||||||
self.menu = self.menuBar()
|
self.menu = self.menuBar()
|
||||||
|
|
||||||
file_menu = self.menu.addMenu("File")
|
file_menu = self.menu.addMenu("File")
|
||||||
file_menu.addAction(QIcon(CONST.ICONS["New"]), "New Game")
|
file_menu.addAction(self.newGameAction)
|
||||||
file_menu.addAction(QIcon(CONST.ICONS["Open"]), "Open")
|
file_menu.addAction(QIcon(CONST.ICONS["Open"]), "Open")
|
||||||
file_menu.addAction(QIcon(CONST.ICONS["Save"]), "Save")
|
file_menu.addAction(self.saveGameAction)
|
||||||
file_menu.addAction("Save As")
|
file_menu.addAction("Save As")
|
||||||
|
|
||||||
help_menu = self.menu.addMenu("Help")
|
help_menu = self.menu.addMenu("Help")
|
||||||
@ -87,3 +98,16 @@ class QLiberationWindow(QMainWindow):
|
|||||||
displayMenu.addAction(tg_go_visibility)
|
displayMenu.addAction(tg_go_visibility)
|
||||||
displayMenu.addAction(tg_cp_visibility)
|
displayMenu.addAction(tg_cp_visibility)
|
||||||
displayMenu.addAction(tg_line_visibility)
|
displayMenu.addAction(tg_line_visibility)
|
||||||
|
|
||||||
|
def newGame(self):
|
||||||
|
wizard = NewGameWizard(self)
|
||||||
|
wizard.show()
|
||||||
|
wizard.accepted.connect(lambda : self.setGame(wizard.generatedGame))
|
||||||
|
|
||||||
|
def saveGame(self):
|
||||||
|
print("Saving game")
|
||||||
|
persistency.save_game(self.game)
|
||||||
|
|
||||||
|
def setGame(self, game: Game):
|
||||||
|
self.game = game
|
||||||
|
self.liberation_map.setGame(game)
|
||||||
|
|||||||
282
qt_ui/windows/QNewGameWizard.py
Normal file
282
qt_ui/windows/QNewGameWizard.py
Normal file
@ -0,0 +1,282 @@
|
|||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
|
||||||
|
from PySide2 import QtGui, QtWidgets
|
||||||
|
from dcs.task import CAP, CAS
|
||||||
|
|
||||||
|
import qt_ui.uiconstants as CONST
|
||||||
|
from game import db, Game
|
||||||
|
from theater import start_generator, persiangulf, nevada, caucasus, ConflictTheater
|
||||||
|
from userdata.logging import version_string
|
||||||
|
|
||||||
|
|
||||||
|
class NewGameWizard(QtWidgets.QWizard):
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
super(NewGameWizard, self).__init__(parent)
|
||||||
|
|
||||||
|
self.addPage(IntroPage())
|
||||||
|
self.addPage(FactionSelection())
|
||||||
|
self.addPage(TheaterConfiguration())
|
||||||
|
self.addPage(MiscOptions())
|
||||||
|
self.addPage(ConclusionPage())
|
||||||
|
|
||||||
|
self.setPixmap(QtWidgets.QWizard.WatermarkPixmap,
|
||||||
|
QtGui.QPixmap('./resources/ui/wizard/watermark1.png'))
|
||||||
|
self.setWizardStyle(QtWidgets.QWizard.ModernStyle)
|
||||||
|
|
||||||
|
self.setWindowTitle("New Game")
|
||||||
|
self.generatedGame = None
|
||||||
|
|
||||||
|
def accept(self):
|
||||||
|
blueFaction = [c for c in db.FACTIONS if db.FACTIONS[c]["side"] == "blue"][self.field("blueFaction")]
|
||||||
|
redFaction = [c for c in db.FACTIONS if db.FACTIONS[c]["side"] == "red"][self.field("redFaction")]
|
||||||
|
playerIsBlue = self.field("playerIsBlue")
|
||||||
|
isTerrainPg = self.field("isTerrainPg")
|
||||||
|
isTerrainNttr = self.field("isTerrainNttr")
|
||||||
|
timePeriod = db.TIME_PERIODS[list(db.TIME_PERIODS.keys())[self.field("timePeriod")]]
|
||||||
|
sams = self.field("sams")
|
||||||
|
midGame = self.field("midGame")
|
||||||
|
multiplier = self.field("multiplier")
|
||||||
|
|
||||||
|
player_name = playerIsBlue and blueFaction or redFaction
|
||||||
|
enemy_name = playerIsBlue and redFaction or blueFaction
|
||||||
|
|
||||||
|
if isTerrainPg:
|
||||||
|
conflicttheater = persiangulf.PersianGulfTheater()
|
||||||
|
elif isTerrainNttr:
|
||||||
|
conflicttheater = nevada.NevadaTheater()
|
||||||
|
else:
|
||||||
|
conflicttheater = caucasus.CaucasusTheater()
|
||||||
|
|
||||||
|
print("player_name, enemy_name, conflicttheater, sams, midGame, multiplier, timePeriod")
|
||||||
|
print(player_name, enemy_name, conflicttheater, sams, midGame, multiplier, timePeriod)
|
||||||
|
self.generatedGame = self.start_new_game(player_name, enemy_name, conflicttheater, sams, midGame, multiplier,
|
||||||
|
timePeriod)
|
||||||
|
|
||||||
|
super(NewGameWizard, self).accept()
|
||||||
|
|
||||||
|
def start_new_game(self, player_name: str, enemy_name: str, conflicttheater: ConflictTheater, sams: bool,
|
||||||
|
midgame: bool, multiplier: float, period: datetime):
|
||||||
|
|
||||||
|
if midgame:
|
||||||
|
for i in range(0, int(len(conflicttheater.controlpoints) / 2)):
|
||||||
|
conflicttheater.controlpoints[i].captured = True
|
||||||
|
|
||||||
|
start_generator.generate_inital_units(conflicttheater, enemy_name, sams, multiplier)
|
||||||
|
start_generator.generate_groundobjects(conflicttheater)
|
||||||
|
game = Game(player_name=player_name,
|
||||||
|
enemy_name=enemy_name,
|
||||||
|
theater=conflicttheater,
|
||||||
|
start_date=period)
|
||||||
|
game.budget = int(game.budget * multiplier)
|
||||||
|
game.settings.multiplier = multiplier
|
||||||
|
game.settings.sams = sams
|
||||||
|
game.settings.version = version_string()
|
||||||
|
|
||||||
|
if midgame:
|
||||||
|
game.budget = game.budget * 4 * len(list(conflicttheater.conflicts()))
|
||||||
|
|
||||||
|
return game
|
||||||
|
|
||||||
|
|
||||||
|
class IntroPage(QtWidgets.QWizardPage):
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
super(IntroPage, self).__init__(parent)
|
||||||
|
|
||||||
|
self.setTitle("Introduction")
|
||||||
|
self.setPixmap(QtWidgets.QWizard.WatermarkPixmap,
|
||||||
|
QtGui.QPixmap('./resources/ui/wizard/watermark1.png'))
|
||||||
|
|
||||||
|
label = QtWidgets.QLabel("This wizard will help you setup a new game.\n\n"
|
||||||
|
"Please make sure you saved and backed up your previous game before going through.")
|
||||||
|
label.setWordWrap(True)
|
||||||
|
|
||||||
|
layout = QtWidgets.QVBoxLayout()
|
||||||
|
layout.addWidget(label)
|
||||||
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
|
||||||
|
class FactionSelection(QtWidgets.QWizardPage):
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
super(FactionSelection, self).__init__(parent)
|
||||||
|
|
||||||
|
self.setTitle("Faction selection")
|
||||||
|
self.setSubTitle("\nChoose the two opposing factions and select the player side.")
|
||||||
|
self.setPixmap(QtWidgets.QWizard.LogoPixmap,
|
||||||
|
QtGui.QPixmap('./resources/ui/wizard/logo1.png'))
|
||||||
|
|
||||||
|
self.setMinimumHeight(250)
|
||||||
|
|
||||||
|
blues = [c for c in db.FACTIONS if db.FACTIONS[c]["side"] == "blue"]
|
||||||
|
reds = [c for c in db.FACTIONS if db.FACTIONS[c]["side"] == "red"]
|
||||||
|
|
||||||
|
# Create form
|
||||||
|
blueFaction = QtWidgets.QLabel("Blue Faction :")
|
||||||
|
self.blueFactionSelect = QtWidgets.QComboBox()
|
||||||
|
for f in blues:
|
||||||
|
self.blueFactionSelect.addItem(f)
|
||||||
|
blueFaction.setBuddy(self.blueFactionSelect)
|
||||||
|
|
||||||
|
redFaction = QtWidgets.QLabel("Red Faction :")
|
||||||
|
self.redFactionSelect = QtWidgets.QComboBox()
|
||||||
|
for r in reds:
|
||||||
|
self.redFactionSelect.addItem(r)
|
||||||
|
redFaction.setBuddy(self.redFactionSelect)
|
||||||
|
|
||||||
|
sideGroup = QtWidgets.QGroupBox("Player Side")
|
||||||
|
blueforRadioButton = QtWidgets.QRadioButton("BLUEFOR")
|
||||||
|
redforRadioButton = QtWidgets.QRadioButton("REDFOR")
|
||||||
|
blueforRadioButton.setChecked(True)
|
||||||
|
|
||||||
|
# Unit Preview
|
||||||
|
self.blueSideRecap = QtWidgets.QLabel("")
|
||||||
|
self.blueSideRecap.setFont(QtGui.QFont("Arial", italic=True))
|
||||||
|
self.blueSideRecap.setWordWrap(True)
|
||||||
|
self.redSideRecap = QtWidgets.QLabel("")
|
||||||
|
self.redSideRecap.setFont(QtGui.QFont("Arial", italic=True))
|
||||||
|
self.redSideRecap.setWordWrap(True)
|
||||||
|
|
||||||
|
# Link form fields
|
||||||
|
self.registerField('blueFaction', self.blueFactionSelect)
|
||||||
|
self.registerField('redFaction', self.redFactionSelect)
|
||||||
|
self.registerField('playerIsBlue', blueforRadioButton)
|
||||||
|
self.registerField('playerIsRed', redforRadioButton)
|
||||||
|
|
||||||
|
# Build layout
|
||||||
|
sideGroupLayout = QtWidgets.QVBoxLayout()
|
||||||
|
sideGroupLayout.addWidget(blueforRadioButton)
|
||||||
|
sideGroupLayout.addWidget(redforRadioButton)
|
||||||
|
sideGroup.setLayout(sideGroupLayout)
|
||||||
|
|
||||||
|
layout = QtWidgets.QGridLayout()
|
||||||
|
layout.addWidget(blueFaction, 0, 0)
|
||||||
|
layout.addWidget(self.blueFactionSelect, 0, 1)
|
||||||
|
layout.addWidget(self.blueSideRecap, 1, 0, 1, 2)
|
||||||
|
layout.addWidget(redFaction, 2, 0)
|
||||||
|
layout.addWidget(self.redFactionSelect, 2, 1)
|
||||||
|
layout.addWidget(self.redSideRecap, 3, 0, 1, 2)
|
||||||
|
layout.addWidget(sideGroup, 4, 0, 1, 2)
|
||||||
|
self.setLayout(layout)
|
||||||
|
self.updateUnitRecap()
|
||||||
|
|
||||||
|
self.blueFactionSelect.activated.connect(self.updateUnitRecap)
|
||||||
|
self.redFactionSelect.activated.connect(self.updateUnitRecap)
|
||||||
|
|
||||||
|
def updateUnitRecap(self):
|
||||||
|
red_units = db.FACTIONS[self.redFactionSelect.currentText()]["units"]
|
||||||
|
blue_units = db.FACTIONS[self.blueFactionSelect.currentText()]["units"]
|
||||||
|
|
||||||
|
blue_txt = ""
|
||||||
|
for u in blue_units:
|
||||||
|
if u in db.UNIT_BY_TASK[CAP] or u in db.UNIT_BY_TASK[CAS]:
|
||||||
|
blue_txt = blue_txt + u.id + ", "
|
||||||
|
blue_txt = blue_txt + "\n"
|
||||||
|
self.blueSideRecap.setText(blue_txt)
|
||||||
|
|
||||||
|
red_txt = ""
|
||||||
|
for u in red_units:
|
||||||
|
if u in db.UNIT_BY_TASK[CAP] or u in db.UNIT_BY_TASK[CAS]:
|
||||||
|
red_txt = red_txt + u.id + ", "
|
||||||
|
red_txt = red_txt + "\n"
|
||||||
|
self.redSideRecap.setText(red_txt)
|
||||||
|
|
||||||
|
|
||||||
|
class TheaterConfiguration(QtWidgets.QWizardPage):
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
super(TheaterConfiguration, self).__init__(parent)
|
||||||
|
|
||||||
|
self.setTitle("Theater configuration")
|
||||||
|
self.setSubTitle("\nChoose a terrain and time period for this game.")
|
||||||
|
self.setPixmap(QtWidgets.QWizard.LogoPixmap,
|
||||||
|
QtGui.QPixmap('./resources/ui/wizard/logo1.png'))
|
||||||
|
|
||||||
|
# Terrain selection
|
||||||
|
terrainGroup = QtWidgets.QGroupBox("Terrain")
|
||||||
|
terrainCaucasus = QtWidgets.QRadioButton("Caucasus")
|
||||||
|
terrainCaucasus.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Caucasus"]))
|
||||||
|
terrainPg = QtWidgets.QRadioButton("Persian Gulf")
|
||||||
|
terrainPg.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Persian_Gulf"]))
|
||||||
|
terrainNttr = QtWidgets.QRadioButton("Nevada")
|
||||||
|
terrainNttr.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Nevada"]))
|
||||||
|
terrainCaucasus.setChecked(True)
|
||||||
|
|
||||||
|
# Time Period
|
||||||
|
timeGroup = QtWidgets.QGroupBox("Time Period")
|
||||||
|
timePeriod = QtWidgets.QLabel("Start date :")
|
||||||
|
timePeriodSelect = QtWidgets.QComboBox()
|
||||||
|
for r in db.TIME_PERIODS:
|
||||||
|
timePeriodSelect.addItem(r)
|
||||||
|
timePeriod.setBuddy(timePeriodSelect)
|
||||||
|
timePeriodSelect.setCurrentIndex(21)
|
||||||
|
|
||||||
|
# Register fields
|
||||||
|
self.registerField('isTerrainCaucasus', terrainCaucasus)
|
||||||
|
self.registerField('isTerrainPg', terrainPg)
|
||||||
|
self.registerField('isTerrainNttr', terrainNttr)
|
||||||
|
self.registerField('timePeriod', timePeriodSelect)
|
||||||
|
|
||||||
|
# Build layout
|
||||||
|
terrainGroupLayout = QtWidgets.QVBoxLayout()
|
||||||
|
terrainGroupLayout.addWidget(terrainCaucasus)
|
||||||
|
terrainGroupLayout.addWidget(terrainPg)
|
||||||
|
terrainGroupLayout.addWidget(terrainNttr)
|
||||||
|
terrainGroup.setLayout(terrainGroupLayout)
|
||||||
|
|
||||||
|
timeGroupLayout = QtWidgets.QGridLayout()
|
||||||
|
timeGroupLayout.addWidget(timePeriod, 0, 0)
|
||||||
|
timeGroupLayout.addWidget(timePeriodSelect, 0, 1)
|
||||||
|
timeGroup.setLayout(timeGroupLayout)
|
||||||
|
|
||||||
|
layout = QtWidgets.QGridLayout()
|
||||||
|
layout.setColumnMinimumWidth(0, 20)
|
||||||
|
layout.addWidget(terrainGroup)
|
||||||
|
layout.addWidget(timeGroup)
|
||||||
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
|
||||||
|
class MiscOptions(QtWidgets.QWizardPage):
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
super(MiscOptions, self).__init__(parent)
|
||||||
|
|
||||||
|
self.setTitle("Miscellaneous settings")
|
||||||
|
self.setSubTitle("\nOthers settings for the game.")
|
||||||
|
self.setPixmap(QtWidgets.QWizard.LogoPixmap,
|
||||||
|
QtGui.QPixmap('./resources/ui/wizard/logo1.png'))
|
||||||
|
|
||||||
|
sams = QtWidgets.QCheckBox()
|
||||||
|
sams.setChecked(True)
|
||||||
|
midGame = QtWidgets.QCheckBox()
|
||||||
|
multiplier = QtWidgets.QSpinBox()
|
||||||
|
multiplier.setMinimum(1)
|
||||||
|
multiplier.setMaximum(5)
|
||||||
|
|
||||||
|
self.registerField('sams', sams)
|
||||||
|
self.registerField('midGame', midGame)
|
||||||
|
self.registerField('multiplier', multiplier)
|
||||||
|
|
||||||
|
layout = QtWidgets.QGridLayout()
|
||||||
|
layout.addWidget(QtWidgets.QLabel("With SAM Systems :"), 0, 0)
|
||||||
|
layout.addWidget(sams, 0, 1)
|
||||||
|
layout.addWidget(QtWidgets.QLabel("Start at mid game"), 1, 0)
|
||||||
|
layout.addWidget(midGame, 1, 1)
|
||||||
|
layout.addWidget(QtWidgets.QLabel("Ennemy forces multiplier"), 2, 0)
|
||||||
|
layout.addWidget(multiplier, 2, 1)
|
||||||
|
self.setLayout(layout)
|
||||||
|
|
||||||
|
|
||||||
|
class ConclusionPage(QtWidgets.QWizardPage):
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
super(ConclusionPage, self).__init__(parent)
|
||||||
|
|
||||||
|
self.setTitle("Conclusion")
|
||||||
|
self.setSubTitle("\n\n")
|
||||||
|
self.setPixmap(QtWidgets.QWizard.WatermarkPixmap,
|
||||||
|
QtGui.QPixmap('./resources/ui/wizard/watermark2.png'))
|
||||||
|
|
||||||
|
self.label = QtWidgets.QLabel("Click 'Finish' to generate and start the new game.")
|
||||||
|
self.label.setWordWrap(True)
|
||||||
|
|
||||||
|
layout = QtWidgets.QVBoxLayout()
|
||||||
|
layout.addWidget(self.label)
|
||||||
|
self.setLayout(layout)
|
||||||
6
qt_ui/windows/QTopPanel.py
Normal file
6
qt_ui/windows/QTopPanel.py
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
from PySide2.QtWidgets import QFrame
|
||||||
|
|
||||||
|
|
||||||
|
class QTopPanel(QFrame):
|
||||||
|
|
||||||
|
pass
|
||||||
BIN
resources/ui/wizard/logo1.png
Normal file
BIN
resources/ui/wizard/logo1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
BIN
resources/ui/wizard/watermark1.png
Normal file
BIN
resources/ui/wizard/watermark1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 147 KiB |
BIN
resources/ui/wizard/watermark2.png
Normal file
BIN
resources/ui/wizard/watermark2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 125 KiB |
Loading…
x
Reference in New Issue
Block a user