mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
95 lines
4.6 KiB
Python
95 lines
4.6 KiB
Python
from game.db import assigned_units_split
|
|
|
|
from .operation import *
|
|
|
|
|
|
class StrikeOperation(Operation):
|
|
strikegroup = None # type: db.AssignedUnitsDict
|
|
sead = None # type: db.AssignedUnitsDict
|
|
escort = None # type: db.AssignedUnitsDict
|
|
interceptors = None # type: db.AssignedUnitsDict
|
|
|
|
trigger_radius = TRIGGER_RADIUS_ALL_MAP
|
|
|
|
def setup(self,
|
|
strikegroup: db.AssignedUnitsDict,
|
|
sead: db.AssignedUnitsDict,
|
|
escort: db.AssignedUnitsDict,
|
|
interceptors: db.AssignedUnitsDict):
|
|
self.strikegroup = strikegroup
|
|
self.sead = sead
|
|
self.escort = escort
|
|
self.interceptors = interceptors
|
|
|
|
def prepare(self, terrain: Terrain, is_quick: bool):
|
|
super(StrikeOperation, self).prepare(terrain, is_quick)
|
|
|
|
self.defenders_starting_position = None
|
|
if self.game.player_name == self.defender_name:
|
|
self.attackers_starting_position = None
|
|
|
|
conflict = Conflict.strike_conflict(
|
|
attacker=self.current_mission.country(self.attacker_country),
|
|
defender=self.current_mission.country(self.defender_country),
|
|
from_cp=self.from_cp,
|
|
to_cp=self.to_cp,
|
|
theater=self.game.theater
|
|
)
|
|
|
|
self.initialize(mission=self.current_mission,
|
|
conflict=conflict)
|
|
|
|
def generate(self):
|
|
self.prepare_carriers(db.unitdict_merge(db.unitdict_from(self.strikegroup), db.unitdict_from(self.escort)))
|
|
|
|
targets = [] # type: typing.List[typing.Tuple[str, str, Point]]
|
|
sead_targets = [] # type: typing.List[typing.Tuple[str, str, Point]]
|
|
category_counters = {} # type: typing.Dict[str, int]
|
|
processed_groups = []
|
|
|
|
for object in self.to_cp.ground_objects:
|
|
if object.group_identifier in processed_groups:
|
|
continue
|
|
|
|
processed_groups.append(object.group_identifier)
|
|
category_counters[object.category] = category_counters.get(object.category, 0) + 1
|
|
markpoint_name = "{}{}".format(object.name_abbrev, category_counters[object.category])
|
|
|
|
if object.category == "aa":
|
|
sead_targets.append((str(object), markpoint_name, object.position))
|
|
|
|
targets.append((str(object), markpoint_name, object.position))
|
|
|
|
targets.sort(key=lambda x: self.from_cp.position.distance_to_point(x[2]))
|
|
|
|
for (name, markpoint_name, _) in targets:
|
|
self.briefinggen.append_waypoint("TARGET {} (TP {})".format(str(name), markpoint_name))
|
|
|
|
planes_flights = {k: v for k, v in self.strikegroup.items() if k in plane_map.values()}
|
|
self.airgen.generate_ground_attack_strikegroup(*assigned_units_split(planes_flights),
|
|
targets=[(mp, pos) for (n, mp, pos) in targets],
|
|
at=self.attackers_starting_position,
|
|
escort=len(self.sead) == 0)
|
|
|
|
self.airgen.generate_sead_strikegroup(*assigned_units_split(self.sead),
|
|
targets=[(mp, pos) for (n, mp, pos) in sead_targets],
|
|
at=self.attackers_starting_position,
|
|
escort=len(self.sead) > 0)
|
|
|
|
heli_flights = {k: v for k, v in self.strikegroup.items() if k in helicopters.helicopter_map.values()}
|
|
if heli_flights:
|
|
self.briefinggen.append_frequency("FARP", "127.5 MHz AM")
|
|
for farp, dict in zip(self.groundobjectgen.generate_farps(sum([x[0] for x in heli_flights.values()])),
|
|
db.assignedunits_split_to_count(heli_flights, self.groundobjectgen.FARP_CAPACITY)):
|
|
self.airgen.generate_ground_attack_strikegroup(*assigned_units_split(dict),
|
|
targets=[(mp, pos) for (n, mp, pos) in targets],
|
|
at=farp,
|
|
escort=len(planes_flights) == 0)
|
|
|
|
self.airgen.generate_attackers_escort(*assigned_units_split(self.escort), at=self.attackers_starting_position)
|
|
self.airgen.generate_barcap(*assigned_units_split(self.interceptors), at=self.defenders_starting_position)
|
|
|
|
self.briefinggen.title = "Strike"
|
|
self.briefinggen.description = "Destroy infrastructure assets and military supplies in the region. Each building destroyed will lower targets strength."
|
|
super(StrikeOperation, self).generate()
|