Obey squadron mission types when planning airlift.

https://github.com/dcs-liberation/dcs_liberation/issues/276
This commit is contained in:
Dan Albert 2021-05-27 19:13:10 -07:00
parent d41007de8e
commit 37748ef3bd
2 changed files with 25 additions and 5 deletions

View File

@ -290,6 +290,11 @@ class AirWing:
def squadrons_for(self, aircraft: Type[FlyingType]) -> Sequence[Squadron]: def squadrons_for(self, aircraft: Type[FlyingType]) -> Sequence[Squadron]:
return self.squadrons[aircraft] return self.squadrons[aircraft]
def squadrons_for_task(self, task: FlightType) -> Iterator[Squadron]:
for squadron in self.iter_squadrons():
if task in squadron.mission_types:
yield squadron
def squadron_for(self, aircraft: Type[FlyingType]) -> Squadron: def squadron_for(self, aircraft: Type[FlyingType]) -> Squadron:
return self.squadrons_for(aircraft)[0] return self.squadrons_for(aircraft)[0]

View File

@ -20,6 +20,7 @@ from dcs.mapping import Point
from dcs.unittype import FlyingType, VehicleType from dcs.unittype import FlyingType, VehicleType
from game.procurement import AircraftProcurementRequest from game.procurement import AircraftProcurementRequest
from game.squadrons import Squadron
from game.theater import ControlPoint, MissionTarget from game.theater import ControlPoint, MissionTarget
from game.theater.transitnetwork import ( from game.theater.transitnetwork import (
TransitConnection, TransitConnection,
@ -232,17 +233,27 @@ class AirliftPlanner:
inventory = self.game.aircraft_inventory.for_control_point(cp) inventory = self.game.aircraft_inventory.for_control_point(cp)
for unit_type, available in inventory.all_aircraft: for unit_type, available in inventory.all_aircraft:
squadrons = [
s
for s in self.game.air_wing_for(self.for_player).squadrons_for(
unit_type
)
if FlightType.TRANSPORT in s.mission_types
]
if not squadrons:
continue
squadron = squadrons[0]
if self.compatible_with_mission(unit_type, cp): if self.compatible_with_mission(unit_type, cp):
while available and self.transfer.transport is None: while available and self.transfer.transport is None:
flight_size = self.create_airlift_flight(unit_type, inventory) flight_size = self.create_airlift_flight(squadron, inventory)
available -= flight_size available -= flight_size
if self.package.flights: if self.package.flights:
self.game.ato_for(self.for_player).add_package(self.package) self.game.ato_for(self.for_player).add_package(self.package)
def create_airlift_flight( def create_airlift_flight(
self, unit_type: Type[FlyingType], inventory: ControlPointAircraftInventory self, squadron: Squadron, inventory: ControlPointAircraftInventory
) -> int: ) -> int:
available = inventory.available(unit_type) available = inventory.available(squadron.aircraft)
# 4 is the max flight size in DCS. # 4 is the max flight size in DCS.
flight_size = min(self.transfer.size, available, 4) flight_size = min(self.transfer.size, available, 4)
@ -255,7 +266,7 @@ class AirliftPlanner:
flight = Flight( flight = Flight(
self.package, self.package,
self.game.country_for(player), self.game.country_for(player),
self.game.air_wing_for(player).squadron_for(unit_type), squadron,
flight_size, flight_size,
FlightType.TRANSPORT, FlightType.TRANSPORT,
self.game.settings.default_start_type, self.game.settings.default_start_type,
@ -574,10 +585,14 @@ class PendingTransfers:
def current_airlift_capacity(self, control_point: ControlPoint) -> int: def current_airlift_capacity(self, control_point: ControlPoint) -> int:
inventory = self.game.aircraft_inventory.for_control_point(control_point) inventory = self.game.aircraft_inventory.for_control_point(control_point)
squadrons = self.game.air_wing_for(control_point.captured).squadrons_for_task(
FlightType.TRANSPORT
)
unit_types = {s.aircraft for s in squadrons}.intersection(TRANSPORT_CAPABLE)
return sum( return sum(
count count
for unit_type, count in inventory.all_aircraft for unit_type, count in inventory.all_aircraft
if unit_type in TRANSPORT_CAPABLE if unit_type in unit_types
) )
def order_airlift_assets_at(self, control_point: ControlPoint) -> None: def order_airlift_assets_at(self, control_point: ControlPoint) -> None: