diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py index a1934b3f..cac469d5 100644 --- a/game/theater/controlpoint.py +++ b/game/theater/controlpoint.py @@ -6,7 +6,7 @@ import random import re from dataclasses import dataclass, field from enum import Enum -from typing import Dict, Iterator, List, Optional, TYPE_CHECKING +from typing import Dict, Iterator, List, Optional, TYPE_CHECKING, Tuple from dcs.mapping import Point from dcs.ships import ( @@ -125,6 +125,17 @@ class PresetLocations: return None +@dataclass(frozen=True) +class PendingOccupancy: + present: int + ordered: int + transferring: int + + @property + def total(self) -> int: + return self.present + self.ordered + self.transferring + + class ControlPoint(MissionTarget): position = None # type: Point @@ -379,18 +390,36 @@ class ControlPoint(MissionTarget): return False return True - @property - def expected_aircraft_next_turn(self) -> int: - total = self.base.total_aircraft - assert self.pending_unit_deliveries - for unit_bought in self.pending_unit_deliveries.units: - if issubclass(unit_bought, FlyingType): - total += self.pending_unit_deliveries.units[unit_bought] + def aircraft_transferring(self, game: Game) -> int: + if self.captured: + ato = game.blue_ato + else: + ato = game.red_ato + + total = 0 + for package in ato.packages: + for flight in package.flights: + if flight.departure == flight.arrival: + continue + if flight.departure == self: + total -= flight.count + elif flight.arrival == self: + total += flight.count return total - @property - def unclaimed_parking(self) -> int: - return self.total_aircraft_parking - self.expected_aircraft_next_turn + def expected_aircraft_next_turn(self, game: Game) -> PendingOccupancy: + assert self.pending_unit_deliveries + on_order = 0 + for unit_bought in self.pending_unit_deliveries.units: + if issubclass(unit_bought, FlyingType): + on_order += self.pending_unit_deliveries.units[unit_bought] + + return PendingOccupancy(self.base.total_aircraft, on_order, + self.aircraft_transferring(game)) + + def unclaimed_parking(self, game: Game) -> int: + return (self.total_aircraft_parking - + self.expected_aircraft_next_turn(game).total) class OffMapSpawn(ControlPoint): diff --git a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py index 7c159e94..159aa93a 100644 --- a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py +++ b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py @@ -38,7 +38,7 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): self.bought_amount_labels = {} self.existing_units_labels = {} - self.hangar_status = QHangarStatus(self.cp) + self.hangar_status = QHangarStatus(game_model, self.cp) self.init_ui() @@ -82,7 +82,7 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): def buy(self, unit_type): if self.maximum_units > 0: - if self.cp.unclaimed_parking <= 0: + if self.cp.unclaimed_parking(self.game_model.game) <= 0: logging.debug(f"No space for additional aircraft at {self.cp}.") return @@ -110,8 +110,10 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): class QHangarStatus(QHBoxLayout): - def __init__(self, control_point: ControlPoint) -> None: + def __init__(self, game_model: GameModel, + control_point: ControlPoint) -> None: super().__init__() + self.game_model = game_model self.control_point = control_point self.icon = QLabel() @@ -125,6 +127,22 @@ class QHangarStatus(QHBoxLayout): self.setAlignment(Qt.AlignLeft) def update_label(self) -> None: - current_amount = self.control_point.expected_aircraft_next_turn + next_turn = self.control_point.expected_aircraft_next_turn( + self.game_model.game) max_amount = self.control_point.total_aircraft_parking - self.text.setText(f"{current_amount}/{max_amount}") + + components = [f"{next_turn.present} present"] + if next_turn.ordered > 0: + components.append(f"{next_turn.ordered} purchased") + elif next_turn.ordered < 0: + components.append(f"{-next_turn.ordered} sold") + + transferring = next_turn.transferring + if transferring > 0: + components.append(f"{transferring} transferring in") + if transferring < 0: + components.append(f"{-transferring} transferring out") + + details = ", ".join(components) + self.text.setText( + f"{next_turn.total}/{max_amount} ({details})")