mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Reworked campaign selection wizard. Added two small scale camapaigns on PG map
This commit is contained in:
parent
220e72322c
commit
a60e6aa860
@ -12,10 +12,9 @@ from game import Game
|
||||
from qt_ui.uiconstants import URLS
|
||||
from qt_ui.widgets.QTopPanel import QTopPanel
|
||||
from qt_ui.widgets.map.QLiberationMap import QLiberationMap
|
||||
from qt_ui.windows.preferences import QLiberationPreferences
|
||||
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal, DebriefingSignal
|
||||
from qt_ui.windows.QDebriefingWindow import QDebriefingWindow
|
||||
from qt_ui.windows.QNewGameWizard import NewGameWizard
|
||||
from qt_ui.windows.newgame.QNewGameWizard import NewGameWizard
|
||||
from qt_ui.windows.infos.QInfoPanel import QInfoPanel
|
||||
from qt_ui.windows.preferences.QLiberationPreferencesWindow import QLiberationPreferencesWindow
|
||||
from userdata import persistency
|
||||
|
||||
72
qt_ui/windows/newgame/QCampaignList.py
Normal file
72
qt_ui/windows/newgame/QCampaignList.py
Normal file
@ -0,0 +1,72 @@
|
||||
from PySide2 import QtGui
|
||||
from PySide2.QtCore import QSize, QItemSelectionModel
|
||||
from PySide2.QtGui import QStandardItemModel, QStandardItem
|
||||
from PySide2.QtWidgets import QListView, QAbstractItemView
|
||||
|
||||
from theater import caucasus, nevada, persiangulf, normandy, thechannel
|
||||
import qt_ui.uiconstants as CONST
|
||||
|
||||
CAMPAIGNS = [
|
||||
("Caucasus - Western Georgia", caucasus.WesternGeorgia, "Terrain_Caucasus"),
|
||||
("Caucasus - Russia Small", caucasus.RussiaSmall, "Terrain_Caucasus"),
|
||||
("Caucasus - North Caucasus", caucasus.NorthCaucasus, "Terrain_Caucasus"),
|
||||
("Caucasus - Full Map", caucasus.CaucasusTheater, "Terrain_Caucasus"),
|
||||
("Nevada - North Nevada", nevada.NevadaTheater, "Terrain_Nevada"),
|
||||
("Persian Gulf - Invasion of Iran", persiangulf.IranianCampaign, "Terrain_Persian_Gulf"),
|
||||
("Persian Gulf - Invasion of Iran [Lite]", persiangulf.IranInvasionLite, "Terrain_Persian_Gulf"),
|
||||
("Persian Gulf - Emirates", persiangulf.Emirates, "Terrain_Persian_Gulf"),
|
||||
("Persian Gulf - Desert War", persiangulf.DesertWar, "Terrain_Persian_Gulf"),
|
||||
("Persian Gulf - Full Map", persiangulf.PersianGulfTheater, "Terrain_Persian_Gulf"),
|
||||
|
||||
("Syria - Golan heights battle", persiangulf.PersianGulfTheater, "Terrain_Persian_Gulf"),
|
||||
("Syria - Invasion from Turkey", persiangulf.PersianGulfTheater, "Terrain_Persian_Gulf"),
|
||||
("Syria - Syrian Civil War", persiangulf.PersianGulfTheater, "Terrain_Persian_Gulf"),
|
||||
("Syria - War on Insurgents", persiangulf.PersianGulfTheater, "Terrain_Persian_Gulf"),
|
||||
("Syria - Full Map", persiangulf.PersianGulfTheater, "Terrain_Persian_Gulf"),
|
||||
|
||||
("Normandy - Normandy", normandy.NormandyTheater, "Terrain_Normandy"),
|
||||
("Normandy - Normandy Small", normandy.NormandySmall, "Terrain_Normandy"),
|
||||
("The Channel - Battle of Britain", thechannel.BattleOfBritain, "Terrain_Channel"),
|
||||
("The Channel - Dunkirk", thechannel.Dunkirk, "Terrain_Channel"),
|
||||
]
|
||||
|
||||
|
||||
class QCampaignItem(QStandardItem):
|
||||
|
||||
def __init__(self, text, theater, icon):
|
||||
super(QCampaignItem, self).__init__()
|
||||
self.theater = theater
|
||||
self.setIcon(QtGui.QIcon(CONST.ICONS[icon]))
|
||||
self.setEditable(False)
|
||||
self.setText(text)
|
||||
|
||||
class QCampaignList(QListView):
|
||||
|
||||
def __init__(self):
|
||||
super(QCampaignList, self).__init__()
|
||||
self.model = QStandardItemModel(self)
|
||||
self.setModel(self.model)
|
||||
self.setMinimumWidth(250)
|
||||
self.setMinimumHeight(350)
|
||||
self.campaigns = []
|
||||
self.setSelectionBehavior(QAbstractItemView.SelectItems)
|
||||
self.setup_content()
|
||||
|
||||
def setup_content(self):
|
||||
for i, campaign in enumerate(CAMPAIGNS):
|
||||
self.campaigns.append(campaign)
|
||||
item = QCampaignItem(*campaign)
|
||||
self.model.appendRow(item)
|
||||
self.setSelectedCampaign(0)
|
||||
self.repaint()
|
||||
|
||||
def setSelectedCampaign(self, row):
|
||||
self.selectionModel().clearSelection()
|
||||
index = self.model.index(row, 0)
|
||||
if not index.isValid():
|
||||
index = self.model.index(0, 0)
|
||||
self.selectionModel().setCurrentIndex(index, QItemSelectionModel.Select)
|
||||
self.repaint()
|
||||
|
||||
def clear_layout(self):
|
||||
self.model.removeRows(0, self.model.rowCount())
|
||||
@ -1,8 +1,10 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import datetime
|
||||
import logging
|
||||
|
||||
from PySide2 import QtGui, QtWidgets
|
||||
from PySide2.QtCore import QPoint, QItemSelectionModel
|
||||
from PySide2.QtWidgets import QHBoxLayout, QVBoxLayout
|
||||
from dcs.task import CAP, CAS
|
||||
|
||||
@ -10,6 +12,7 @@ import qt_ui.uiconstants as CONST
|
||||
from game import db, Game
|
||||
from game.settings import Settings
|
||||
from gen import namegen
|
||||
from qt_ui.windows.newgame.QCampaignList import QCampaignList
|
||||
from theater import start_generator, persiangulf, nevada, caucasus, ConflictTheater, normandy, thechannel
|
||||
|
||||
|
||||
@ -32,19 +35,15 @@ class NewGameWizard(QtWidgets.QWizard):
|
||||
|
||||
def accept(self):
|
||||
|
||||
logging.info("New Game Wizard accept")
|
||||
logging.info("======================")
|
||||
|
||||
blueFaction = [c for c in db.FACTIONS][self.field("blueFaction")]
|
||||
redFaction = [c for c in db.FACTIONS][self.field("redFaction")]
|
||||
isTerrainPg = self.field("isTerrainPg")
|
||||
isTerrainNttr = self.field("isTerrainNttr")
|
||||
isTerrainCaucasusSmall = self.field("isTerrainCaucasusSmall")
|
||||
isTerrainRussia = self.field("isTerrainRussia")
|
||||
isTerrainCaucasusNorth= self.field("isTerrainCaucasusNorth")
|
||||
isIranianCampaignTheater = self.field("isIranianCampaignTheater")
|
||||
isTerrainNormandy = self.field("isTerrainNormandy")
|
||||
isTerrainNormandySmall = self.field("isTerrainNormandySmall")
|
||||
isTerrainChannel = self.field("isTerrainChannel")
|
||||
isTerrainChannelComplete = self.field("isTerrainChannelComplete")
|
||||
isTerrainEmirates = self.field("isTerrainEmirates")
|
||||
|
||||
selectedCampaign = self.field("selectedCampaign")
|
||||
conflictTheater = selectedCampaign[1]()
|
||||
|
||||
timePeriod = db.TIME_PERIODS[list(db.TIME_PERIODS.keys())[self.field("timePeriod")]]
|
||||
midGame = self.field("midGame")
|
||||
multiplier = self.field("multiplier")
|
||||
@ -58,31 +57,6 @@ class NewGameWizard(QtWidgets.QWizard):
|
||||
player_name = blueFaction
|
||||
enemy_name = redFaction
|
||||
|
||||
if isTerrainPg:
|
||||
conflicttheater = persiangulf.PersianGulfTheater()
|
||||
elif isTerrainNttr:
|
||||
conflicttheater = nevada.NevadaTheater()
|
||||
elif isTerrainCaucasusSmall:
|
||||
conflicttheater = caucasus.WesternGeorgia()
|
||||
elif isTerrainRussia:
|
||||
conflicttheater = caucasus.RussiaSmall()
|
||||
elif isTerrainCaucasusNorth:
|
||||
conflicttheater = caucasus.NorthCaucasus()
|
||||
elif isIranianCampaignTheater:
|
||||
conflicttheater = persiangulf.IranianCampaign()
|
||||
elif isTerrainEmirates:
|
||||
conflicttheater = persiangulf.Emirates()
|
||||
elif isTerrainNormandy:
|
||||
conflicttheater = normandy.NormandyTheater()
|
||||
elif isTerrainNormandySmall:
|
||||
conflicttheater = normandy.NormandySmall()
|
||||
elif isTerrainChannel:
|
||||
conflicttheater = thechannel.ChannelTheater()
|
||||
elif isTerrainChannelComplete:
|
||||
conflicttheater = thechannel.ChannelTheaterComplete()
|
||||
else:
|
||||
conflicttheater = caucasus.CaucasusTheater()
|
||||
|
||||
settings = Settings()
|
||||
settings.inverted = invertMap
|
||||
settings.supercarrier = supercarrier
|
||||
@ -91,40 +65,40 @@ class NewGameWizard(QtWidgets.QWizard):
|
||||
settings.do_not_generate_player_navy = no_player_navy
|
||||
settings.do_not_generate_enemy_navy = no_enemy_navy
|
||||
|
||||
self.generatedGame = self.start_new_game(player_name, enemy_name, conflicttheater, midGame, multiplier,
|
||||
self.generatedGame = self.start_new_game(player_name, enemy_name, conflictTheater, midGame, multiplier,
|
||||
timePeriod, settings)
|
||||
|
||||
super(NewGameWizard, self).accept()
|
||||
|
||||
def start_new_game(self, player_name: str, enemy_name: str, conflicttheater: ConflictTheater,
|
||||
def start_new_game(self, player_name: str, enemy_name: str, conflictTheater: ConflictTheater,
|
||||
midgame: bool, multiplier: float, period: datetime, settings:Settings):
|
||||
|
||||
# Reset name generator
|
||||
namegen.reset()
|
||||
start_generator.prepare_theater(conflicttheater, settings, midgame)
|
||||
start_generator.prepare_theater(conflictTheater, settings, midgame)
|
||||
|
||||
print("-- Starting New Game Generator")
|
||||
print("Enemy name : " + enemy_name)
|
||||
print("Player name : " + player_name)
|
||||
print("Midgame : " + str(midgame))
|
||||
start_generator.generate_inital_units(conflicttheater, enemy_name, True, multiplier)
|
||||
start_generator.generate_inital_units(conflictTheater, enemy_name, True, multiplier)
|
||||
|
||||
print("-- Initial units generated")
|
||||
game = Game(player_name=player_name,
|
||||
enemy_name=enemy_name,
|
||||
theater=conflicttheater,
|
||||
theater=conflictTheater,
|
||||
start_date=period,
|
||||
settings=settings)
|
||||
|
||||
print("-- Game Object generated")
|
||||
start_generator.generate_groundobjects(conflicttheater, game)
|
||||
start_generator.generate_groundobjects(conflictTheater, game)
|
||||
game.budget = int(game.budget * multiplier)
|
||||
game.settings.multiplier = multiplier
|
||||
game.settings.sams = True
|
||||
game.settings.version = "2.0.10"
|
||||
|
||||
if midgame:
|
||||
game.budget = game.budget * 4 * len(list(conflicttheater.conflicts()))
|
||||
game.budget = game.budget * 4 * len(list(conflictTheater.conflicts()))
|
||||
|
||||
return game
|
||||
|
||||
@ -295,6 +269,21 @@ class TheaterConfiguration(QtWidgets.QWizardPage):
|
||||
terrainChannelComplete.setIcon(QtGui.QIcon(CONST.ICONS["Terrain_Channel"]))
|
||||
terrainCaucasusSmall.setChecked(True)
|
||||
|
||||
# List of campaigns
|
||||
campaignList = QCampaignList()
|
||||
self.registerField("selectedCampaign", campaignList)
|
||||
|
||||
def on_campaign_selected():
|
||||
index = campaignList.selectionModel().currentIndex().row()
|
||||
campaign = campaignList.campaigns[index]
|
||||
self.setField("selectedCampaign", campaign)
|
||||
|
||||
campaignList.selectionModel().setCurrentIndex(campaignList.indexAt(QPoint(1, 1)), QItemSelectionModel.Rows)
|
||||
campaignList.selectionModel().selectionChanged.connect(on_campaign_selected)
|
||||
on_campaign_selected()
|
||||
|
||||
|
||||
|
||||
# Campaign settings
|
||||
mapSettingsGroup = QtWidgets.QGroupBox("Map Settings")
|
||||
invertMap = QtWidgets.QCheckBox()
|
||||
@ -314,35 +303,8 @@ class TheaterConfiguration(QtWidgets.QWizardPage):
|
||||
timePeriodSelect.setCurrentIndex(21)
|
||||
|
||||
# Register fields
|
||||
self.registerField('isTerrainCaucasus', terrainCaucasus)
|
||||
self.registerField('isTerrainCaucasusSmall', terrainCaucasusSmall)
|
||||
self.registerField('isTerrainRussia', terrainRussia)
|
||||
self.registerField('isTerrainCaucasusNorth', terrainCaucasusNorth)
|
||||
self.registerField('isTerrainPg', terrainPg)
|
||||
self.registerField('isIranianCampaignTheater', terrainIran)
|
||||
self.registerField('isTerrainEmirates', terrainEmirates)
|
||||
self.registerField('isTerrainNttr', terrainNttr)
|
||||
self.registerField('isTerrainNormandy', terrainNormandy)
|
||||
self.registerField('isTerrainNormandySmall', terrainNormandySmall)
|
||||
self.registerField('isTerrainChannel', terrainChannel)
|
||||
self.registerField('isTerrainChannelComplete', terrainChannelComplete)
|
||||
self.registerField('timePeriod', timePeriodSelect)
|
||||
|
||||
# Build layout
|
||||
terrainGroupLayout = QtWidgets.QVBoxLayout()
|
||||
terrainGroupLayout.addWidget(terrainCaucasusSmall)
|
||||
terrainGroupLayout.addWidget(terrainRussia)
|
||||
terrainGroupLayout.addWidget(terrainCaucasusNorth)
|
||||
terrainGroupLayout.addWidget(terrainCaucasus)
|
||||
terrainGroupLayout.addWidget(terrainIran)
|
||||
terrainGroupLayout.addWidget(terrainEmirates)
|
||||
terrainGroupLayout.addWidget(terrainPg)
|
||||
terrainGroupLayout.addWidget(terrainNttr)
|
||||
terrainGroupLayout.addWidget(terrainNormandy)
|
||||
terrainGroupLayout.addWidget(terrainNormandySmall)
|
||||
terrainGroupLayout.addWidget(terrainChannelComplete)
|
||||
terrainGroupLayout.addWidget(terrainChannel)
|
||||
terrainGroup.setLayout(terrainGroupLayout)
|
||||
self.registerField('timePeriod', timePeriodSelect)
|
||||
|
||||
timeGroupLayout = QtWidgets.QGridLayout()
|
||||
timeGroupLayout.addWidget(timePeriod, 0, 0)
|
||||
@ -351,7 +313,7 @@ class TheaterConfiguration(QtWidgets.QWizardPage):
|
||||
|
||||
layout = QtWidgets.QGridLayout()
|
||||
layout.setColumnMinimumWidth(0, 20)
|
||||
layout.addWidget(terrainGroup, 0, 0, 3, 1)
|
||||
layout.addWidget(campaignList, 0, 0, 3, 1)
|
||||
layout.addWidget(mapSettingsGroup, 0, 1, 1, 1)
|
||||
layout.addWidget(timeGroup, 1, 1, 1, 1)
|
||||
self.setLayout(layout)
|
||||
@ -209,3 +209,90 @@ class Emirates(ConflictTheater):
|
||||
self.tarawa_carrier.captured_invert = True
|
||||
self.east_carrier.captured_invert = True
|
||||
self.fujairah.captured_invert = True
|
||||
|
||||
|
||||
class DesertWar(ConflictTheater):
|
||||
terrain = dcs.terrain.PersianGulf()
|
||||
overview_image = "persiangulf.gif"
|
||||
reference_points = {
|
||||
(persiangulf.Shiraz_International_Airport.position.x, persiangulf.Shiraz_International_Airport.position.y): (
|
||||
772, -1970),
|
||||
(persiangulf.Liwa_Airbase.position.x, persiangulf.Liwa_Airbase.position.y): (1188, 78), }
|
||||
landmap = load_landmap("resources\\gulflandmap.p")
|
||||
daytime_map = {
|
||||
"dawn": (6, 8),
|
||||
"day": (8, 16),
|
||||
"dusk": (16, 18),
|
||||
"night": (0, 5),
|
||||
}
|
||||
|
||||
|
||||
def __init__(self):
|
||||
super(DesertWar, self).__init__()
|
||||
|
||||
self.liwa = ControlPoint.from_airport(persiangulf.Liwa_Airbase, LAND, SIZE_BIG, IMPORTANCE_MEDIUM)
|
||||
self.al_maktoum = ControlPoint.from_airport(persiangulf.Al_Maktoum_Intl, LAND, SIZE_BIG, IMPORTANCE_LOW)
|
||||
self.al_minhad = ControlPoint.from_airport(persiangulf.Al_Minhad_AB, LAND, SIZE_REGULAR, IMPORTANCE_LOW)
|
||||
self.al_ain = ControlPoint.from_airport(persiangulf.Al_Ain_International_Airport, LAND, SIZE_BIG,IMPORTANCE_LOW)
|
||||
|
||||
self.carrier = ControlPoint.carrier("Carrier", Point(-124000, -303000), 1001)
|
||||
self.tarawa_carrier = ControlPoint.lha("LHA Carrier", Point(-164000, -257000), 1002)
|
||||
|
||||
self.add_controlpoint(self.liwa, connected_to=[self.al_ain])
|
||||
self.add_controlpoint(self.al_ain, connected_to=[self.al_maktoum, self.liwa])
|
||||
self.add_controlpoint(self.al_maktoum, connected_to=[self.al_minhad, self.al_ain])
|
||||
self.add_controlpoint(self.al_minhad, connected_to=[self.al_maktoum])
|
||||
|
||||
self.add_controlpoint(self.tarawa_carrier)
|
||||
self.add_controlpoint(self.carrier)
|
||||
|
||||
self.tarawa_carrier.captured = True
|
||||
self.carrier.captured = True
|
||||
self.liwa.captured = True
|
||||
|
||||
self.tarawa_carrier.captured_invert = True
|
||||
self.carrier.captured_invert = True
|
||||
self.al_ain.captured_invert = True
|
||||
|
||||
|
||||
class IranInvasionLite(ConflictTheater):
|
||||
terrain = dcs.terrain.PersianGulf()
|
||||
overview_image = "persiangulf.gif"
|
||||
reference_points = {
|
||||
(persiangulf.Shiraz_International_Airport.position.x, persiangulf.Shiraz_International_Airport.position.y): (
|
||||
772, -1970),
|
||||
(persiangulf.Liwa_Airbase.position.x, persiangulf.Liwa_Airbase.position.y): (1188, 78), }
|
||||
landmap = load_landmap("resources\\gulflandmap.p")
|
||||
daytime_map = {
|
||||
"dawn": (6, 8),
|
||||
"day": (8, 16),
|
||||
"dusk": (16, 18),
|
||||
"night": (0, 5),
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
super(IranInvasionLite, self).__init__()
|
||||
|
||||
self.bandar_lengeh = ControlPoint.from_airport(persiangulf.Bandar_Lengeh, [270, 315, 0, 45], SIZE_SMALL, IMPORTANCE_HIGH)
|
||||
self.lar = ControlPoint.from_airport(persiangulf.Lar_Airbase, LAND, SIZE_REGULAR, IMPORTANCE_HIGH)
|
||||
self.shiraz = ControlPoint.from_airport(persiangulf.Shiraz_International_Airport, LAND, SIZE_BIG, IMPORTANCE_HIGH)
|
||||
self.kerman = ControlPoint.from_airport(persiangulf.Kerman_Airport, LAND, SIZE_BIG, IMPORTANCE_HIGH)
|
||||
self.jiroft = ControlPoint.from_airport(persiangulf.Jiroft_Airport, LAND, SIZE_BIG, IMPORTANCE_HIGH)
|
||||
self.carrier = ControlPoint.carrier("Carrier", Point(72000.324335475, -376000), 1001)
|
||||
self.lha = ControlPoint.lha("LHA", Point(-27500.813952358, -147000.65947136), 1002)
|
||||
|
||||
self.add_controlpoint(self.bandar_lengeh, connected_to=[self.lar])
|
||||
self.add_controlpoint(self.shiraz, connected_to=[self.lar, self.kerman])
|
||||
self.add_controlpoint(self.jiroft, connected_to=[self.kerman])
|
||||
self.add_controlpoint(self.kerman, connected_to=[self.shiraz, self.jiroft])
|
||||
self.add_controlpoint(self.lar, connected_to=[self.bandar_lengeh, self.shiraz])
|
||||
|
||||
self.add_controlpoint(self.carrier)
|
||||
self.add_controlpoint(self.lha)
|
||||
|
||||
self.carrier.captured = True
|
||||
self.lha.captured = True
|
||||
|
||||
self.shiraz.captured_invert = True
|
||||
self.bandar_lengeh.captured = True
|
||||
|
||||
|
||||
@ -4,7 +4,7 @@ from .conflicttheater import *
|
||||
from .landmap import *
|
||||
|
||||
|
||||
class ChannelTheater(ConflictTheater):
|
||||
class Dunkirk(ConflictTheater):
|
||||
terrain = dcs.terrain.TheChannel()
|
||||
overview_image = "thechannel.gif"
|
||||
reference_points = {(thechannel.Abbeville_Drucat.position.x, thechannel.Abbeville_Drucat.position.y): (2400, 4100),
|
||||
@ -18,7 +18,7 @@ class ChannelTheater(ConflictTheater):
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
super(ChannelTheater, self).__init__()
|
||||
super(Dunkirk, self).__init__()
|
||||
|
||||
self.abeville = ControlPoint.from_airport(thechannel.Abbeville_Drucat, LAND, SIZE_SMALL, IMPORTANCE_LOW)
|
||||
#self.detling = ControlPoint.from_airport(thechannel.Detling, LAND, SIZE_SMALL, IMPORTANCE_LOW)
|
||||
@ -57,7 +57,7 @@ class ChannelTheater(ConflictTheater):
|
||||
self.abeville.captured_invert = True
|
||||
|
||||
|
||||
class ChannelTheaterComplete(ConflictTheater):
|
||||
class BattleOfBritain(ConflictTheater):
|
||||
terrain = dcs.terrain.TheChannel()
|
||||
overview_image = "thechannel.gif"
|
||||
reference_points = {(thechannel.Abbeville_Drucat.position.x, thechannel.Abbeville_Drucat.position.y): (2400, 4100),
|
||||
@ -71,7 +71,7 @@ class ChannelTheaterComplete(ConflictTheater):
|
||||
}
|
||||
|
||||
def __init__(self):
|
||||
super(ChannelTheaterComplete, self).__init__()
|
||||
super(BattleOfBritain, self).__init__()
|
||||
|
||||
self.abeville = ControlPoint.from_airport(thechannel.Abbeville_Drucat, LAND, SIZE_SMALL, IMPORTANCE_LOW)
|
||||
#self.detling = ControlPoint.from_airport(thechannel.Detling, LAND, SIZE_SMALL, IMPORTANCE_LOW)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user