Obey parking limits when auto-buying aircraft.

Fixes https://github.com/Khopa/dcs_liberation/issues/137
This commit is contained in:
Dan Albert 2020-12-05 23:36:20 -08:00
parent 6a8ca810ff
commit aa9ffa0855

View File

@ -108,19 +108,14 @@ class ProcurementAi:
return random.choice(affordable_units) return random.choice(affordable_units)
def purchase_aircraft(self, budget: int) -> int: def purchase_aircraft(self, budget: int) -> int:
aircraft_limit = int(25 * self.game.settings.multiplier)
candidates = self.airbase_candidates(aircraft_limit)
if not candidates:
return budget
unit_pool = [u for u in self.faction.aircrafts unit_pool = [u for u in self.faction.aircrafts
if u in db.UNIT_BY_TASK[CAS] or u in db.UNIT_BY_TASK[CAP]] if u in db.UNIT_BY_TASK[CAS] or u in db.UNIT_BY_TASK[CAP]]
if not unit_pool: if not unit_pool:
return budget return budget
while budget > 0: while budget > 0:
cp = random.choice(candidates)
group_size = 2 group_size = 2
cp = random.choice(self.airbase_candidates(group_size))
unit = self.random_affordable_aircraft_group(budget, group_size) unit = self.random_affordable_aircraft_group(budget, group_size)
if unit is None: if unit is None:
# Can't afford any more aircraft. # Can't afford any more aircraft.
@ -130,11 +125,6 @@ class ProcurementAi:
assert cp.pending_unit_deliveries is not None assert cp.pending_unit_deliveries is not None
cp.pending_unit_deliveries.deliver({unit: group_size}) cp.pending_unit_deliveries.deliver({unit: group_size})
if cp.base.total_aircraft >= aircraft_limit:
candidates.remove(cp)
if not candidates:
break
return budget return budget
@property @property
@ -144,25 +134,27 @@ class ProcurementAi:
else: else:
return self.game.theater.enemy_points() return self.game.theater.enemy_points()
def airbase_candidates(self, unit_limit: int) -> List[ControlPoint]: def airbase_candidates(self, group_size: int) -> List[ControlPoint]:
candidates = [] all_usable = []
preferred = []
# Prefer to buy front line units at active front lines that are not
# already overloaded.
# TODO: Buy aircraft where they are needed, not at front lines.
for cp in self.owned_points: for cp in self.owned_points:
if cp.base.total_aircraft >= unit_limit: if not cp.runway_is_operational():
continue continue
if cp.unclaimed_parking(self.game) < group_size:
continue
all_usable.append(cp)
for connected in cp.connected_points: for connected in cp.connected_points:
# Prefer to buy aircraft at active front lines.
# TODO: Buy aircraft where they are needed, not at front lines.
if not connected.is_friendly(to_player=self.is_player): if not connected.is_friendly(to_player=self.is_player):
candidates.append(cp) preferred.append(cp)
if not candidates: if preferred:
# Otherwise buy them anywhere valid. return preferred
candidates = [p for p in self.owned_points
if p.can_deploy_ground_units]
return candidates # Otherwise buy them anywhere valid.
return all_usable
def front_line_candidates(self, unit_limit: int) -> List[ControlPoint]: def front_line_candidates(self, unit_limit: int) -> List[ControlPoint]:
candidates = [] candidates = []