mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Possible to sell/buy units at SAM location and in airports.
This commit is contained in:
parent
65dd9bc286
commit
4031c9b978
16
game/db.py
16
game/db.py
@ -337,15 +337,15 @@ PRICES = {
|
|||||||
AirDefence.SAM_SA_11_Buk_LN_9A310M1: 30,
|
AirDefence.SAM_SA_11_Buk_LN_9A310M1: 30,
|
||||||
AirDefence.SAM_SA_8_Osa_9A33: 28,
|
AirDefence.SAM_SA_8_Osa_9A33: 28,
|
||||||
AirDefence.SAM_SA_15_Tor_9A331: 40,
|
AirDefence.SAM_SA_15_Tor_9A331: 40,
|
||||||
AirDefence.SAM_SA_13_Strela_10M3_9A35M3: 24,
|
AirDefence.SAM_SA_13_Strela_10M3_9A35M3: 16,
|
||||||
AirDefence.SAM_SA_9_Strela_1_9P31: 16,
|
AirDefence.SAM_SA_9_Strela_1_9P31: 12,
|
||||||
AirDefence.SAM_SA_11_Buk_CC_9S470M1: 25,
|
AirDefence.SAM_SA_11_Buk_CC_9S470M1: 25,
|
||||||
AirDefence.SAM_SA_8_Osa_LD_9T217: 22,
|
AirDefence.SAM_SA_8_Osa_LD_9T217: 22,
|
||||||
AirDefence.SAM_Patriot_AMG_AN_MRC_137: 35,
|
AirDefence.SAM_Patriot_AMG_AN_MRC_137: 35,
|
||||||
AirDefence.SAM_Patriot_ECS_AN_MSQ_104: 30,
|
AirDefence.SAM_Patriot_ECS_AN_MSQ_104: 30,
|
||||||
AirDefence.SPAAA_Gepard: 24,
|
AirDefence.SPAAA_Gepard: 24,
|
||||||
AirDefence.SAM_Hawk_PCP: 14,
|
AirDefence.SAM_Hawk_PCP: 14,
|
||||||
AirDefence.AAA_Vulcan_M163: 12,
|
AirDefence.AAA_Vulcan_M163: 10,
|
||||||
AirDefence.SAM_Hawk_LN_M192: 8,
|
AirDefence.SAM_Hawk_LN_M192: 8,
|
||||||
AirDefence.SAM_Chaparral_M48: 16,
|
AirDefence.SAM_Chaparral_M48: 16,
|
||||||
AirDefence.SAM_Linebacker_M6: 18,
|
AirDefence.SAM_Linebacker_M6: 18,
|
||||||
@ -358,7 +358,7 @@ PRICES = {
|
|||||||
AirDefence.Stinger_MANPADS: 6,
|
AirDefence.Stinger_MANPADS: 6,
|
||||||
AirDefence.SAM_Stinger_comm_dsr: 4,
|
AirDefence.SAM_Stinger_comm_dsr: 4,
|
||||||
AirDefence.SAM_Stinger_comm: 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_Closed: 6,
|
||||||
AirDefence.AAA_ZU_23_Emplacement: 6,
|
AirDefence.AAA_ZU_23_Emplacement: 6,
|
||||||
AirDefence.AAA_ZU_23_on_Ural_375: 8,
|
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_LN_SM_90: 8,
|
||||||
AirDefence.SAM_SA_2_TR_SNR_75_Fan_Song: 12,
|
AirDefence.SAM_SA_2_TR_SNR_75_Fan_Song: 12,
|
||||||
AirDefence.Rapier_FSA_Launcher: 6,
|
AirDefence.Rapier_FSA_Launcher: 6,
|
||||||
AirDefence.Rapier_FSA_Optical_Tracker: 12,
|
AirDefence.Rapier_FSA_Optical_Tracker: 6,
|
||||||
AirDefence.Rapier_FSA_Blindfire_Tracker: 16,
|
AirDefence.Rapier_FSA_Blindfire_Tracker: 8,
|
||||||
AirDefence.HQ_7_Self_Propelled_LN: 20,
|
AirDefence.HQ_7_Self_Propelled_LN: 20,
|
||||||
AirDefence.HQ_7_Self_Propelled_STR: 24,
|
AirDefence.HQ_7_Self_Propelled_STR: 24,
|
||||||
AirDefence.AAA_8_8cm_Flak_18: 6,
|
AirDefence.AAA_8_8cm_Flak_18: 6,
|
||||||
AirDefence.AAA_Flak_38: 6,
|
AirDefence.AAA_Flak_38: 6,
|
||||||
AirDefence.AAA_8_8cm_Flak_36: 8,
|
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_Flak_Vierling_38:6,
|
||||||
AirDefence.AAA_Kdo_G_40: 8,
|
AirDefence.AAA_Kdo_G_40: 8,
|
||||||
AirDefence.Flak_Searchlight_37: 4,
|
AirDefence.Flak_Searchlight_37: 4,
|
||||||
AirDefence.Maschinensatz_33: 10,
|
AirDefence.Maschinensatz_33: 10,
|
||||||
AirDefence.AAA_8_8cm_Flak_41: 12,
|
AirDefence.AAA_8_8cm_Flak_41: 10,
|
||||||
AirDefence.AAA_Bofors_40mm: 8,
|
AirDefence.AAA_Bofors_40mm: 8,
|
||||||
|
|
||||||
# FRENCH PACK MOD
|
# FRENCH PACK MOD
|
||||||
|
|||||||
@ -11,10 +11,11 @@ class BoforsGenerator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "Bofors AAA"
|
name = "Bofors AAA"
|
||||||
|
price = 75
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
grid_x = random.randint(2, 4)
|
grid_x = random.randint(2, 3)
|
||||||
grid_y = random.randint(2, 4)
|
grid_y = random.randint(2, 3)
|
||||||
|
|
||||||
spacing = random.randint(10,40)
|
spacing = random.randint(10,40)
|
||||||
|
|
||||||
|
|||||||
@ -12,12 +12,13 @@ class FlakGenerator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "Flak Site"
|
name = "Flak Site"
|
||||||
|
price = 135
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
grid_x = random.randint(2, 4)
|
grid_x = random.randint(2, 3)
|
||||||
grid_y = random.randint(2, 4)
|
grid_y = random.randint(2, 3)
|
||||||
|
|
||||||
spacing = random.randint(30,60)
|
spacing = random.randint(30, 60)
|
||||||
|
|
||||||
index = 0
|
index = 0
|
||||||
mixed = random.choice([True, False])
|
mixed = random.choice([True, False])
|
||||||
@ -34,7 +35,7 @@ class FlakGenerator(GroupGenerator):
|
|||||||
unit_type = random.choice(GFLAK)
|
unit_type = random.choice(GFLAK)
|
||||||
|
|
||||||
# Search lights
|
# 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):
|
for index, pos in enumerate(search_pos):
|
||||||
self.add_unit(AirDefence.Flak_Searchlight_37, "SearchLight#" + str(index), pos[0], pos[1], self.heading)
|
self.add_unit(AirDefence.Flak_Searchlight_37, "SearchLight#" + str(index), pos[0], pos[1], self.heading)
|
||||||
|
|
||||||
|
|||||||
@ -11,10 +11,11 @@ class ZU23InsurgentGenerator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "Zu-23 Site"
|
name = "Zu-23 Site"
|
||||||
|
price = 56
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
grid_x = random.randint(2, 4)
|
grid_x = random.randint(2, 3)
|
||||||
grid_y = random.randint(2, 4)
|
grid_y = random.randint(2, 3)
|
||||||
|
|
||||||
spacing = random.randint(10,40)
|
spacing = random.randint(10,40)
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class AvengerGenerator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "Avenger Group"
|
name = "Avenger Group"
|
||||||
|
price = 62
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
num_launchers = random.randint(2, 3)
|
num_launchers = random.randint(2, 3)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class ChaparralGenerator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "Chaparral Group"
|
name = "Chaparral Group"
|
||||||
|
price = 66
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
num_launchers = random.randint(2, 4)
|
num_launchers = random.randint(2, 4)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class GepardGenerator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "Gepard Group"
|
name = "Gepard Group"
|
||||||
|
price = 50
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(AirDefence.SPAAA_Gepard, "SPAAA", self.position.x, self.position.y, self.heading)
|
self.add_unit(AirDefence.SPAAA_Gepard, "SPAAA", self.position.x, self.position.y, self.heading)
|
||||||
|
|||||||
@ -101,16 +101,22 @@ SAM_PRICES = {
|
|||||||
AirDefence.HQ_7_Self_Propelled_LN: 35
|
AirDefence.HQ_7_Self_Propelled_LN: 35
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def get_faction_possible_sams_units(faction: str) -> List[UnitType]:
|
def get_faction_possible_sams_units(faction: str) -> List[UnitType]:
|
||||||
"""
|
"""
|
||||||
Return the list
|
Return the list
|
||||||
:param faction: Faction to search units for
|
:param faction: Faction to search units for
|
||||||
:return:
|
|
||||||
"""
|
"""
|
||||||
return [u for u in db.FACTIONS[faction]["units"] if u in AirDefence.__dict__.values()]
|
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):
|
def generate_anti_air_group(game, parent_cp, ground_object, faction:str):
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class HawkGenerator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "Hawk Site"
|
name = "Hawk Site"
|
||||||
|
price = 115
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(AirDefence.SAM_Hawk_PCP, "PCP", self.position.x, self.position.y, self.heading)
|
self.add_unit(AirDefence.SAM_Hawk_PCP, "PCP", self.position.x, self.position.y, self.heading)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class HQ7Generator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "HQ-7 Site"
|
name = "HQ-7 Site"
|
||||||
|
price = 120
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(AirDefence.HQ_7_Self_Propelled_STR, "STR", self.position.x, self.position.y, self.heading)
|
self.add_unit(AirDefence.HQ_7_Self_Propelled_STR, "STR", self.position.x, self.position.y, self.heading)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class LinebackerGenerator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "Linebacker Group"
|
name = "Linebacker Group"
|
||||||
|
price = 75
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
num_launchers = random.randint(2, 4)
|
num_launchers = random.randint(2, 4)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class PatriotGenerator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "Patriot Battery"
|
name = "Patriot Battery"
|
||||||
|
price = 240
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
# Command Post
|
# 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_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)
|
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)
|
positions = self.get_circular_position(num_launchers, launcher_distance=120, coverage=360)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(AirDefence.SAM_Patriot_LN_M901, "LN#" + str(i), position[0], position[1], position[2])
|
self.add_unit(AirDefence.SAM_Patriot_LN_M901, "LN#" + str(i), position[0], position[1], position[2])
|
||||||
|
|
||||||
# Short range protection for high value site
|
# 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)
|
positions = self.get_circular_position(num_launchers, launcher_distance=300, coverage=360)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
self.add_unit(AirDefence.AAA_Vulcan_M163, "SPAAA#" + str(i), position[0], position[1], position[2])
|
self.add_unit(AirDefence.AAA_Vulcan_M163, "SPAAA#" + str(i), position[0], position[1], position[2])
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class RapierGenerator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "Rapier AA Site"
|
name = "Rapier AA Site"
|
||||||
|
price = 50
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(AirDefence.Rapier_FSA_Blindfire_Tracker, "BT", self.position.x, self.position.y, self.heading)
|
self.add_unit(AirDefence.Rapier_FSA_Blindfire_Tracker, "BT", self.position.x, self.position.y, self.heading)
|
||||||
|
|||||||
@ -9,6 +9,7 @@ class RolandGenerator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "Roland Site"
|
name = "Roland Site"
|
||||||
|
price = 40
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(AirDefence.SAM_Roland_ADS, "ADS", self.position.x, self.position.y, self.heading)
|
self.add_unit(AirDefence.SAM_Roland_ADS, "ADS", self.position.x, self.position.y, self.heading)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class SA10Generator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "SA-10/S-300PS Battery"
|
name = "SA-10/S-300PS Battery"
|
||||||
|
price = 450
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
# Command Post
|
# Command Post
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class SA11Generator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "SA-11 Buk Battery"
|
name = "SA-11 Buk Battery"
|
||||||
|
price = 180
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(AirDefence.SAM_SA_11_Buk_CC_9S470M1, "CC", self.position.x, self.position.y, self.heading)
|
self.add_unit(AirDefence.SAM_SA_11_Buk_CC_9S470M1, "CC", self.position.x, self.position.y, self.heading)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class SA13Generator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "SA-13 Strela Group"
|
name = "SA-13 Strela Group"
|
||||||
|
price = 50
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(Unarmed.Transport_UAZ_469, "UAZ", self.position.x, self.position.y, self.heading)
|
self.add_unit(Unarmed.Transport_UAZ_469, "UAZ", self.position.x, self.position.y, self.heading)
|
||||||
|
|||||||
@ -9,6 +9,7 @@ class SA15Generator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "SA-15 Tor Group"
|
name = "SA-15 Tor Group"
|
||||||
|
price = 55
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(AirDefence.SAM_SA_15_Tor_9A331, "ADS", self.position.x, self.position.y, self.heading)
|
self.add_unit(AirDefence.SAM_SA_15_Tor_9A331, "ADS", self.position.x, self.position.y, self.heading)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class SA19Generator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "SA-19 Tunguska Group"
|
name = "SA-19 Tunguska Group"
|
||||||
|
price = 90
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
num_launchers = random.randint(1, 3)
|
num_launchers = random.randint(1, 3)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class SA2Generator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "SA-2/S-75 Site"
|
name = "SA-2/S-75 Site"
|
||||||
|
price = 74
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(AirDefence.SAM_SR_P_19, "SR", self.position.x, self.position.y, self.heading)
|
self.add_unit(AirDefence.SAM_SR_P_19, "SR", self.position.x, self.position.y, self.heading)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class SA3Generator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "SA-3/S-125 Site"
|
name = "SA-3/S-125 Site"
|
||||||
|
price = 80
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(AirDefence.SAM_SR_P_19, "SR", self.position.x, self.position.y, self.heading)
|
self.add_unit(AirDefence.SAM_SR_P_19, "SR", self.position.x, self.position.y, self.heading)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class SA6Generator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "SA-6 Kub Site"
|
name = "SA-6 Kub Site"
|
||||||
|
price = 102
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(AirDefence.SAM_SA_6_Kub_STR_9S91, "STR", self.position.x, self.position.y, self.heading)
|
self.add_unit(AirDefence.SAM_SA_6_Kub_STR_9S91, "STR", self.position.x, self.position.y, self.heading)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class SA8Generator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "SA-8 OSA Site"
|
name = "SA-8 OSA Site"
|
||||||
|
price = 55
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(AirDefence.SAM_SA_8_Osa_9A33, "OSA", self.position.x, self.position.y, self.heading)
|
self.add_unit(AirDefence.SAM_SA_8_Osa_9A33, "OSA", self.position.x, self.position.y, self.heading)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class SA9Generator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "SA-9 Group"
|
name = "SA-9 Group"
|
||||||
|
price = 40
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(Unarmed.Transport_UAZ_469, "UAZ", self.position.x, self.position.y, self.heading)
|
self.add_unit(Unarmed.Transport_UAZ_469, "UAZ", self.position.x, self.position.y, self.heading)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class VulcanGenerator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "Vulcan Group"
|
name = "Vulcan Group"
|
||||||
|
price = 25
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
self.add_unit(AirDefence.AAA_Vulcan_M163, "SPAAA", self.position.x, self.position.y, self.heading)
|
self.add_unit(AirDefence.AAA_Vulcan_M163, "SPAAA", self.position.x, self.position.y, self.heading)
|
||||||
|
|||||||
@ -11,9 +11,10 @@ class ZSU23Generator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "ZSU-23 Group"
|
name = "ZSU-23 Group"
|
||||||
|
price = 50
|
||||||
|
|
||||||
def generate(self):
|
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)
|
positions = self.get_circular_position(num_launchers, launcher_distance=120, coverage=180)
|
||||||
for i, position in enumerate(positions):
|
for i, position in enumerate(positions):
|
||||||
|
|||||||
@ -11,10 +11,11 @@ class ZU23Generator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "ZU-23 Group"
|
name = "ZU-23 Group"
|
||||||
|
price = 54
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
grid_x = random.randint(2, 4)
|
grid_x = random.randint(2, 3)
|
||||||
grid_y = random.randint(2, 4)
|
grid_y = random.randint(2, 3)
|
||||||
|
|
||||||
spacing = random.randint(10,40)
|
spacing = random.randint(10,40)
|
||||||
|
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class ZU23UralGenerator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "ZU-23 Ural Group"
|
name = "ZU-23 Ural Group"
|
||||||
|
price = 64
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
num_launchers = random.randint(2, 8)
|
num_launchers = random.randint(2, 8)
|
||||||
|
|||||||
@ -11,6 +11,7 @@ class ZU23UralInsurgentGenerator(GroupGenerator):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
name = "ZU-23 Ural Insurgent Group"
|
name = "ZU-23 Ural Insurgent Group"
|
||||||
|
price = 64
|
||||||
|
|
||||||
def generate(self):
|
def generate(self):
|
||||||
num_launchers = random.randint(2, 8)
|
num_launchers = random.randint(2, 8)
|
||||||
|
|||||||
@ -21,6 +21,7 @@ class QTopPanel(QFrame):
|
|||||||
self.setMaximumHeight(70)
|
self.setMaximumHeight(70)
|
||||||
self.init_ui()
|
self.init_ui()
|
||||||
GameUpdateSignal.get_instance().gameupdated.connect(self.setGame)
|
GameUpdateSignal.get_instance().gameupdated.connect(self.setGame)
|
||||||
|
GameUpdateSignal.get_instance().budgetupdated.connect(self.budget_update)
|
||||||
|
|
||||||
def init_ui(self):
|
def init_ui(self):
|
||||||
|
|
||||||
@ -101,4 +102,7 @@ class QTopPanel(QFrame):
|
|||||||
|
|
||||||
def proceed(self):
|
def proceed(self):
|
||||||
self.subwindow = QMissionPlanning(self.game)
|
self.subwindow = QMissionPlanning(self.game)
|
||||||
self.subwindow.show()
|
self.subwindow.show()
|
||||||
|
|
||||||
|
def budget_update(self, game:Game):
|
||||||
|
self.budgetBox.setGame(game)
|
||||||
|
|||||||
@ -16,6 +16,7 @@ class GameUpdateSignal(QObject):
|
|||||||
|
|
||||||
instance = None
|
instance = None
|
||||||
gameupdated = Signal(Game)
|
gameupdated = Signal(Game)
|
||||||
|
budgetupdated = Signal(Game)
|
||||||
debriefingReceived = Signal(DebriefingSignal)
|
debriefingReceived = Signal(DebriefingSignal)
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
@ -25,6 +26,9 @@ class GameUpdateSignal(QObject):
|
|||||||
def updateGame(self, game: Game):
|
def updateGame(self, game: Game):
|
||||||
self.gameupdated.emit(game)
|
self.gameupdated.emit(game)
|
||||||
|
|
||||||
|
def updateBudget(self, game: Game):
|
||||||
|
self.budgetupdated.emit(game)
|
||||||
|
|
||||||
def sendDebriefing(self, game: Game, gameEvent: Event, debriefing: Debriefing):
|
def sendDebriefing(self, game: Game, gameEvent: Event, debriefing: Debriefing):
|
||||||
sig = DebriefingSignal(game, gameEvent, debriefing)
|
sig = DebriefingSignal(game, gameEvent, debriefing)
|
||||||
self.gameupdated.emit(game)
|
self.gameupdated.emit(game)
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
from PySide2.QtCore import Qt
|
||||||
from PySide2.QtWidgets import QGridLayout, QLabel, QGroupBox, QPushButton
|
from PySide2.QtWidgets import QGridLayout, QLabel, QGroupBox, QPushButton
|
||||||
|
|
||||||
from qt_ui.uiconstants import VEHICLES_ICONS
|
from qt_ui.uiconstants import VEHICLES_ICONS
|
||||||
@ -28,21 +29,21 @@ class QBaseDefenseGroupInfo(QGroupBox):
|
|||||||
unit_dict[u.type] = 1
|
unit_dict[u.type] = 1
|
||||||
i = 0
|
i = 0
|
||||||
for k, v in unit_dict.items():
|
for k, v in unit_dict.items():
|
||||||
#icon = QLabel()
|
icon = QLabel()
|
||||||
#if k in VEHICLES_ICONS.keys():
|
if k in VEHICLES_ICONS.keys():
|
||||||
# icon.setPixmap(VEHICLES_ICONS[k])
|
icon.setPixmap(VEHICLES_ICONS[k])
|
||||||
#else:
|
else:
|
||||||
# icon.setText("<b>" + k[:6] + "</b>")
|
icon.setText("<b>" + k[:6] + "</b>")
|
||||||
#icon.setProperty("style", "icon-plane")
|
icon.setProperty("style", "icon-plane")
|
||||||
#layout.addWidget(icon, i, 0)
|
layout.addWidget(icon, i, 0)
|
||||||
layout.addWidget(QLabel(str(v) + " x " + "<strong>" + k + "</strong>"), i, 0)
|
layout.addWidget(QLabel(str(v) + " x " + "<strong>" + k + "</strong>"), i, 1)
|
||||||
i = i + 1
|
i = i + 1
|
||||||
|
|
||||||
manage_button = QPushButton("Manage")
|
manage_button = QPushButton("Manage")
|
||||||
manage_button.setProperty("style", "btn-success")
|
manage_button.setProperty("style", "btn-success")
|
||||||
manage_button.setMaximumWidth(180)
|
manage_button.setMaximumWidth(180)
|
||||||
manage_button.clicked.connect(self.onManage)
|
manage_button.clicked.connect(self.onManage)
|
||||||
layout.addWidget(manage_button, i+1, 0)
|
layout.addWidget(manage_button, i, 0, Qt.AlignLeft)
|
||||||
self.setLayout(layout)
|
self.setLayout(layout)
|
||||||
|
|
||||||
def onManage(self):
|
def onManage(self):
|
||||||
|
|||||||
@ -1,12 +1,16 @@
|
|||||||
import logging
|
import logging
|
||||||
|
|
||||||
from PySide2.QtGui import QCloseEvent
|
from PySide2 import QtCore
|
||||||
from PySide2.QtWidgets import QHBoxLayout, QWidget, QDialog, QGridLayout, QLabel, QGroupBox, QVBoxLayout, QPushButton
|
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 dcs import Point
|
||||||
|
|
||||||
from game import Game
|
from game import Game, db
|
||||||
from game.data.building_data import FORTIFICATION_BUILDINGS
|
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.uiconstants import EVENT_ICONS
|
||||||
from qt_ui.widgets.QBudgetBox import QBudgetBox
|
from qt_ui.widgets.QBudgetBox import QBudgetBox
|
||||||
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
|
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
|
||||||
@ -29,6 +33,7 @@ class QGroundObjectMenu(QDialog):
|
|||||||
self.buildingBox = QGroupBox("Buildings :")
|
self.buildingBox = QGroupBox("Buildings :")
|
||||||
self.intelLayout = QGridLayout()
|
self.intelLayout = QGridLayout()
|
||||||
self.buildingsLayout = QGridLayout()
|
self.buildingsLayout = QGridLayout()
|
||||||
|
self.sell_all_button = None
|
||||||
self.total_value = 0
|
self.total_value = 0
|
||||||
self.init_ui()
|
self.init_ui()
|
||||||
|
|
||||||
@ -46,11 +51,20 @@ class QGroundObjectMenu(QDialog):
|
|||||||
self.mainLayout.addWidget(self.buildingBox)
|
self.mainLayout.addWidget(self.buildingBox)
|
||||||
|
|
||||||
self.actionLayout = QHBoxLayout()
|
self.actionLayout = QHBoxLayout()
|
||||||
sell_all_button = QPushButton("Disband (+" + str(self.total_value) + "M)")
|
|
||||||
sell_all_button.clicked.connect(self.sell_all)
|
self.sell_all_button = QPushButton("Disband (+" + str(self.total_value) + "M)")
|
||||||
self.actionLayout.addWidget(sell_all_button)
|
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:
|
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.mainLayout.addLayout(self.actionLayout)
|
||||||
self.setLayout(self.mainLayout)
|
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))
|
repair.clicked.connect(lambda u=u, g=g, p=price: self.repair_unit(g, u, p))
|
||||||
self.intelLayout.addWidget(repair, i, 1)
|
self.intelLayout.addWidget(repair, i, 1)
|
||||||
i = i + 1
|
i = i + 1
|
||||||
|
stretch = QVBoxLayout()
|
||||||
|
stretch.addStretch()
|
||||||
|
self.intelLayout.addLayout(stretch, i, 0)
|
||||||
|
|
||||||
self.buildingBox = QGroupBox("Buildings :")
|
self.buildingBox = QGroupBox("Buildings :")
|
||||||
self.buildingsLayout = QGridLayout()
|
self.buildingsLayout = QGridLayout()
|
||||||
@ -97,12 +114,27 @@ class QGroundObjectMenu(QDialog):
|
|||||||
def do_refresh_layout(self):
|
def do_refresh_layout(self):
|
||||||
try:
|
try:
|
||||||
for i in range(self.mainLayout.count()):
|
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()
|
self.doLayout()
|
||||||
if len(self.ground_object.groups) > 0:
|
if self.ground_object.dcs_identifier == "AA":
|
||||||
self.mainLayout.addWidget(self.intelBox)
|
self.mainLayout.addWidget(self.intelBox)
|
||||||
else:
|
else:
|
||||||
self.mainLayout.addWidget(self.buildingBox)
|
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:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
self.update_total_value()
|
self.update_total_value()
|
||||||
@ -116,6 +148,8 @@ class QGroundObjectMenu(QDialog):
|
|||||||
total_value = total_value + PRICES[utype]
|
total_value = total_value + PRICES[utype]
|
||||||
else:
|
else:
|
||||||
total_value = total_value + 1
|
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
|
self.total_value = total_value
|
||||||
|
|
||||||
def repair_unit(self, group, unit, price):
|
def repair_unit(self, group, unit, price):
|
||||||
@ -140,10 +174,163 @@ class QGroundObjectMenu(QDialog):
|
|||||||
self.update_total_value()
|
self.update_total_value()
|
||||||
self.game.budget = self.game.budget + self.total_value
|
self.game.budget = self.game.budget + self.total_value
|
||||||
self.ground_object.groups = []
|
self.ground_object.groups = []
|
||||||
GameUpdateSignal.get_instance().updateGame(self.game)
|
self.do_refresh_layout()
|
||||||
|
GameUpdateSignal.get_instance().updateBudget(self.game)
|
||||||
|
|
||||||
def buy_group(self):
|
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):
|
def closeEvent(self, closeEvent: QCloseEvent):
|
||||||
pass
|
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()
|
||||||
Loading…
x
Reference in New Issue
Block a user