mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Will now generate multiple missions per squadron in Pretense campaigns to ensure most mission types are available.
This commit is contained in:
parent
a49a1e9461
commit
ff096b7d8d
@ -281,9 +281,45 @@ class PretenseAircraftGenerator:
|
|||||||
num_of_bai = 0
|
num_of_bai = 0
|
||||||
num_of_strike = 0
|
num_of_strike = 0
|
||||||
num_of_cap = 0
|
num_of_cap = 0
|
||||||
|
sead_tasks = [FlightType.SEAD, FlightType.SEAD_SWEEP, FlightType.SEAD_ESCORT]
|
||||||
|
strike_tasks = [
|
||||||
|
FlightType.STRIKE,
|
||||||
|
FlightType.OCA_RUNWAY,
|
||||||
|
FlightType.OCA_AIRCRAFT,
|
||||||
|
]
|
||||||
|
patrol_tasks = [
|
||||||
|
FlightType.BARCAP,
|
||||||
|
FlightType.TARCAP,
|
||||||
|
FlightType.ESCORT,
|
||||||
|
FlightType.INTERCEPTION,
|
||||||
|
]
|
||||||
|
sead_capable_cp = False
|
||||||
|
cas_capable_cp = False
|
||||||
|
bai_capable_cp = False
|
||||||
|
strike_capable_cp = False
|
||||||
|
patrol_capable_cp = False
|
||||||
|
|
||||||
|
# First check what are the capabilities of the squadrons on this CP
|
||||||
|
for squadron in cp.squadrons:
|
||||||
|
for task in sead_tasks:
|
||||||
|
if task in squadron.auto_assignable_mission_types:
|
||||||
|
sead_capable_cp = True
|
||||||
|
for task in strike_tasks:
|
||||||
|
if task in squadron.auto_assignable_mission_types:
|
||||||
|
if not squadron.aircraft.helicopter:
|
||||||
|
strike_capable_cp = True
|
||||||
|
for task in patrol_tasks:
|
||||||
|
if task in squadron.auto_assignable_mission_types:
|
||||||
|
if not squadron.aircraft.helicopter:
|
||||||
|
patrol_capable_cp = True
|
||||||
|
if FlightType.CAS in squadron.auto_assignable_mission_types:
|
||||||
|
cas_capable_cp = True
|
||||||
|
if FlightType.BAI in squadron.auto_assignable_mission_types:
|
||||||
|
bai_capable_cp = True
|
||||||
|
|
||||||
random_squadron_list = list(cp.squadrons)
|
random_squadron_list = list(cp.squadrons)
|
||||||
random.shuffle(random_squadron_list)
|
random.shuffle(random_squadron_list)
|
||||||
|
# Then plan transports, AEWC and tankers
|
||||||
for squadron in random_squadron_list:
|
for squadron in random_squadron_list:
|
||||||
# Intentionally don't spawn anything at OffMapSpawns in Pretense
|
# Intentionally don't spawn anything at OffMapSpawns in Pretense
|
||||||
if isinstance(squadron.location, OffMapSpawn):
|
if isinstance(squadron.location, OffMapSpawn):
|
||||||
@ -291,14 +327,6 @@ class PretenseAircraftGenerator:
|
|||||||
if cp.coalition != squadron.coalition:
|
if cp.coalition != squadron.coalition:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
squadron.owned_aircraft += (
|
|
||||||
self.game.settings.pretense_ai_aircraft_per_flight
|
|
||||||
)
|
|
||||||
squadron.untasked_aircraft += (
|
|
||||||
self.game.settings.pretense_ai_aircraft_per_flight
|
|
||||||
)
|
|
||||||
squadron.populate_for_turn_0(False)
|
|
||||||
package = Package(cp, squadron.flight_db, auto_asap=False)
|
|
||||||
mission_types = squadron.auto_assignable_mission_types
|
mission_types = squadron.auto_assignable_mission_types
|
||||||
aircraft_per_flight = 1
|
aircraft_per_flight = 1
|
||||||
if squadron.aircraft.helicopter and (
|
if squadron.aircraft.helicopter and (
|
||||||
@ -311,52 +339,6 @@ class PretenseAircraftGenerator:
|
|||||||
or FlightType.AIR_ASSAULT in mission_types
|
or FlightType.AIR_ASSAULT in mission_types
|
||||||
):
|
):
|
||||||
flight_type = FlightType.TRANSPORT
|
flight_type = FlightType.TRANSPORT
|
||||||
elif (
|
|
||||||
FlightType.SEAD in mission_types
|
|
||||||
or FlightType.SEAD_SWEEP in mission_types
|
|
||||||
or FlightType.SEAD_ESCORT in mission_types
|
|
||||||
) and num_of_sead < self.game.settings.pretense_sead_flights_per_cp:
|
|
||||||
flight_type = FlightType.SEAD
|
|
||||||
num_of_sead += 1
|
|
||||||
aircraft_per_flight = self.game.settings.pretense_ai_aircraft_per_flight
|
|
||||||
elif (
|
|
||||||
FlightType.DEAD in mission_types
|
|
||||||
and num_of_sead < self.game.settings.pretense_sead_flights_per_cp
|
|
||||||
):
|
|
||||||
flight_type = FlightType.DEAD
|
|
||||||
num_of_sead += 1
|
|
||||||
aircraft_per_flight = self.game.settings.pretense_ai_aircraft_per_flight
|
|
||||||
elif (
|
|
||||||
(squadron.aircraft.helicopter and (FlightType.ESCORT in mission_types))
|
|
||||||
or (FlightType.CAS in mission_types)
|
|
||||||
and num_of_cas < self.game.settings.pretense_cas_flights_per_cp
|
|
||||||
):
|
|
||||||
flight_type = FlightType.CAS
|
|
||||||
num_of_cas += 1
|
|
||||||
aircraft_per_flight = self.game.settings.pretense_ai_aircraft_per_flight
|
|
||||||
elif (
|
|
||||||
FlightType.BAI in mission_types
|
|
||||||
) and num_of_bai < self.game.settings.pretense_bai_flights_per_cp:
|
|
||||||
flight_type = FlightType.BAI
|
|
||||||
num_of_bai += 1
|
|
||||||
aircraft_per_flight = self.game.settings.pretense_ai_aircraft_per_flight
|
|
||||||
elif (
|
|
||||||
FlightType.STRIKE in mission_types
|
|
||||||
or FlightType.OCA_RUNWAY in mission_types
|
|
||||||
or FlightType.OCA_AIRCRAFT in mission_types
|
|
||||||
) and num_of_strike < self.game.settings.pretense_strike_flights_per_cp:
|
|
||||||
flight_type = FlightType.STRIKE
|
|
||||||
num_of_strike += 1
|
|
||||||
aircraft_per_flight = self.game.settings.pretense_ai_aircraft_per_flight
|
|
||||||
elif (
|
|
||||||
FlightType.BARCAP in mission_types
|
|
||||||
or FlightType.TARCAP in mission_types
|
|
||||||
or FlightType.ESCORT in mission_types
|
|
||||||
or FlightType.INTERCEPTION in mission_types
|
|
||||||
) and num_of_cap < self.game.settings.pretense_barcap_flights_per_cp:
|
|
||||||
flight_type = FlightType.BARCAP
|
|
||||||
num_of_cap += 1
|
|
||||||
aircraft_per_flight = self.game.settings.pretense_ai_aircraft_per_flight
|
|
||||||
elif FlightType.AEWC in mission_types:
|
elif FlightType.AEWC in mission_types:
|
||||||
flight_type = FlightType.AEWC
|
flight_type = FlightType.AEWC
|
||||||
aircraft_per_flight = PRETENSE_AI_AWACS_PER_FLIGHT
|
aircraft_per_flight = PRETENSE_AI_AWACS_PER_FLIGHT
|
||||||
@ -366,37 +348,181 @@ class PretenseAircraftGenerator:
|
|||||||
else:
|
else:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
if flight_type == FlightType.TRANSPORT:
|
self.generate_pretense_flight(
|
||||||
flight = Flight(
|
ato, cp, squadron, aircraft_per_flight, flight_type
|
||||||
package,
|
|
||||||
squadron,
|
|
||||||
aircraft_per_flight,
|
|
||||||
FlightType.PRETENSE_CARGO,
|
|
||||||
StartType.IN_FLIGHT,
|
|
||||||
divert=cp,
|
|
||||||
)
|
|
||||||
package.add_flight(flight)
|
|
||||||
flight.state = Navigating(flight, self.game.settings, waypoint_index=1)
|
|
||||||
else:
|
|
||||||
flight = Flight(
|
|
||||||
package,
|
|
||||||
squadron,
|
|
||||||
aircraft_per_flight,
|
|
||||||
flight_type,
|
|
||||||
StartType.COLD,
|
|
||||||
divert=cp,
|
|
||||||
)
|
|
||||||
package.add_flight(flight)
|
|
||||||
flight.state = WaitingForStart(
|
|
||||||
flight, self.game.settings, self.game.conditions.start_time
|
|
||||||
)
|
|
||||||
|
|
||||||
print(
|
|
||||||
f"Generated flight for {flight_type} flying {squadron.aircraft.display_name} at {squadron.location.name}"
|
|
||||||
)
|
)
|
||||||
ato.add_package(package)
|
# Then plan SEAD and DEAD, if capable
|
||||||
|
if sead_capable_cp:
|
||||||
|
while num_of_sead < self.game.settings.pretense_sead_flights_per_cp:
|
||||||
|
for squadron in random_squadron_list:
|
||||||
|
# Intentionally don't spawn anything at OffMapSpawns in Pretense
|
||||||
|
if isinstance(squadron.location, OffMapSpawn):
|
||||||
|
continue
|
||||||
|
if cp.coalition != squadron.coalition:
|
||||||
|
continue
|
||||||
|
|
||||||
|
mission_types = squadron.auto_assignable_mission_types
|
||||||
|
if (
|
||||||
|
(
|
||||||
|
FlightType.SEAD in mission_types
|
||||||
|
or FlightType.SEAD_SWEEP in mission_types
|
||||||
|
or FlightType.SEAD_ESCORT in mission_types
|
||||||
|
)
|
||||||
|
and num_of_sead
|
||||||
|
< self.game.settings.pretense_sead_flights_per_cp
|
||||||
|
):
|
||||||
|
flight_type = FlightType.SEAD
|
||||||
|
num_of_sead += 1
|
||||||
|
aircraft_per_flight = (
|
||||||
|
self.game.settings.pretense_ai_aircraft_per_flight
|
||||||
|
)
|
||||||
|
elif (
|
||||||
|
FlightType.DEAD in mission_types
|
||||||
|
and num_of_sead
|
||||||
|
< self.game.settings.pretense_sead_flights_per_cp
|
||||||
|
):
|
||||||
|
flight_type = FlightType.DEAD
|
||||||
|
num_of_sead += 1
|
||||||
|
aircraft_per_flight = (
|
||||||
|
self.game.settings.pretense_ai_aircraft_per_flight
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
continue
|
||||||
|
self.generate_pretense_flight(
|
||||||
|
ato, cp, squadron, aircraft_per_flight, flight_type
|
||||||
|
)
|
||||||
|
# Then plan Strike, if capable
|
||||||
|
if strike_capable_cp:
|
||||||
|
while num_of_strike < self.game.settings.pretense_strike_flights_per_cp:
|
||||||
|
for squadron in random_squadron_list:
|
||||||
|
# Intentionally don't spawn anything at OffMapSpawns in Pretense
|
||||||
|
if isinstance(squadron.location, OffMapSpawn):
|
||||||
|
continue
|
||||||
|
if cp.coalition != squadron.coalition:
|
||||||
|
continue
|
||||||
|
|
||||||
|
mission_types = squadron.auto_assignable_mission_types
|
||||||
|
for task in strike_tasks:
|
||||||
|
if task in mission_types and not squadron.aircraft.helicopter:
|
||||||
|
flight_type = FlightType.STRIKE
|
||||||
|
num_of_strike += 1
|
||||||
|
aircraft_per_flight = (
|
||||||
|
self.game.settings.pretense_ai_aircraft_per_flight
|
||||||
|
)
|
||||||
|
self.generate_pretense_flight(
|
||||||
|
ato, cp, squadron, aircraft_per_flight, flight_type
|
||||||
|
)
|
||||||
|
break
|
||||||
|
# Then plan air-to-air, if capable
|
||||||
|
if patrol_capable_cp:
|
||||||
|
while num_of_cap < self.game.settings.pretense_barcap_flights_per_cp:
|
||||||
|
for squadron in random_squadron_list:
|
||||||
|
# Intentionally don't spawn anything at OffMapSpawns in Pretense
|
||||||
|
if isinstance(squadron.location, OffMapSpawn):
|
||||||
|
continue
|
||||||
|
if cp.coalition != squadron.coalition:
|
||||||
|
continue
|
||||||
|
|
||||||
|
mission_types = squadron.auto_assignable_mission_types
|
||||||
|
for task in patrol_tasks:
|
||||||
|
if task in mission_types and not squadron.aircraft.helicopter:
|
||||||
|
flight_type = FlightType.BARCAP
|
||||||
|
num_of_cap += 1
|
||||||
|
aircraft_per_flight = (
|
||||||
|
self.game.settings.pretense_ai_aircraft_per_flight
|
||||||
|
)
|
||||||
|
self.generate_pretense_flight(
|
||||||
|
ato, cp, squadron, aircraft_per_flight, flight_type
|
||||||
|
)
|
||||||
|
break
|
||||||
|
# Then plan CAS, if capable
|
||||||
|
if cas_capable_cp:
|
||||||
|
while num_of_cas < self.game.settings.pretense_cas_flights_per_cp:
|
||||||
|
for squadron in random_squadron_list:
|
||||||
|
# Intentionally don't spawn anything at OffMapSpawns in Pretense
|
||||||
|
if isinstance(squadron.location, OffMapSpawn):
|
||||||
|
continue
|
||||||
|
if cp.coalition != squadron.coalition:
|
||||||
|
continue
|
||||||
|
|
||||||
|
mission_types = squadron.auto_assignable_mission_types
|
||||||
|
if (
|
||||||
|
squadron.aircraft.helicopter
|
||||||
|
and (FlightType.ESCORT in mission_types)
|
||||||
|
) or (FlightType.CAS in mission_types):
|
||||||
|
flight_type = FlightType.CAS
|
||||||
|
num_of_cas += 1
|
||||||
|
aircraft_per_flight = (
|
||||||
|
self.game.settings.pretense_ai_aircraft_per_flight
|
||||||
|
)
|
||||||
|
self.generate_pretense_flight(
|
||||||
|
ato, cp, squadron, aircraft_per_flight, flight_type
|
||||||
|
)
|
||||||
|
# And finally, plan BAI, if capable
|
||||||
|
if bai_capable_cp:
|
||||||
|
while num_of_bai < self.game.settings.pretense_bai_flights_per_cp:
|
||||||
|
for squadron in random_squadron_list:
|
||||||
|
# Intentionally don't spawn anything at OffMapSpawns in Pretense
|
||||||
|
if isinstance(squadron.location, OffMapSpawn):
|
||||||
|
continue
|
||||||
|
if cp.coalition != squadron.coalition:
|
||||||
|
continue
|
||||||
|
|
||||||
|
mission_types = squadron.auto_assignable_mission_types
|
||||||
|
if FlightType.BAI in mission_types:
|
||||||
|
flight_type = FlightType.BAI
|
||||||
|
num_of_bai += 1
|
||||||
|
aircraft_per_flight = (
|
||||||
|
self.game.settings.pretense_ai_aircraft_per_flight
|
||||||
|
)
|
||||||
|
self.generate_pretense_flight(
|
||||||
|
ato, cp, squadron, aircraft_per_flight, flight_type
|
||||||
|
)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def generate_pretense_flight(
|
||||||
|
self,
|
||||||
|
ato: AirTaskingOrder,
|
||||||
|
cp: ControlPoint,
|
||||||
|
squadron: Squadron,
|
||||||
|
aircraft_per_flight: int,
|
||||||
|
flight_type: FlightType,
|
||||||
|
) -> None:
|
||||||
|
squadron.owned_aircraft += self.game.settings.pretense_ai_aircraft_per_flight
|
||||||
|
squadron.untasked_aircraft += self.game.settings.pretense_ai_aircraft_per_flight
|
||||||
|
squadron.populate_for_turn_0(False)
|
||||||
|
package = Package(cp, squadron.flight_db, auto_asap=False)
|
||||||
|
if flight_type == FlightType.TRANSPORT:
|
||||||
|
flight = Flight(
|
||||||
|
package,
|
||||||
|
squadron,
|
||||||
|
aircraft_per_flight,
|
||||||
|
FlightType.PRETENSE_CARGO,
|
||||||
|
StartType.IN_FLIGHT,
|
||||||
|
divert=cp,
|
||||||
|
)
|
||||||
|
package.add_flight(flight)
|
||||||
|
flight.state = Navigating(flight, self.game.settings, waypoint_index=1)
|
||||||
|
else:
|
||||||
|
flight = Flight(
|
||||||
|
package,
|
||||||
|
squadron,
|
||||||
|
aircraft_per_flight,
|
||||||
|
flight_type,
|
||||||
|
StartType.COLD,
|
||||||
|
divert=cp,
|
||||||
|
)
|
||||||
|
package.add_flight(flight)
|
||||||
|
flight.state = WaitingForStart(
|
||||||
|
flight, self.game.settings, self.game.conditions.start_time
|
||||||
|
)
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"Generated flight for {flight_type} flying {squadron.aircraft.display_name} at {squadron.location.name}"
|
||||||
|
)
|
||||||
|
ato.add_package(package)
|
||||||
|
|
||||||
def generate_pretense_aircraft_for_other_side(
|
def generate_pretense_aircraft_for_other_side(
|
||||||
self, cp: ControlPoint, coalition: Coalition, ato: AirTaskingOrder
|
self, cp: ControlPoint, coalition: Coalition, ato: AirTaskingOrder
|
||||||
) -> None:
|
) -> None:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user