mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +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 choose locations for factories to spawn.
|
||||||
* **[Modding]** Campaigns now use map structures as strike targets.
|
* **[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 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.
|
* **[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.
|
* **[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.
|
* **[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,
|
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
|
REQUIRED_EWR_UNIT_TYPE = AirDefence.EWR_1L13.id
|
||||||
|
|
||||||
ARMOR_GROUP_UNIT_TYPE = Armor.MBT_M1A2_Abrams.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:
|
if group.units[0].type in self.REQUIRED_SHORT_RANGE_SAM_UNIT_TYPES:
|
||||||
yield group
|
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
|
@property
|
||||||
def required_ewrs(self) -> Iterator[VehicleGroup]:
|
def required_ewrs(self) -> Iterator[VehicleGroup]:
|
||||||
for group in self.red.vehicle_group:
|
for group in self.red.vehicle_group:
|
||||||
@ -516,6 +528,12 @@ class MizCampaignLoader:
|
|||||||
PointWithHeading.from_point(group.position, group.units[0].heading)
|
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:
|
for group in self.required_ewrs:
|
||||||
closest, distance = self.objective_info(group)
|
closest, distance = self.objective_info(group)
|
||||||
closest.preset_locations.required_ewrs.append(
|
closest.preset_locations.required_ewrs.append(
|
||||||
|
|||||||
@ -135,6 +135,9 @@ class PresetLocations:
|
|||||||
#: Locations of short range SAMs which should always be spawned.
|
#: Locations of short range SAMs which should always be spawned.
|
||||||
required_short_range_sams: List[PointWithHeading] = field(default_factory=list)
|
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.
|
#: Locations of EWRs which should always be spawned.
|
||||||
required_ewrs: List[PointWithHeading] = field(default_factory=list)
|
required_ewrs: List[PointWithHeading] = field(default_factory=list)
|
||||||
|
|
||||||
|
|||||||
@ -407,7 +407,10 @@ class BaseDefenseGenerator:
|
|||||||
)
|
)
|
||||||
|
|
||||||
groups = generate_anti_air_group(
|
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:
|
if not groups:
|
||||||
logging.error(f"Could not generate SHORAD group at {self.control_point}")
|
logging.error(f"Could not generate SHORAD group at {self.control_point}")
|
||||||
@ -540,6 +543,7 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator):
|
|||||||
{AirDefenseRange.Long},
|
{AirDefenseRange.Long},
|
||||||
{AirDefenseRange.Medium},
|
{AirDefenseRange.Medium},
|
||||||
{AirDefenseRange.Short},
|
{AirDefenseRange.Short},
|
||||||
|
{AirDefenseRange.AAA},
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
for position in presets.required_medium_range_sams:
|
for position in presets.required_medium_range_sams:
|
||||||
@ -548,17 +552,24 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator):
|
|||||||
ranges=[
|
ranges=[
|
||||||
{AirDefenseRange.Medium},
|
{AirDefenseRange.Medium},
|
||||||
{AirDefenseRange.Short},
|
{AirDefenseRange.Short},
|
||||||
|
{AirDefenseRange.AAA},
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
for position in presets.required_short_range_sams:
|
for position in presets.required_short_range_sams:
|
||||||
self.generate_aa_at(
|
self.generate_aa_at(
|
||||||
position,
|
position,
|
||||||
ranges=[{AirDefenseRange.Short}],
|
ranges=[{AirDefenseRange.Short}, {AirDefenseRange.AAA}],
|
||||||
|
)
|
||||||
|
for position in presets.required_aaa:
|
||||||
|
self.generate_aa_at(
|
||||||
|
position,
|
||||||
|
ranges=[{AirDefenseRange.AAA}],
|
||||||
)
|
)
|
||||||
return (
|
return (
|
||||||
len(presets.required_long_range_sams)
|
len(presets.required_long_range_sams)
|
||||||
+ len(presets.required_medium_range_sams)
|
+ len(presets.required_medium_range_sams)
|
||||||
+ len(presets.required_short_range_sams)
|
+ len(presets.required_short_range_sams)
|
||||||
|
+ len(presets.required_aaa)
|
||||||
)
|
)
|
||||||
|
|
||||||
def generate_required_ewr(self) -> int:
|
def generate_required_ewr(self) -> int:
|
||||||
|
|||||||
@ -66,4 +66,11 @@ VERSION = _build_version_string()
|
|||||||
#: * Coastal defenses
|
#: * Coastal defenses
|
||||||
#:
|
#:
|
||||||
#: See the unit lists in MizCampaignLoader in conflicttheater.py for unit types.
|
#: 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
|
@classmethod
|
||||||
def range(cls) -> AirDefenseRange:
|
def range(cls) -> AirDefenseRange:
|
||||||
return AirDefenseRange.Short
|
return AirDefenseRange.AAA
|
||||||
|
|||||||
@ -98,4 +98,4 @@ class FlakGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def range(cls) -> AirDefenseRange:
|
def range(cls) -> AirDefenseRange:
|
||||||
return AirDefenseRange.Short
|
return AirDefenseRange.AAA
|
||||||
|
|||||||
@ -43,4 +43,4 @@ class Flak18Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def range(cls) -> AirDefenseRange:
|
def range(cls) -> AirDefenseRange:
|
||||||
return AirDefenseRange.Short
|
return AirDefenseRange.AAA
|
||||||
|
|||||||
@ -41,4 +41,4 @@ class KS19Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def range(cls) -> AirDefenseRange:
|
def range(cls) -> AirDefenseRange:
|
||||||
return AirDefenseRange.Short
|
return AirDefenseRange.AAA
|
||||||
|
|||||||
@ -80,4 +80,4 @@ class AllyWW2FlakGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def range(cls) -> AirDefenseRange:
|
def range(cls) -> AirDefenseRange:
|
||||||
return AirDefenseRange.Short
|
return AirDefenseRange.AAA
|
||||||
|
|||||||
@ -30,4 +30,4 @@ class ZSU57Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def range(cls) -> AirDefenseRange:
|
def range(cls) -> AirDefenseRange:
|
||||||
return AirDefenseRange.Short
|
return AirDefenseRange.AAA
|
||||||
|
|||||||
@ -36,4 +36,4 @@ class ZU23InsurgentGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def range(cls) -> AirDefenseRange:
|
def range(cls) -> AirDefenseRange:
|
||||||
return AirDefenseRange.Short
|
return AirDefenseRange.AAA
|
||||||
|
|||||||
@ -1,4 +1,3 @@
|
|||||||
import logging
|
|
||||||
from abc import ABC, abstractmethod
|
from abc import ABC, abstractmethod
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import Iterator, List
|
from typing import Iterator, List
|
||||||
@ -6,11 +5,12 @@ from typing import Iterator, List
|
|||||||
from dcs.unitgroup import VehicleGroup
|
from dcs.unitgroup import VehicleGroup
|
||||||
|
|
||||||
from game import Game
|
from game import Game
|
||||||
from gen.sam.group_generator import GroupGenerator
|
|
||||||
from game.theater.theatergroundobject import SamGroundObject
|
from game.theater.theatergroundobject import SamGroundObject
|
||||||
|
from gen.sam.group_generator import GroupGenerator
|
||||||
|
|
||||||
|
|
||||||
class AirDefenseRange(Enum):
|
class AirDefenseRange(Enum):
|
||||||
|
AAA = "AAA"
|
||||||
Short = "short"
|
Short = "short"
|
||||||
Medium = "medium"
|
Medium = "medium"
|
||||||
Long = "long"
|
Long = "long"
|
||||||
|
|||||||
@ -6,7 +6,6 @@ from gen.sam.airdefensegroupgenerator import (
|
|||||||
AirDefenseRange,
|
AirDefenseRange,
|
||||||
AirDefenseGroupGenerator,
|
AirDefenseGroupGenerator,
|
||||||
)
|
)
|
||||||
from gen.sam.group_generator import GroupGenerator
|
|
||||||
|
|
||||||
|
|
||||||
class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator):
|
class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator):
|
||||||
@ -80,7 +79,7 @@ class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def range(cls) -> AirDefenseRange:
|
def range(cls) -> AirDefenseRange:
|
||||||
return AirDefenseRange.Short
|
return AirDefenseRange.AAA
|
||||||
|
|
||||||
|
|
||||||
class ColdWarFlakGenerator(AirDefenseGroupGenerator):
|
class ColdWarFlakGenerator(AirDefenseGroupGenerator):
|
||||||
@ -153,4 +152,4 @@ class ColdWarFlakGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def range(cls) -> AirDefenseRange:
|
def range(cls) -> AirDefenseRange:
|
||||||
return AirDefenseRange.Short
|
return AirDefenseRange.AAA
|
||||||
|
|||||||
@ -42,4 +42,4 @@ class VulcanGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def range(cls) -> AirDefenseRange:
|
def range(cls) -> AirDefenseRange:
|
||||||
return AirDefenseRange.Short
|
return AirDefenseRange.AAA
|
||||||
|
|||||||
@ -33,4 +33,4 @@ class ZSU23Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def range(cls) -> AirDefenseRange:
|
def range(cls) -> AirDefenseRange:
|
||||||
return AirDefenseRange.Short
|
return AirDefenseRange.AAA
|
||||||
|
|||||||
@ -36,4 +36,4 @@ class ZU23Generator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def range(cls) -> AirDefenseRange:
|
def range(cls) -> AirDefenseRange:
|
||||||
return AirDefenseRange.Short
|
return AirDefenseRange.AAA
|
||||||
|
|||||||
@ -33,4 +33,4 @@ class ZU23UralGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def range(cls) -> AirDefenseRange:
|
def range(cls) -> AirDefenseRange:
|
||||||
return AirDefenseRange.Short
|
return AirDefenseRange.AAA
|
||||||
|
|||||||
@ -33,4 +33,4 @@ class ZU23UralInsurgentGenerator(AirDefenseGroupGenerator):
|
|||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def range(cls) -> AirDefenseRange:
|
def range(cls) -> AirDefenseRange:
|
||||||
return AirDefenseRange.Short
|
return AirDefenseRange.AAA
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user