mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
Add support for AAA objectives.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/999
This commit is contained in:
parent
dcbe12f1af
commit
cd391a360c
@ -14,6 +14,7 @@ Saves from 2.5 are not compatible with 3.0.
|
||||
* **[Modding]** Campaigns now choose locations for factories to spawn.
|
||||
* **[Modding]** Campaigns now use map structures as strike targets.
|
||||
* **[Modding]** Campaigns may now set *any* objective type to be a required spawn rather than random chance.
|
||||
* **[Modding]** Campaigns may now place AAA objectives.
|
||||
* **[Modding]** Can now install custom factions to <DCS saved games>/Liberation/Factions instead of the Liberation install directory.
|
||||
* **[Performance Settings]** Added a settings to lower the number of smoke effects generated on frontlines. Lowered default settings for frontline smoke generators, so less smoke should be generated by default.
|
||||
* **[Configuration]** Liberation preferences (DCS install and save game location) are now saved to `%LOCALAPPDATA%/DCSLiberation` to prevent needing to reconfigure each new install.
|
||||
|
||||
@ -115,6 +115,12 @@ class MizCampaignLoader:
|
||||
AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL.id,
|
||||
}
|
||||
|
||||
REQUIRED_AAA_UNIT_TYPES = {
|
||||
AirDefence.AAA_8_8cm_Flak_18.id,
|
||||
AirDefence.SPAAA_Vulcan_M163.id,
|
||||
AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish.id,
|
||||
}
|
||||
|
||||
REQUIRED_EWR_UNIT_TYPE = AirDefence.EWR_1L13.id
|
||||
|
||||
ARMOR_GROUP_UNIT_TYPE = Armor.MBT_M1A2_Abrams.id
|
||||
@ -283,6 +289,12 @@ class MizCampaignLoader:
|
||||
if group.units[0].type in self.REQUIRED_SHORT_RANGE_SAM_UNIT_TYPES:
|
||||
yield group
|
||||
|
||||
@property
|
||||
def required_aaa(self) -> Iterator[VehicleGroup]:
|
||||
for group in itertools.chain(self.blue.vehicle_group, self.red.vehicle_group):
|
||||
if group.units[0].type in self.REQUIRED_AAA_UNIT_TYPES:
|
||||
yield group
|
||||
|
||||
@property
|
||||
def required_ewrs(self) -> Iterator[VehicleGroup]:
|
||||
for group in self.red.vehicle_group:
|
||||
@ -516,6 +528,12 @@ class MizCampaignLoader:
|
||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
||||
)
|
||||
|
||||
for group in self.required_aaa:
|
||||
closest, distance = self.objective_info(group)
|
||||
closest.preset_locations.required_aaa.append(
|
||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
||||
)
|
||||
|
||||
for group in self.required_ewrs:
|
||||
closest, distance = self.objective_info(group)
|
||||
closest.preset_locations.required_ewrs.append(
|
||||
|
||||
@ -135,6 +135,9 @@ class PresetLocations:
|
||||
#: Locations of short range SAMs which should always be spawned.
|
||||
required_short_range_sams: List[PointWithHeading] = field(default_factory=list)
|
||||
|
||||
#: Locations of AAA groups which should always be spawned.
|
||||
required_aaa: List[PointWithHeading] = field(default_factory=list)
|
||||
|
||||
#: Locations of EWRs which should always be spawned.
|
||||
required_ewrs: List[PointWithHeading] = field(default_factory=list)
|
||||
|
||||
|
||||
@ -407,7 +407,10 @@ class BaseDefenseGenerator:
|
||||
)
|
||||
|
||||
groups = generate_anti_air_group(
|
||||
self.game, g, self.faction, ranges=[{AirDefenseRange.Short}]
|
||||
self.game,
|
||||
g,
|
||||
self.faction,
|
||||
ranges=[{AirDefenseRange.Short, AirDefenseRange.AAA}],
|
||||
)
|
||||
if not groups:
|
||||
logging.error(f"Could not generate SHORAD group at {self.control_point}")
|
||||
@ -540,6 +543,7 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator):
|
||||
{AirDefenseRange.Long},
|
||||
{AirDefenseRange.Medium},
|
||||
{AirDefenseRange.Short},
|
||||
{AirDefenseRange.AAA},
|
||||
],
|
||||
)
|
||||
for position in presets.required_medium_range_sams:
|
||||
@ -548,17 +552,24 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator):
|
||||
ranges=[
|
||||
{AirDefenseRange.Medium},
|
||||
{AirDefenseRange.Short},
|
||||
{AirDefenseRange.AAA},
|
||||
],
|
||||
)
|
||||
for position in presets.required_short_range_sams:
|
||||
self.generate_aa_at(
|
||||
position,
|
||||
ranges=[{AirDefenseRange.Short}],
|
||||
ranges=[{AirDefenseRange.Short}, {AirDefenseRange.AAA}],
|
||||
)
|
||||
for position in presets.required_aaa:
|
||||
self.generate_aa_at(
|
||||
position,
|
||||
ranges=[{AirDefenseRange.AAA}],
|
||||
)
|
||||
return (
|
||||
len(presets.required_long_range_sams)
|
||||
+ len(presets.required_medium_range_sams)
|
||||
+ len(presets.required_short_range_sams)
|
||||
+ len(presets.required_aaa)
|
||||
)
|
||||
|
||||
def generate_required_ewr(self) -> int:
|
||||
|
||||
@ -66,4 +66,11 @@ VERSION = _build_version_string()
|
||||
#: * Coastal defenses
|
||||
#:
|
||||
#: See the unit lists in MizCampaignLoader in conflicttheater.py for unit types.
|
||||
CAMPAIGN_FORMAT_VERSION = (4, 1)
|
||||
#:
|
||||
#: Version 4.2
|
||||
#: * Adds support for AAA objectives. Place with any of the following units (either red
|
||||
#: or blue):
|
||||
#: * AAA_8_8cm_Flak_18,
|
||||
#: * SPAAA_Vulcan_M163,
|
||||
#: * SPAAA_ZSU_23_4_Shilka_Gun_Dish,
|
||||
CAMPAIGN_FORMAT_VERSION = (4, 2)
|
||||
|
||||
@ -36,4 +36,4 @@ class BoforsGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
@ -98,4 +98,4 @@ class FlakGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
@ -43,4 +43,4 @@ class Flak18Generator(AirDefenseGroupGenerator):
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
@ -41,4 +41,4 @@ class KS19Generator(AirDefenseGroupGenerator):
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
@ -80,4 +80,4 @@ class AllyWW2FlakGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
@ -30,4 +30,4 @@ class ZSU57Generator(AirDefenseGroupGenerator):
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
@ -36,4 +36,4 @@ class ZU23InsurgentGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
@ -1,4 +1,3 @@
|
||||
import logging
|
||||
from abc import ABC, abstractmethod
|
||||
from enum import Enum
|
||||
from typing import Iterator, List
|
||||
@ -6,11 +5,12 @@ from typing import Iterator, List
|
||||
from dcs.unitgroup import VehicleGroup
|
||||
|
||||
from game import Game
|
||||
from gen.sam.group_generator import GroupGenerator
|
||||
from game.theater.theatergroundobject import SamGroundObject
|
||||
from gen.sam.group_generator import GroupGenerator
|
||||
|
||||
|
||||
class AirDefenseRange(Enum):
|
||||
AAA = "AAA"
|
||||
Short = "short"
|
||||
Medium = "medium"
|
||||
Long = "long"
|
||||
|
||||
@ -6,7 +6,6 @@ from gen.sam.airdefensegroupgenerator import (
|
||||
AirDefenseRange,
|
||||
AirDefenseGroupGenerator,
|
||||
)
|
||||
from gen.sam.group_generator import GroupGenerator
|
||||
|
||||
|
||||
class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator):
|
||||
@ -80,7 +79,7 @@ class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
|
||||
class ColdWarFlakGenerator(AirDefenseGroupGenerator):
|
||||
@ -153,4 +152,4 @@ class ColdWarFlakGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
@ -42,4 +42,4 @@ class VulcanGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
@ -33,4 +33,4 @@ class ZSU23Generator(AirDefenseGroupGenerator):
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
@ -36,4 +36,4 @@ class ZU23Generator(AirDefenseGroupGenerator):
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
@ -33,4 +33,4 @@ class ZU23UralGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
@ -33,4 +33,4 @@ class ZU23UralInsurgentGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user