Group briefing data by package.

This is just the refactor to make way for the real change: adding a
package page to the kneeboard so players can get package-level
information like other radio, laser, and STNs.
This commit is contained in:
Dan Albert 2023-10-03 21:15:10 -07:00
parent f9916e47d8
commit e9133bffab
6 changed files with 91 additions and 79 deletions

View File

@ -3,7 +3,7 @@ from __future__ import annotations
import logging import logging
from datetime import datetime from datetime import datetime
from functools import cached_property from functools import cached_property
from typing import Any, Dict, List, TYPE_CHECKING from typing import Any, Dict, TYPE_CHECKING
from dcs.country import Country from dcs.country import Country
from dcs.mission import Mission from dcs.mission import Mission
@ -58,7 +58,9 @@ class AircraftGenerator:
self.radio_registry = radio_registry self.radio_registry = radio_registry
self.tacan_registy = tacan_registry self.tacan_registy = tacan_registry
self.unit_map = unit_map self.unit_map = unit_map
self.flights: List[FlightData] = [] # A list of per-package briefing data, which is in turn a list of per-flight
# briefing data.
self.briefing_data: list[list[FlightData]] = []
self.mission_data = mission_data self.mission_data = mission_data
self.helipads = helipads self.helipads = helipads
@ -102,13 +104,16 @@ class AircraftGenerator:
for package in ato.packages: for package in ato.packages:
if not package.flights: if not package.flights:
continue continue
package_briefing_data: list[FlightData] = []
for flight in package.flights: for flight in package.flights:
if flight.alive: if flight.alive:
logging.info(f"Generating flight: {flight.unit_type}") logging.info(f"Generating flight: {flight.unit_type}")
group = self.create_and_configure_flight( group, briefing_data = self.create_and_configure_flight(
flight, country, dynamic_runways flight, country, dynamic_runways
) )
package_briefing_data.append(briefing_data)
self.unit_map.add_aircraft(group, flight) self.unit_map.add_aircraft(group, flight)
self.briefing_data.append(package_briefing_data)
def spawn_unused_aircraft( def spawn_unused_aircraft(
self, player_country: Country, enemy_country: Country self, player_country: Country, enemy_country: Country
@ -157,13 +162,13 @@ class AircraftGenerator:
def create_and_configure_flight( def create_and_configure_flight(
self, flight: Flight, country: Country, dynamic_runways: Dict[str, RunwayData] self, flight: Flight, country: Country, dynamic_runways: Dict[str, RunwayData]
) -> FlyingGroup[Any]: ) -> tuple[FlyingGroup[Any], FlightData]:
"""Creates and configures the flight group in the mission.""" """Creates and configures the flight group in the mission."""
group = FlightGroupSpawner( group = FlightGroupSpawner(
flight, country, self.mission, self.helipads flight, country, self.mission, self.helipads
).create_flight_group() ).create_flight_group()
self.flights.append(
FlightGroupConfigurator( briefing_data = FlightGroupConfigurator(
flight, flight,
group, group,
self.game, self.game,
@ -176,7 +181,6 @@ class AircraftGenerator:
self.use_client, self.use_client,
self.unit_map, self.unit_map,
).configure() ).configure()
)
wpt = group.waypoint("LANDING") wpt = group.waypoint("LANDING")
if flight.is_helo and isinstance(flight.arrival, Fob) and wpt: if flight.is_helo and isinstance(flight.arrival, Fob) and wpt:
@ -185,4 +189,4 @@ class AircraftGenerator:
wpt.link_unit = hpad.id wpt.link_unit = hpad.id
self.helipads[flight.arrival].units.append(hpad) self.helipads[flight.arrival].units.append(hpad)
return group return group, briefing_data

View File

@ -56,7 +56,7 @@ class MissionInfoGenerator:
self.game = game self.game = game
self.awacs: List[AwacsInfo] = [] self.awacs: List[AwacsInfo] = []
self.comms: List[CommInfo] = [] self.comms: List[CommInfo] = []
self.flights: List[FlightData] = [] self.briefing_data: list[list[FlightData]] = []
self.jtacs: List[JtacInfo] = [] self.jtacs: List[JtacInfo] = []
self.tankers: List[TankerInfo] = [] self.tankers: List[TankerInfo] = []
self.frontlines: List[FrontLineInfo] = [] self.frontlines: List[FrontLineInfo] = []
@ -79,13 +79,13 @@ class MissionInfoGenerator:
""" """
self.comms.append(CommInfo(name, freq)) self.comms.append(CommInfo(name, freq))
def add_flight(self, flight: FlightData) -> None: def add_package_briefing_data(self, data: list[FlightData]) -> None:
"""Adds flight info to the mission. """Adds flight info to the mission.
Args: Args:
flight: Flight information. data: The list of briefing data for each flight in a package.
""" """
self.flights.append(flight) self.briefing_data.append(data)
def add_jtac(self, jtac: JtacInfo) -> None: def add_jtac(self, jtac: JtacInfo) -> None:
"""Adds a JTAC to the mission. """Adds a JTAC to the mission.
@ -177,7 +177,8 @@ class BriefingGenerator(MissionInfoGenerator):
# TODO: This should determine if runway is friendly through a method more robust than the existing string match # TODO: This should determine if runway is friendly through a method more robust than the existing string match
def generate_allied_flights_by_departure(self) -> None: def generate_allied_flights_by_departure(self) -> None:
"""Create iterable to display allied flights grouped by departure airfield.""" """Create iterable to display allied flights grouped by departure airfield."""
for flight in self.flights: for package in self.briefing_data:
for flight in package:
if not flight.client_units and flight.friendly: if not flight.client_units and flight.friendly:
name = flight.departure.airfield_name name = flight.departure.airfield_name
if ( if (

View File

@ -724,7 +724,8 @@ class KneeboardGenerator(MissionInfoGenerator):
that aircraft. that aircraft.
""" """
all_flights: Dict[AircraftType, List[KneeboardPage]] = defaultdict(list) all_flights: Dict[AircraftType, List[KneeboardPage]] = defaultdict(list)
for flight in self.flights: for flights in self.briefing_data:
for flight in flights:
if not flight.client_units: if not flight.client_units:
continue continue
all_flights[flight.aircraft_type].extend( all_flights[flight.aircraft_type].extend(

View File

@ -1,5 +1,6 @@
from __future__ import annotations from __future__ import annotations
import itertools
import logging import logging
import os import os
from abc import ABC, abstractmethod from abc import ABC, abstractmethod
@ -135,8 +136,12 @@ class LuaGenerator:
crate_item.add_key_value("weight", weight) crate_item.add_key_value("weight", weight)
target_points = lua_data.add_item("TargetPoints") target_points = lua_data.add_item("TargetPoints")
for flight in self.mission_data.flights: all_packages = itertools.chain(
if flight.friendly and flight.flight_type in [ self.game.blue.ato.packages, self.game.red.ato.packages
)
for package in all_packages:
for flight in package.flights:
if flight.blue and flight.flight_type in [
FlightType.ANTISHIP, FlightType.ANTISHIP,
FlightType.DEAD, FlightType.DEAD,
FlightType.SEAD, FlightType.SEAD,

View File

@ -90,7 +90,7 @@ class MissionData:
awacs: list[AwacsInfo] = field(default_factory=list) awacs: list[AwacsInfo] = field(default_factory=list)
runways: list[RunwayData] = field(default_factory=list) runways: list[RunwayData] = field(default_factory=list)
carriers: list[CarrierInfo] = field(default_factory=list) carriers: list[CarrierInfo] = field(default_factory=list)
flights: list[FlightData] = field(default_factory=list) briefing_data: list[list[FlightData]] = field(default_factory=list)
tankers: list[TankerInfo] = field(default_factory=list) tankers: list[TankerInfo] = field(default_factory=list)
jtacs: list[JtacInfo] = field(default_factory=list) jtacs: list[JtacInfo] = field(default_factory=list)
logistics: list[LogisticsInfo] = field(default_factory=list) logistics: list[LogisticsInfo] = field(default_factory=list)

View File

@ -281,14 +281,15 @@ class MissionGenerator:
self.mission.country(self.game.red.country_name), self.mission.country(self.game.red.country_name),
) )
for flight in aircraft_generator.flights: for package in aircraft_generator.briefing_data:
for flight in package:
if not flight.client_units: if not flight.client_units:
continue continue
flight.aircraft_type.assign_channels_for_flight( flight.aircraft_type.assign_channels_for_flight(
flight, air_support_generator.mission_data flight, air_support_generator.mission_data
) )
self.mission_data.flights = aircraft_generator.flights self.mission_data.briefing_data = aircraft_generator.briefing_data
def generate_destroyed_units(self) -> None: def generate_destroyed_units(self) -> None:
"""Add destroyed units to the Mission""" """Add destroyed units to the Mission"""
@ -344,8 +345,8 @@ class MissionGenerator:
if jtac.blue: if jtac.blue:
gen.add_jtac(jtac) gen.add_jtac(jtac)
for flight in mission_data.flights: for package in mission_data.briefing_data:
gen.add_flight(flight) gen.add_package_briefing_data(package)
gen.generate() gen.generate()
def setup_combined_arms(self) -> None: def setup_combined_arms(self) -> None: