diff --git a/game/db.py b/game/db.py index a4cc3e4a..15024422 100644 --- a/game/db.py +++ b/game/db.py @@ -337,15 +337,15 @@ PRICES = { AirDefence.SAM_SA_11_Buk_LN_9A310M1: 30, AirDefence.SAM_SA_8_Osa_9A33: 28, AirDefence.SAM_SA_15_Tor_9A331: 40, - AirDefence.SAM_SA_13_Strela_10M3_9A35M3: 24, - AirDefence.SAM_SA_9_Strela_1_9P31: 16, + AirDefence.SAM_SA_13_Strela_10M3_9A35M3: 16, + AirDefence.SAM_SA_9_Strela_1_9P31: 12, AirDefence.SAM_SA_11_Buk_CC_9S470M1: 25, AirDefence.SAM_SA_8_Osa_LD_9T217: 22, AirDefence.SAM_Patriot_AMG_AN_MRC_137: 35, AirDefence.SAM_Patriot_ECS_AN_MSQ_104: 30, AirDefence.SPAAA_Gepard: 24, AirDefence.SAM_Hawk_PCP: 14, - AirDefence.AAA_Vulcan_M163: 12, + AirDefence.AAA_Vulcan_M163: 10, AirDefence.SAM_Hawk_LN_M192: 8, AirDefence.SAM_Chaparral_M48: 16, AirDefence.SAM_Linebacker_M6: 18, @@ -358,7 +358,7 @@ PRICES = { AirDefence.Stinger_MANPADS: 6, AirDefence.SAM_Stinger_comm_dsr: 4, AirDefence.SAM_Stinger_comm: 4, - AirDefence.SPAAA_ZSU_23_4_Shilka: 12, + AirDefence.SPAAA_ZSU_23_4_Shilka: 10, AirDefence.AAA_ZU_23_Closed: 6, AirDefence.AAA_ZU_23_Emplacement: 6, AirDefence.AAA_ZU_23_on_Ural_375: 8, @@ -387,19 +387,19 @@ PRICES = { AirDefence.SAM_SA_2_LN_SM_90: 8, AirDefence.SAM_SA_2_TR_SNR_75_Fan_Song: 12, AirDefence.Rapier_FSA_Launcher: 6, - AirDefence.Rapier_FSA_Optical_Tracker: 12, - AirDefence.Rapier_FSA_Blindfire_Tracker: 16, + AirDefence.Rapier_FSA_Optical_Tracker: 6, + AirDefence.Rapier_FSA_Blindfire_Tracker: 8, AirDefence.HQ_7_Self_Propelled_LN: 20, AirDefence.HQ_7_Self_Propelled_STR: 24, AirDefence.AAA_8_8cm_Flak_18: 6, AirDefence.AAA_Flak_38: 6, AirDefence.AAA_8_8cm_Flak_36: 8, - AirDefence.AAA_8_8cm_Flak_37: 10, + AirDefence.AAA_8_8cm_Flak_37: 9, AirDefence.AAA_Flak_Vierling_38:6, AirDefence.AAA_Kdo_G_40: 8, AirDefence.Flak_Searchlight_37: 4, AirDefence.Maschinensatz_33: 10, - AirDefence.AAA_8_8cm_Flak_41: 12, + AirDefence.AAA_8_8cm_Flak_41: 10, AirDefence.AAA_Bofors_40mm: 8, # FRENCH PACK MOD diff --git a/gen/sam/aaa_bofors.py b/gen/sam/aaa_bofors.py index ad515931..528edd8b 100644 --- a/gen/sam/aaa_bofors.py +++ b/gen/sam/aaa_bofors.py @@ -11,10 +11,11 @@ class BoforsGenerator(GroupGenerator): """ name = "Bofors AAA" + price = 75 def generate(self): - grid_x = random.randint(2, 4) - grid_y = random.randint(2, 4) + grid_x = random.randint(2, 3) + grid_y = random.randint(2, 3) spacing = random.randint(10,40) diff --git a/gen/sam/aaa_flak.py b/gen/sam/aaa_flak.py index 896b48aa..5a0d9121 100644 --- a/gen/sam/aaa_flak.py +++ b/gen/sam/aaa_flak.py @@ -12,12 +12,13 @@ class FlakGenerator(GroupGenerator): """ name = "Flak Site" + price = 135 def generate(self): - grid_x = random.randint(2, 4) - grid_y = random.randint(2, 4) + grid_x = random.randint(2, 3) + grid_y = random.randint(2, 3) - spacing = random.randint(30,60) + spacing = random.randint(30, 60) index = 0 mixed = random.choice([True, False]) @@ -34,7 +35,7 @@ class FlakGenerator(GroupGenerator): unit_type = random.choice(GFLAK) # Search lights - search_pos = self.get_circular_position(random.randint(2,5), 90) + search_pos = self.get_circular_position(random.randint(2,3), 90) for index, pos in enumerate(search_pos): self.add_unit(AirDefence.Flak_Searchlight_37, "SearchLight#" + str(index), pos[0], pos[1], self.heading) diff --git a/gen/sam/aaa_zu23_insurgent.py b/gen/sam/aaa_zu23_insurgent.py index f9c53620..ec659756 100644 --- a/gen/sam/aaa_zu23_insurgent.py +++ b/gen/sam/aaa_zu23_insurgent.py @@ -11,10 +11,11 @@ class ZU23InsurgentGenerator(GroupGenerator): """ name = "Zu-23 Site" + price = 56 def generate(self): - grid_x = random.randint(2, 4) - grid_y = random.randint(2, 4) + grid_x = random.randint(2, 3) + grid_y = random.randint(2, 3) spacing = random.randint(10,40) diff --git a/gen/sam/sam_avenger.py b/gen/sam/sam_avenger.py index 63844f7b..44d3aed9 100644 --- a/gen/sam/sam_avenger.py +++ b/gen/sam/sam_avenger.py @@ -11,6 +11,7 @@ class AvengerGenerator(GroupGenerator): """ name = "Avenger Group" + price = 62 def generate(self): num_launchers = random.randint(2, 3) diff --git a/gen/sam/sam_chaparral.py b/gen/sam/sam_chaparral.py index 6178df1c..a8d89181 100644 --- a/gen/sam/sam_chaparral.py +++ b/gen/sam/sam_chaparral.py @@ -11,6 +11,7 @@ class ChaparralGenerator(GroupGenerator): """ name = "Chaparral Group" + price = 66 def generate(self): num_launchers = random.randint(2, 4) diff --git a/gen/sam/sam_gepard.py b/gen/sam/sam_gepard.py index 3ece2cc9..501ed7b7 100644 --- a/gen/sam/sam_gepard.py +++ b/gen/sam/sam_gepard.py @@ -11,6 +11,7 @@ class GepardGenerator(GroupGenerator): """ name = "Gepard Group" + price = 50 def generate(self): self.add_unit(AirDefence.SPAAA_Gepard, "SPAAA", self.position.x, self.position.y, self.heading) diff --git a/gen/sam/sam_group_generator.py b/gen/sam/sam_group_generator.py index 2a27d752..add0c9fa 100644 --- a/gen/sam/sam_group_generator.py +++ b/gen/sam/sam_group_generator.py @@ -101,16 +101,22 @@ SAM_PRICES = { AirDefence.HQ_7_Self_Propelled_LN: 35 } + def get_faction_possible_sams_units(faction: str) -> List[UnitType]: """ Return the list :param faction: Faction to search units for - :return: """ return [u for u in db.FACTIONS[faction]["units"] if u in AirDefence.__dict__.values()] -def get_sam_names(): - pass + +def get_faction_possible_sams_generator(faction: str) -> List[UnitType]: + """ + Return the list of possible SAM generator for the given faction + :param faction: Faction to search units for + """ + return [SAM_MAP[u] for u in get_faction_possible_sams_units(faction)] + def generate_anti_air_group(game, parent_cp, ground_object, faction:str): """ diff --git a/gen/sam/sam_hawk.py b/gen/sam/sam_hawk.py index f5273ff9..89c11bc0 100644 --- a/gen/sam/sam_hawk.py +++ b/gen/sam/sam_hawk.py @@ -11,6 +11,7 @@ class HawkGenerator(GroupGenerator): """ name = "Hawk Site" + price = 115 def generate(self): self.add_unit(AirDefence.SAM_Hawk_PCP, "PCP", self.position.x, self.position.y, self.heading) diff --git a/gen/sam/sam_hq7.py b/gen/sam/sam_hq7.py index b32d0226..f8a531ea 100644 --- a/gen/sam/sam_hq7.py +++ b/gen/sam/sam_hq7.py @@ -11,6 +11,7 @@ class HQ7Generator(GroupGenerator): """ name = "HQ-7 Site" + price = 120 def generate(self): self.add_unit(AirDefence.HQ_7_Self_Propelled_STR, "STR", self.position.x, self.position.y, self.heading) diff --git a/gen/sam/sam_linebacker.py b/gen/sam/sam_linebacker.py index add33acb..946d14ed 100644 --- a/gen/sam/sam_linebacker.py +++ b/gen/sam/sam_linebacker.py @@ -11,6 +11,7 @@ class LinebackerGenerator(GroupGenerator): """ name = "Linebacker Group" + price = 75 def generate(self): num_launchers = random.randint(2, 4) diff --git a/gen/sam/sam_patriot.py b/gen/sam/sam_patriot.py index f042e3b1..b55dbaea 100644 --- a/gen/sam/sam_patriot.py +++ b/gen/sam/sam_patriot.py @@ -11,6 +11,7 @@ class PatriotGenerator(GroupGenerator): """ name = "Patriot Battery" + price = 240 def generate(self): # Command Post @@ -20,13 +21,13 @@ class PatriotGenerator(GroupGenerator): self.add_unit(AirDefence.SAM_Patriot_EPP_III, "EPP", self.position.x, self.position.y + 30, self.heading) self.add_unit(AirDefence.SAM_Patriot_STR_AN_MPQ_53, "ICC", self.position.x + 30, self.position.y + 30, self.heading) - num_launchers = random.randint(2, 4) + num_launchers = random.randint(3, 4) positions = self.get_circular_position(num_launchers, launcher_distance=120, coverage=360) for i, position in enumerate(positions): self.add_unit(AirDefence.SAM_Patriot_LN_M901, "LN#" + str(i), position[0], position[1], position[2]) # Short range protection for high value site - num_launchers = random.randint(2, 4) + num_launchers = random.randint(3, 4) positions = self.get_circular_position(num_launchers, launcher_distance=300, coverage=360) for i, position in enumerate(positions): self.add_unit(AirDefence.AAA_Vulcan_M163, "SPAAA#" + str(i), position[0], position[1], position[2]) diff --git a/gen/sam/sam_rapier.py b/gen/sam/sam_rapier.py index 0cbffd9e..99b7b205 100644 --- a/gen/sam/sam_rapier.py +++ b/gen/sam/sam_rapier.py @@ -11,6 +11,7 @@ class RapierGenerator(GroupGenerator): """ name = "Rapier AA Site" + price = 50 def generate(self): self.add_unit(AirDefence.Rapier_FSA_Blindfire_Tracker, "BT", self.position.x, self.position.y, self.heading) diff --git a/gen/sam/sam_roland.py b/gen/sam/sam_roland.py index 22f60435..9e31d5fe 100644 --- a/gen/sam/sam_roland.py +++ b/gen/sam/sam_roland.py @@ -9,6 +9,7 @@ class RolandGenerator(GroupGenerator): """ name = "Roland Site" + price = 40 def generate(self): self.add_unit(AirDefence.SAM_Roland_ADS, "ADS", self.position.x, self.position.y, self.heading) diff --git a/gen/sam/sam_sa10.py b/gen/sam/sam_sa10.py index c90d3ae9..ae2102f0 100644 --- a/gen/sam/sam_sa10.py +++ b/gen/sam/sam_sa10.py @@ -11,6 +11,7 @@ class SA10Generator(GroupGenerator): """ name = "SA-10/S-300PS Battery" + price = 450 def generate(self): # Command Post diff --git a/gen/sam/sam_sa11.py b/gen/sam/sam_sa11.py index c05fe21a..3af6c242 100644 --- a/gen/sam/sam_sa11.py +++ b/gen/sam/sam_sa11.py @@ -11,6 +11,7 @@ class SA11Generator(GroupGenerator): """ name = "SA-11 Buk Battery" + price = 180 def generate(self): self.add_unit(AirDefence.SAM_SA_11_Buk_CC_9S470M1, "CC", self.position.x, self.position.y, self.heading) diff --git a/gen/sam/sam_sa13.py b/gen/sam/sam_sa13.py index 366746d7..8fc069ad 100644 --- a/gen/sam/sam_sa13.py +++ b/gen/sam/sam_sa13.py @@ -11,6 +11,7 @@ class SA13Generator(GroupGenerator): """ name = "SA-13 Strela Group" + price = 50 def generate(self): self.add_unit(Unarmed.Transport_UAZ_469, "UAZ", self.position.x, self.position.y, self.heading) diff --git a/gen/sam/sam_sa15.py b/gen/sam/sam_sa15.py index 0aa9c162..09fda2ee 100644 --- a/gen/sam/sam_sa15.py +++ b/gen/sam/sam_sa15.py @@ -9,6 +9,7 @@ class SA15Generator(GroupGenerator): """ name = "SA-15 Tor Group" + price = 55 def generate(self): self.add_unit(AirDefence.SAM_SA_15_Tor_9A331, "ADS", self.position.x, self.position.y, self.heading) diff --git a/gen/sam/sam_sa19.py b/gen/sam/sam_sa19.py index 10923a5a..c4f710f4 100644 --- a/gen/sam/sam_sa19.py +++ b/gen/sam/sam_sa19.py @@ -11,6 +11,7 @@ class SA19Generator(GroupGenerator): """ name = "SA-19 Tunguska Group" + price = 90 def generate(self): num_launchers = random.randint(1, 3) diff --git a/gen/sam/sam_sa2.py b/gen/sam/sam_sa2.py index eb7f014b..c108c1e8 100644 --- a/gen/sam/sam_sa2.py +++ b/gen/sam/sam_sa2.py @@ -11,6 +11,7 @@ class SA2Generator(GroupGenerator): """ name = "SA-2/S-75 Site" + price = 74 def generate(self): self.add_unit(AirDefence.SAM_SR_P_19, "SR", self.position.x, self.position.y, self.heading) diff --git a/gen/sam/sam_sa3.py b/gen/sam/sam_sa3.py index 9a73de13..455bab19 100644 --- a/gen/sam/sam_sa3.py +++ b/gen/sam/sam_sa3.py @@ -11,6 +11,7 @@ class SA3Generator(GroupGenerator): """ name = "SA-3/S-125 Site" + price = 80 def generate(self): self.add_unit(AirDefence.SAM_SR_P_19, "SR", self.position.x, self.position.y, self.heading) diff --git a/gen/sam/sam_sa6.py b/gen/sam/sam_sa6.py index f96d3989..7ec2afca 100644 --- a/gen/sam/sam_sa6.py +++ b/gen/sam/sam_sa6.py @@ -11,6 +11,7 @@ class SA6Generator(GroupGenerator): """ name = "SA-6 Kub Site" + price = 102 def generate(self): self.add_unit(AirDefence.SAM_SA_6_Kub_STR_9S91, "STR", self.position.x, self.position.y, self.heading) diff --git a/gen/sam/sam_sa8.py b/gen/sam/sam_sa8.py index a5df4d85..1c09dd2e 100644 --- a/gen/sam/sam_sa8.py +++ b/gen/sam/sam_sa8.py @@ -11,6 +11,7 @@ class SA8Generator(GroupGenerator): """ name = "SA-8 OSA Site" + price = 55 def generate(self): self.add_unit(AirDefence.SAM_SA_8_Osa_9A33, "OSA", self.position.x, self.position.y, self.heading) diff --git a/gen/sam/sam_sa9.py b/gen/sam/sam_sa9.py index 9eeffe3c..d0045bea 100644 --- a/gen/sam/sam_sa9.py +++ b/gen/sam/sam_sa9.py @@ -11,6 +11,7 @@ class SA9Generator(GroupGenerator): """ name = "SA-9 Group" + price = 40 def generate(self): self.add_unit(Unarmed.Transport_UAZ_469, "UAZ", self.position.x, self.position.y, self.heading) diff --git a/gen/sam/sam_vulcan.py b/gen/sam/sam_vulcan.py index 71789e62..77cfc0a2 100644 --- a/gen/sam/sam_vulcan.py +++ b/gen/sam/sam_vulcan.py @@ -11,6 +11,7 @@ class VulcanGenerator(GroupGenerator): """ name = "Vulcan Group" + price = 25 def generate(self): self.add_unit(AirDefence.AAA_Vulcan_M163, "SPAAA", self.position.x, self.position.y, self.heading) diff --git a/gen/sam/sam_zsu23.py b/gen/sam/sam_zsu23.py index 33d1cde3..7c90cb4d 100644 --- a/gen/sam/sam_zsu23.py +++ b/gen/sam/sam_zsu23.py @@ -11,9 +11,10 @@ class ZSU23Generator(GroupGenerator): """ name = "ZSU-23 Group" + price = 50 def generate(self): - num_launchers = random.randint(2, 5) + num_launchers = random.randint(4, 5) positions = self.get_circular_position(num_launchers, launcher_distance=120, coverage=180) for i, position in enumerate(positions): diff --git a/gen/sam/sam_zu23.py b/gen/sam/sam_zu23.py index 1f4521cd..3134c3a7 100644 --- a/gen/sam/sam_zu23.py +++ b/gen/sam/sam_zu23.py @@ -11,10 +11,11 @@ class ZU23Generator(GroupGenerator): """ name = "ZU-23 Group" + price = 54 def generate(self): - grid_x = random.randint(2, 4) - grid_y = random.randint(2, 4) + grid_x = random.randint(2, 3) + grid_y = random.randint(2, 3) spacing = random.randint(10,40) diff --git a/gen/sam/sam_zu23_ural.py b/gen/sam/sam_zu23_ural.py index d6b08fac..1eb31b22 100644 --- a/gen/sam/sam_zu23_ural.py +++ b/gen/sam/sam_zu23_ural.py @@ -11,6 +11,7 @@ class ZU23UralGenerator(GroupGenerator): """ name = "ZU-23 Ural Group" + price = 64 def generate(self): num_launchers = random.randint(2, 8) diff --git a/gen/sam/sam_zu23_ural_insurgent.py b/gen/sam/sam_zu23_ural_insurgent.py index 55c72196..4512cfc7 100644 --- a/gen/sam/sam_zu23_ural_insurgent.py +++ b/gen/sam/sam_zu23_ural_insurgent.py @@ -11,6 +11,7 @@ class ZU23UralInsurgentGenerator(GroupGenerator): """ name = "ZU-23 Ural Insurgent Group" + price = 64 def generate(self): num_launchers = random.randint(2, 8) diff --git a/qt_ui/widgets/QTopPanel.py b/qt_ui/widgets/QTopPanel.py index 2a77cb23..30725095 100644 --- a/qt_ui/widgets/QTopPanel.py +++ b/qt_ui/widgets/QTopPanel.py @@ -21,6 +21,7 @@ class QTopPanel(QFrame): self.setMaximumHeight(70) self.init_ui() GameUpdateSignal.get_instance().gameupdated.connect(self.setGame) + GameUpdateSignal.get_instance().budgetupdated.connect(self.budget_update) def init_ui(self): @@ -101,4 +102,7 @@ class QTopPanel(QFrame): def proceed(self): self.subwindow = QMissionPlanning(self.game) - self.subwindow.show() \ No newline at end of file + self.subwindow.show() + + def budget_update(self, game:Game): + self.budgetBox.setGame(game) diff --git a/qt_ui/windows/GameUpdateSignal.py b/qt_ui/windows/GameUpdateSignal.py index 86546757..dd32dd58 100644 --- a/qt_ui/windows/GameUpdateSignal.py +++ b/qt_ui/windows/GameUpdateSignal.py @@ -16,6 +16,7 @@ class GameUpdateSignal(QObject): instance = None gameupdated = Signal(Game) + budgetupdated = Signal(Game) debriefingReceived = Signal(DebriefingSignal) def __init__(self): @@ -25,6 +26,9 @@ class GameUpdateSignal(QObject): def updateGame(self, game: Game): self.gameupdated.emit(game) + def updateBudget(self, game: Game): + self.budgetupdated.emit(game) + def sendDebriefing(self, game: Game, gameEvent: Event, debriefing: Debriefing): sig = DebriefingSignal(game, gameEvent, debriefing) self.gameupdated.emit(game) diff --git a/qt_ui/windows/basemenu/base_defenses/QBaseDefenseGroupInfo.py b/qt_ui/windows/basemenu/base_defenses/QBaseDefenseGroupInfo.py index 2b2abb67..836c1772 100644 --- a/qt_ui/windows/basemenu/base_defenses/QBaseDefenseGroupInfo.py +++ b/qt_ui/windows/basemenu/base_defenses/QBaseDefenseGroupInfo.py @@ -1,3 +1,4 @@ +from PySide2.QtCore import Qt from PySide2.QtWidgets import QGridLayout, QLabel, QGroupBox, QPushButton from qt_ui.uiconstants import VEHICLES_ICONS @@ -28,21 +29,21 @@ class QBaseDefenseGroupInfo(QGroupBox): unit_dict[u.type] = 1 i = 0 for k, v in unit_dict.items(): - #icon = QLabel() - #if k in VEHICLES_ICONS.keys(): - # icon.setPixmap(VEHICLES_ICONS[k]) - #else: - # icon.setText("" + k[:6] + "") - #icon.setProperty("style", "icon-plane") - #layout.addWidget(icon, i, 0) - layout.addWidget(QLabel(str(v) + " x " + "" + k + ""), i, 0) + icon = QLabel() + if k in VEHICLES_ICONS.keys(): + icon.setPixmap(VEHICLES_ICONS[k]) + else: + icon.setText("" + k[:6] + "") + icon.setProperty("style", "icon-plane") + layout.addWidget(icon, i, 0) + layout.addWidget(QLabel(str(v) + " x " + "" + k + ""), i, 1) i = i + 1 manage_button = QPushButton("Manage") manage_button.setProperty("style", "btn-success") manage_button.setMaximumWidth(180) manage_button.clicked.connect(self.onManage) - layout.addWidget(manage_button, i+1, 0) + layout.addWidget(manage_button, i, 0, Qt.AlignLeft) self.setLayout(layout) def onManage(self): diff --git a/qt_ui/windows/groundobject/QGroundObjectMenu.py b/qt_ui/windows/groundobject/QGroundObjectMenu.py index 6e67d0c7..6b8c9ed1 100644 --- a/qt_ui/windows/groundobject/QGroundObjectMenu.py +++ b/qt_ui/windows/groundobject/QGroundObjectMenu.py @@ -1,12 +1,16 @@ import logging -from PySide2.QtGui import QCloseEvent -from PySide2.QtWidgets import QHBoxLayout, QWidget, QDialog, QGridLayout, QLabel, QGroupBox, QVBoxLayout, QPushButton +from PySide2 import QtCore +from PySide2.QtGui import QCloseEvent, Qt +from PySide2.QtWidgets import QHBoxLayout, QDialog, QGridLayout, QLabel, QGroupBox, QVBoxLayout, QPushButton, \ + QComboBox, QSpinBox, QMessageBox from dcs import Point -from game import Game +from game import Game, db from game.data.building_data import FORTIFICATION_BUILDINGS -from game.db import PRICES, unit_type_of +from game.db import PRICES, unit_type_of, PinpointStrike +from gen.defenses.armor_group_generator import generate_armor_group +from gen.sam.sam_group_generator import get_faction_possible_sams_generator from qt_ui.uiconstants import EVENT_ICONS from qt_ui.widgets.QBudgetBox import QBudgetBox from qt_ui.windows.GameUpdateSignal import GameUpdateSignal @@ -29,6 +33,7 @@ class QGroundObjectMenu(QDialog): self.buildingBox = QGroupBox("Buildings :") self.intelLayout = QGridLayout() self.buildingsLayout = QGridLayout() + self.sell_all_button = None self.total_value = 0 self.init_ui() @@ -46,11 +51,20 @@ class QGroundObjectMenu(QDialog): self.mainLayout.addWidget(self.buildingBox) self.actionLayout = QHBoxLayout() - sell_all_button = QPushButton("Disband (+" + str(self.total_value) + "M)") - sell_all_button.clicked.connect(self.sell_all) - self.actionLayout.addWidget(sell_all_button) + + self.sell_all_button = QPushButton("Disband (+" + str(self.total_value) + "M)") + self.sell_all_button.clicked.connect(self.sell_all) + self.sell_all_button.setProperty("style", "btn-danger") + + self.buy_replace = QPushButton("Buy/Replace") + self.buy_replace.clicked.connect(self.buy_group) + self.buy_replace.setProperty("style", "btn-success") if self.total_value > 0: + self.actionLayout.addWidget(self.sell_all_button) + self.actionLayout.addWidget(self.buy_replace) + + if self.cp.captured: self.mainLayout.addLayout(self.actionLayout) self.setLayout(self.mainLayout) @@ -82,6 +96,9 @@ class QGroundObjectMenu(QDialog): repair.clicked.connect(lambda u=u, g=g, p=price: self.repair_unit(g, u, p)) self.intelLayout.addWidget(repair, i, 1) i = i + 1 + stretch = QVBoxLayout() + stretch.addStretch() + self.intelLayout.addLayout(stretch, i, 0) self.buildingBox = QGroupBox("Buildings :") self.buildingsLayout = QGridLayout() @@ -97,12 +114,27 @@ class QGroundObjectMenu(QDialog): def do_refresh_layout(self): try: for i in range(self.mainLayout.count()): - self.mainLayout.removeItem(self.mainLayout.itemAt(i)) + item = self.mainLayout.itemAt(i) + if item is not None and item.widget() is not None: + item.widget().setParent(None) + self.sell_all_button.setParent(None) + self.buy_replace.setParent(None) + self.actionLayout.setParent(None) + self.doLayout() - if len(self.ground_object.groups) > 0: + if self.ground_object.dcs_identifier == "AA": self.mainLayout.addWidget(self.intelBox) else: self.mainLayout.addWidget(self.buildingBox) + + self.actionLayout = QHBoxLayout() + if self.total_value > 0: + self.actionLayout.addWidget(self.sell_all_button) + self.actionLayout.addWidget(self.buy_replace) + + if self.cp.captured: + self.mainLayout.addLayout(self.actionLayout) + except Exception as e: print(e) self.update_total_value() @@ -116,6 +148,8 @@ class QGroundObjectMenu(QDialog): total_value = total_value + PRICES[utype] else: total_value = total_value + 1 + if self.sell_all_button is not None: + self.sell_all_button.setText("Disband (+$" + str(self.total_value) + "M)") self.total_value = total_value def repair_unit(self, group, unit, price): @@ -140,10 +174,163 @@ class QGroundObjectMenu(QDialog): self.update_total_value() self.game.budget = self.game.budget + self.total_value self.ground_object.groups = [] - GameUpdateSignal.get_instance().updateGame(self.game) + self.do_refresh_layout() + GameUpdateSignal.get_instance().updateBudget(self.game) def buy_group(self): - pass + self.subwindow = QBuyGroupForGroundObjectDialog(self, self.ground_object, self.cp, self.game, self.total_value) + self.subwindow.changed.connect(self.do_refresh_layout) + self.subwindow.show() + def closeEvent(self, closeEvent: QCloseEvent): pass + + +class QBuyGroupForGroundObjectDialog(QDialog): + + changed = QtCore.Signal() + + def __init__(self, parent, ground_object: TheaterGroundObject, cp: ControlPoint, game: Game, current_group_value: int): + super(QBuyGroupForGroundObjectDialog, self).__init__(parent) + + self.setMinimumWidth(350) + self.ground_object = ground_object + self.cp = cp + self.game = game + self.current_group_value = current_group_value + + self.setWindowTitle("Buy units @ " + self.ground_object.obj_name) + self.setWindowIcon(EVENT_ICONS["capture"]) + + self.buySamButton = QPushButton("Buy") + self.buyArmorButton = QPushButton("Buy") + self.buySamLayout = QGridLayout() + self.buyArmorLayout = QGridLayout() + self.amount = QSpinBox() + self.buyArmorCombo = QComboBox() + self.samCombo = QComboBox() + self.buySamBox = QGroupBox("Buy SAM site :") + self.buyArmorBox = QGroupBox("Buy defensive position :") + + + + self.init_ui() + + def init_ui(self): + faction = self.game.player_name + + # Sams + + possible_sams = get_faction_possible_sams_generator(faction) + for sam in possible_sams: + self.samCombo.addItem(sam.name + " [$" + str(sam.price) + "M]", userData=sam) + self.samCombo.currentIndexChanged.connect(self.samComboChanged) + + self.buySamLayout.addWidget(QLabel("Site Type :"), 0, 0, Qt.AlignLeft) + self.buySamLayout.addWidget(self.samCombo, 0, 1, alignment=Qt.AlignRight) + self.buySamLayout.addWidget(self.buySamButton, 1, 1, alignment=Qt.AlignRight) + stretch = QVBoxLayout() + stretch.addStretch() + self.buySamLayout.addLayout(stretch, 2, 0) + + self.buySamButton.clicked.connect(self.buySam) + + # Armored units + + armored_units = db.find_unittype(PinpointStrike, faction) # Todo : refactor this legacy nonsense + for unit in set(armored_units): + self.buyArmorCombo.addItem(db.unit_type_name_2(unit) + " [$" + str(db.PRICES[unit]) + "M]", userData=unit) + self.buyArmorCombo.currentIndexChanged.connect(self.armorComboChanged) + + self.amount.setMinimum(2) + self.amount.setMaximum(8) + self.amount.setValue(2) + self.amount.valueChanged.connect(self.amountComboChanged) + + self.buyArmorLayout.addWidget(QLabel("Unit type :"), 0, 0, Qt.AlignLeft) + self.buyArmorLayout.addWidget(self.buyArmorCombo, 0, 1, alignment=Qt.AlignRight) + self.buyArmorLayout.addWidget(QLabel("Group size :"), 1, 0, alignment=Qt.AlignLeft) + self.buyArmorLayout.addWidget(self.amount, 1, 1, alignment=Qt.AlignRight) + self.buyArmorLayout.addWidget(self.buyArmorButton, 2, 1, alignment=Qt.AlignRight) + stretch2 = QVBoxLayout() + stretch2.addStretch() + self.buyArmorLayout.addLayout(stretch2, 3, 0) + + self.buyArmorButton.clicked.connect(self.buyArmor) + + # Do layout + self.buySamBox.setLayout(self.buySamLayout) + self.buyArmorBox.setLayout(self.buyArmorLayout) + + self.mainLayout = QHBoxLayout() + self.mainLayout.addWidget(self.buySamBox) + + if self.ground_object.airbase_group: + self.mainLayout.addWidget(self.buyArmorBox) + + self.setLayout(self.mainLayout) + + try: + self.samComboChanged(0) + self.armorComboChanged(0) + except: + pass + + def samComboChanged(self, index): + self.buySamButton.setText("Buy [$" + str(self.samCombo.itemData(index).price) + "M] [-$" + str(self.current_group_value) + "M]") + + def armorComboChanged(self, index): + self.buyArmorButton.setText("Buy [$" + str(db.PRICES[self.buyArmorCombo.itemData(index)] * self.amount.value()) + "M][-$" + str(self.current_group_value) + "M]") + + def amountComboChanged(self): + self.buyArmorButton.setText("Buy [$" + str(db.PRICES[self.buyArmorCombo.itemData(self.buyArmorCombo.currentIndex())] * self.amount.value()) + "M][-$" + str(self.current_group_value) + "M]") + + def buyArmor(self): + utype = self.buyArmorCombo.itemData(self.buyArmorCombo.currentIndex()) + price = db.PRICES[utype] * self.amount.value() - self.current_group_value + if price > self.game.budget: + self.error_money() + self.close() + return + else: + self.game.budget -= price + + # Generate Armor + group = generate_armor_group(self.game.player_name, self.game, self.ground_object) + self.ground_object.groups = [group] + + GameUpdateSignal.get_instance().updateBudget(self.game) + + self.changed.emit() + self.close() + + def buySam(self): + sam_generator = self.samCombo.itemData(self.samCombo.currentIndex()) + price = sam_generator.price - self.current_group_value + if price > self.game.budget: + self.error_money() + return + else: + self.game.budget -= price + + # Generate SAM + generator = sam_generator(self.game, self.ground_object) + generator.generate() + generated_group = generator.get_generated_group() + self.ground_object.groups = [generated_group] + + GameUpdateSignal.get_instance().updateBudget(self.game) + + self.changed.emit() + self.close() + + def error_money(self): + msg = QMessageBox() + msg.setIcon(QMessageBox.Information) + msg.setText("Not enough money to buy these units !") + msg.setWindowTitle("Not enough money") + msg.setStandardButtons(QMessageBox.Ok) + msg.setWindowFlags(Qt.WindowStaysOnTopHint) + msg.exec_() + self.close() \ No newline at end of file