Use the best aircraft rather than first found.

The priority list was guiding the purchase decision which largely meant
that this was working correctly, but there were suboptimal cases where
the list was being taken in FIFO order by purchased type. This fixes the
search to be locally optimal, although this does still mean that a worse
but closer aircraft will be chosen over a better but slightly farther
away aircraft. We'd need to have a quality vs distance rating to do
better.

Fixes https://github.com/dcs-liberation/dcs_liberation/issues/755
This commit is contained in:
Dan Albert 2021-05-18 21:01:26 -07:00
parent c5159f8a87
commit 0879d1da0d
2 changed files with 8 additions and 6 deletions

View File

@ -31,6 +31,7 @@ from .income import Income
from .infos.information import Information
from .navmesh import NavMesh
from .procurement import AircraftProcurementRequest, ProcurementAi
from .profiling import logged_duration
from .settings import Settings
from .theater import ConflictTheater
from .theater.transitnetwork import TransitNetwork, TransitNetworkBuilder
@ -361,11 +362,12 @@ class Game:
self.transfers.order_airlift_assets()
self.transfers.plan_transports()
blue_planner = CoalitionMissionPlanner(self, is_player=True)
blue_planner.plan_missions()
with logged_duration("Mission planning"):
blue_planner = CoalitionMissionPlanner(self, is_player=True)
blue_planner.plan_missions()
red_planner = CoalitionMissionPlanner(self, is_player=False)
red_planner.plan_missions()
red_planner = CoalitionMissionPlanner(self, is_player=False)
red_planner.plan_missions()
for cp in self.theater.controlpoints:
if cp.has_frontline:

View File

@ -162,10 +162,10 @@ class AircraftAllocator:
if not airfield.is_friendly(self.is_player):
continue
inventory = self.global_inventory.for_control_point(airfield)
for aircraft, available in inventory.all_aircraft:
for aircraft in types:
if not airfield.can_operate(aircraft):
continue
if aircraft in types and available >= flight.num_aircraft:
if inventory.available(aircraft) >= flight.num_aircraft:
inventory.remove_aircraft(aircraft, flight.num_aircraft)
return airfield, aircraft