From e7e82dcd0b9fbb819bcac9f69b4ea2adda7c1635 Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Thu, 27 Aug 2020 01:52:21 -0700 Subject: [PATCH] Build mission kneeboards. This includes most of the briefing information in the kneeboard: * Airfield info * Waypoint info * Comm info * AWACS * Tankers * JTAC There's more that could be done: * Restrict tankers to the type compatible with the current aircraft * Support for carriers * Merge all relevant comm info (tankers, AWACS, JTAC, other flights) into the comm ladder This gives us a good start and a framework to build on. Very likely that we'll want to split part of this (probably the comm ladder) off onto a separate page once we start adding more to this, since it's a pretty full page currently. Also missing is any checking that the contents do not go beyond the bounds of the page. We could add this if needed. For now the page has enough room for about a dozen waypoints, which is quite a bit more than most missions need. --- .gitignore | 1 + game/operation/operation.py | 19 +- gen/__init__.py | 1 + gen/airfields.py | 45 +++++ gen/kneeboard.py | 327 ++++++++++++++++++++++++++++++++ gen/units.py | 6 + requirements.txt | 3 + resources/fonts/Inconsolata.otf | Bin 0 -> 58560 bytes resources/fonts/OFL.txt | 38 ++++ 9 files changed, 436 insertions(+), 4 deletions(-) create mode 100644 gen/airfields.py create mode 100644 gen/kneeboard.py create mode 100644 gen/units.py create mode 100644 resources/fonts/Inconsolata.otf create mode 100644 resources/fonts/OFL.txt diff --git a/.gitignore b/.gitignore index f96c1292..68c604e4 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ tests/** # User-specific stuff .idea/ +/kneeboards /liberation_preferences.json /state.json diff --git a/game/operation/operation.py b/game/operation/operation.py index 033d3c34..5f7a9503 100644 --- a/game/operation/operation.py +++ b/game/operation/operation.py @@ -221,17 +221,28 @@ class Operation: load_dcs_libe.add_action(DoScript(String(script))) self.current_mission.triggerrules.triggers.append(load_dcs_libe) + kneeboard_generator = KneeboardGenerator(self.current_mission, self.game) + # Briefing Generation for i, tanker_type in enumerate(self.airsupportgen.generated_tankers): - self.briefinggen.append_frequency("Tanker {} ({})".format(TANKER_CALLSIGNS[i], tanker_type), "{}X/{} MHz AM".format(60+i, 130+i)) + callsign = TANKER_CALLSIGNS[i] + tacan = f"{60 + i}X" + freq = f"{130 + i} MHz AM" + self.briefinggen.append_frequency(f"Tanker {callsign} ({tanker_type})", f"{tacan}/{freq}") + kneeboard_generator.add_tanker(callsign, tanker_type, freq, tacan) if self.is_awacs_enabled: - self.briefinggen.append_frequency("AWACS", "233 MHz AM") + callsign = "AWACS" + freq = "233 MHz AM" + self.briefinggen.append_frequency(callsign, freq) + kneeboard_generator.add_awacs(callsign, freq) self.briefinggen.append_frequency("Flight", "251 MHz AM") + kneeboard_generator.add_comm("Flight", "251 MHz AM") # Generate the briefing self.briefinggen.generate() - - + for region, code, name in self.game.jtacs: + kneeboard_generator.add_jtac(name, region, code) + kneeboard_generator.generate() diff --git a/gen/__init__.py b/gen/__init__.py index d910a19d..ad11614f 100644 --- a/gen/__init__.py +++ b/gen/__init__.py @@ -9,6 +9,7 @@ from .environmentgen import * from .groundobjectsgen import * from .briefinggen import * from .forcedoptionsgen import * +from .kneeboard import * from . import naming diff --git a/gen/airfields.py b/gen/airfields.py new file mode 100644 index 00000000..79e540d7 --- /dev/null +++ b/gen/airfields.py @@ -0,0 +1,45 @@ +"""Extra airfield data that is not exposed by pydcs. + +Remove once https://github.com/pydcs/dcs/issues/69 tracks getting the missing +data added to pydcs. Until then, missing data can be manually filled in here. +""" +from dataclasses import dataclass, field +from typing import Dict, List, Optional + + +RadioFrequency = str + + +@dataclass +class AtcData: + hf: RadioFrequency + vhf_fm: RadioFrequency + vhf_am: RadioFrequency + uhf: RadioFrequency + + +@dataclass +class AirfieldData: + """Additional airfield data not included in pydcs.""" + + #: Radio channels used by the airfield's ATC. + atc: AtcData + + #: TACAN channel as a string, i.e. "74X". + tacan: Optional[str] = None + + #: Dict of runway heading -> ILS frequency. + ils: Dict[str, RadioFrequency] = field(default_factory=dict) + + def ils_freq(self, runway: str) -> Optional[RadioFrequency]: + return self.ils.get(runway) + + +# TODO: Add more airfields. +AIRFIELD_DATA = { + "Incirlik": AirfieldData( + AtcData("3.85", "38.6", "129.4", "360.1"), + "21X", + {"050": "109.3", "230": "111.7"} + ), +} diff --git a/gen/kneeboard.py b/gen/kneeboard.py new file mode 100644 index 00000000..1d679e4a --- /dev/null +++ b/gen/kneeboard.py @@ -0,0 +1,327 @@ +"""Generates kneeboard pages relevant to the player's mission. + +The player kneeboard includes the following information: + +* Airfield (departure, arrival, divert) info. +* Flight plan (waypoint numbers, names, altitudes). +* Comm channels. +* AWACS info. +* Tanker info. +* JTAC info. + +Things we should add: + +* Flight plan ToT and fuel ladder (current have neither available). +* Support for planning an arrival/divert airfield separate from departure. +* Mission package infrastructure to include information about the larger + mission, i.e. information about the escort flight for a strike package. +* Target information. Steerpoints, preplanned objectives, ToT, etc. + +For multiplayer missions, a kneeboard will be generated per flight. +https://forums.eagle.ru/showthread.php?t=206360 claims that kneeboard pages can +only be added per airframe, so PvP missions where each side have the same +aircraft will be able to see the enemy's kneeboard for the same airframe. +""" +from collections import defaultdict +from dataclasses import dataclass +from pathlib import Path +from typing import Dict, List, Optional, Tuple + +from PIL import Image, ImageDraw, ImageFont +from tabulate import tabulate + +from pydcs.dcs.mission import Mission +from pydcs.dcs.terrain.terrain import Airport +from pydcs.dcs.unittype import FlyingType +from .airfields import AIRFIELD_DATA +from .flights.flight import Flight +from . import units + + +class KneeboardPageWriter: + """Creates kneeboard images.""" + + def __init__(self, page_margin: int = 24, line_spacing: int = 12) -> None: + self.image = Image.new('RGB', (768, 1024), (0xff, 0xff, 0xff)) + # These font sizes create a relatively full page for current sorties. If + # we start generating more complicated flight plans, or start including + # more information in the comm ladder (the latter of which we should + # probably do), we'll need to split some of this information off into a + # second page. + self.title_font = ImageFont.truetype("arial.ttf", 32) + self.heading_font = ImageFont.truetype("arial.ttf", 24) + self.content_font = ImageFont.truetype("arial.ttf", 20) + self.table_font = ImageFont.truetype( + "resources/fonts/Inconsolata.otf", 20) + self.draw = ImageDraw.Draw(self.image) + self.x = page_margin + self.y = page_margin + self.line_spacing = line_spacing + + @property + def position(self) -> Tuple[int, int]: + return self.x, self.y + + def text(self, text: str, font=None, + fill: Tuple[int, int, int] = (0, 0, 0)) -> None: + if font is None: + font = self.content_font + + self.draw.text(self.position, text, font=font, fill=fill) + width, height = self.draw.textsize(text, font=font) + self.y += height + self.line_spacing + + def title(self, title: str) -> None: + self.text(title, font=self.title_font) + + def heading(self, text: str) -> None: + self.text(text, font=self.heading_font) + + def table(self, cells: List[List[str]], + headers: Optional[List[str]] = None) -> None: + table = tabulate(cells, headers=headers, numalign="right") + self.text(table, font=self.table_font) + + def write(self, path: Path) -> None: + self.image.save(path) + + +class KneeboardPage: + """Base class for all kneeboard pages.""" + + def write(self, path: Path) -> None: + """Writes the kneeboard page to the given path.""" + raise NotImplementedError + + +class AirfieldInfo: + def __init__(self, airfield: Airport) -> None: + self.airport = airfield + # TODO: Implement logic for picking preferred runway. + runway = airfield.runways[0] + runway_side = ["", "L", "R"][runway.leftright] + self.runway = f"{runway.heading}{runway_side}" + try: + extra_data = AIRFIELD_DATA[airfield.name] + self.atc = extra_data.atc.uhf or "" + self.tacan = extra_data.tacan or "" + self.ils = extra_data.ils_freq(self.runway) or "" + except KeyError: + self.atc = "" + self.ils = "" + self.tacan = "" + + +@dataclass +class CommInfo: + """Communications information for the kneeboard.""" + name: str + freq: str + + +@dataclass +class AwacsInfo: + """AWACS information for the kneeboard.""" + callsign: str + freq: str + + +@dataclass +class TankerInfo: + """Tanker information for the kneeboard.""" + callsign: str + variant: str + freq: str + tacan: str + + +@dataclass +class JtacInfo: + """JTAC information for the kneeboard.""" + callsign: str + region: str + code: str + + +class BriefingPage(KneeboardPage): + """A kneeboard page containing briefing information.""" + def __init__(self, flight: Flight, comms: List[CommInfo], + awacs: List[AwacsInfo], tankers: List[TankerInfo], + jtacs: List[JtacInfo]) -> None: + self.flight = flight + self.comms = comms + self.awacs = awacs + self.tankers = tankers + self.jtacs = jtacs + self.departure = flight.from_cp.airport + self.arrival = flight.from_cp.airport + self.divert: Optional[Airport] = None + + def write(self, path: Path) -> None: + writer = KneeboardPageWriter() + # TODO: Assign callsigns to flights and include that info. + # https://github.com/Khopa/dcs_liberation/issues/113 + writer.title(f"Mission Info") + + # TODO: Handle carriers. + writer.heading("Airfield Info") + writer.table([ + self.airfield_info_row("Departure", self.departure), + self.airfield_info_row("Arrival", self.arrival), + self.airfield_info_row("Divert", self.divert), + ], headers=["", "Airbase", "ATC", "TCN", "ILS", "RWY"]) + + writer.heading("Flight Plan") + flight_plan = [] + for num, waypoint in enumerate(self.flight.points): + alt = int(units.meters_to_feet(waypoint.alt)) + flight_plan.append([num, waypoint.pretty_name, str(alt)]) + writer.table(flight_plan, headers=["STPT", "Action", "Alt"]) + + writer.heading("Comm Ladder") + comms = [] + for comm in self.comms: + comms.append([comm.name, comm.freq]) + writer.table(comms, headers=["Name", "UHF"]) + + writer.heading("AWACS") + awacs = [] + for a in self.awacs: + awacs.append([a.callsign, a.freq]) + writer.table(awacs, headers=["Callsign", "UHF"]) + + writer.heading("Tankers") + tankers = [] + for tanker in self.tankers: + tankers.append([ + tanker.callsign, + tanker.variant, + tanker.tacan, + tanker.freq, + ]) + writer.table(tankers, headers=["Callsign", "Type", "TACAN", "UHF"]) + + writer.heading("JTAC") + jtacs = [] + for jtac in self.jtacs: + jtacs.append([jtac.callsign, jtac.region, jtac.code]) + writer.table(jtacs, headers=["Callsign", "Region", "Laser Code"]) + + writer.write(path) + + def airfield_info_row(self, row_title: str, + airfield: Optional[Airport]) -> List[str]: + """Creates a table row for a given airfield. + + Args: + row_title: Purpose of the airfield. e.g. "Departure", "Arrival" or + "Divert". + airfield: The airfield described by this row. + + Returns: + A list of strings to be used as a row of the airfield table. + """ + if airfield is None: + return [row_title, "", "", "", "", ""] + info = AirfieldInfo(airfield) + return [ + row_title, + airfield.name, + info.atc, + info.tacan, + info.ils, + info.runway, + ] + + +class KneeboardGenerator: + """Creates kneeboard pages for each client flight in the mission.""" + + def __init__(self, mission: Mission, game) -> None: + self.mission = mission + self.game = game + self.comms: List[CommInfo] = [] + self.awacs: List[AwacsInfo] = [] + self.tankers: List[TankerInfo] = [] + self.jtacs: List[JtacInfo] = [] + + def add_comm(self, name: str, freq: str) -> None: + """Adds communications info to the kneeboard. + + Args: + name: Name of the radio channel. + freq: Frequency of the radio channel. + """ + self.comms.append(CommInfo(name, freq)) + + def add_awacs(self, callsign: str, freq: str) -> None: + """Adds an AWACS/GCI to the kneeboard. + + Args: + callsign: Callsign of the AWACS/GCI. + freq: Radio frequency used by the AWACS/GCI. + """ + self.awacs.append(AwacsInfo(callsign, freq)) + + def add_tanker(self, callsign: str, variant: str, freq: str, + tacan: str) -> None: + """Adds a tanker to the kneeboard. + + Args: + callsign: Callsign of the tanker. + variant: Aircraft type. + freq: Radio frequency used by the tanker. + tacan: TACAN channel of the tanker. + """ + self.tankers.append(TankerInfo(callsign, variant, freq, tacan)) + + def add_jtac(self, callsign: str, region: str, code: str) -> None: + """Adds a JTAC to the kneeboard. + + Args: + callsign: Callsign of the JTAC. + region: JTAC's area of responsibility. + code: Laser code used by the JTAC. + """ + # TODO: Radio info? Type? + self.jtacs.append(JtacInfo(callsign, region, code)) + + def generate(self) -> None: + """Generates a kneeboard per client flight.""" + temp_dir = Path("kneeboards") + temp_dir.mkdir(exist_ok=True) + for aircraft, pages in self.pages_by_airframe().items(): + aircraft_dir = temp_dir / aircraft.id + aircraft_dir.mkdir(exist_ok=True) + for idx, page in enumerate(pages): + page_path = aircraft_dir / f"page{idx:02}.png" + page.write(page_path) + self.mission.add_aircraft_kneeboard(aircraft, page_path) + + def pages_by_airframe(self) -> Dict[FlyingType, List[KneeboardPage]]: + """Returns a list of kneeboard pages per airframe in the mission. + + Only client flights will be included, but because DCS does not support + group-specific kneeboard pages, flights (possibly from opposing sides) + will be able to see the kneeboards of all aircraft of the same type. + + Returns: + A dict mapping aircraft types to the list of kneeboard pages for + that aircraft. + """ + all_flights: Dict[FlyingType, List[KneeboardPage]] = defaultdict(list) + for cp in self.game.theater.controlpoints: + if cp.id in self.game.planners.keys(): + for flight in self.game.planners[cp.id].flights: + if flight.client_count > 0: + all_flights[flight.unit_type].extend( + self.generate_flight_kneeboard(flight)) + return all_flights + + def generate_flight_kneeboard(self, flight: Flight) -> List[KneeboardPage]: + """Returns a list of kneeboard pages for the given flight.""" + return [ + BriefingPage( + flight, self.comms, self.awacs, self.tankers, self.jtacs + ), + ] diff --git a/gen/units.py b/gen/units.py new file mode 100644 index 00000000..005e1576 --- /dev/null +++ b/gen/units.py @@ -0,0 +1,6 @@ +"""Unit conversions.""" + + +def meters_to_feet(meters: float) -> float: + """Convers meters to feet.""" + return meters * 3.28084 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 6f314f97..12d48655 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,3 +2,6 @@ Pyside2>=5.13.0 pyinstaller==3.6 pyproj==2.6.1.post1 + +Pillow~=7.2.0 +tabulate~=0.8.7 \ No newline at end of file diff --git a/resources/fonts/Inconsolata.otf b/resources/fonts/Inconsolata.otf new file mode 100644 index 0000000000000000000000000000000000000000..e7e1fa0cd74847ceaa92fd3c9b4bfc75f329155e GIT binary patch literal 58560 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