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})")