mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
reworked the skynet group name generation
- added information about the role of the aa site
- moved handling of ground name from tgo to the sam generator to make the tgo cleaner
- adjusted the skynet-config lua to the changes
(cherry picked from commit de443fa3f0)
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from abc import ABC, abstractmethod
|
||||
from enum import Enum
|
||||
from typing import Iterator, List
|
||||
@@ -9,11 +11,31 @@ from game.theater.theatergroundobject import SamGroundObject
|
||||
from gen.sam.group_generator import GroupGenerator
|
||||
|
||||
|
||||
class SkynetRole(Enum):
|
||||
#: A radar SAM that should be controlled by Skynet.
|
||||
Sam = "Sam"
|
||||
|
||||
#: A radar SAM that should be controlled and used as an EWR by Skynet.
|
||||
SamAsEwr = "SamAsEwr"
|
||||
|
||||
#: An air defense unit that should be used as point defense by Skynet.
|
||||
PointDefense = "PD"
|
||||
|
||||
#: All other types of groups that might be present in a SAM TGO. This includes
|
||||
#: SHORADS, AAA, supply trucks, etc. Anything that shouldn't be controlled by Skynet
|
||||
#: should use this role.
|
||||
NoSkynetBehavior = "NoSkynetBehavior"
|
||||
|
||||
|
||||
class AirDefenseRange(Enum):
|
||||
AAA = "AAA"
|
||||
Short = "short"
|
||||
Medium = "medium"
|
||||
Long = "long"
|
||||
AAA = ("AAA", SkynetRole.NoSkynetBehavior)
|
||||
Short = ("short", SkynetRole.NoSkynetBehavior)
|
||||
Medium = ("medium", SkynetRole.Sam)
|
||||
Long = ("long", SkynetRole.SamAsEwr)
|
||||
|
||||
def __init__(self, description: str, default_role: SkynetRole) -> None:
|
||||
self.range_name = description
|
||||
self.default_role = default_role
|
||||
|
||||
|
||||
class AirDefenseGroupGenerator(GroupGenerator, ABC):
|
||||
@@ -24,18 +46,32 @@ class AirDefenseGroupGenerator(GroupGenerator, ABC):
|
||||
price: int
|
||||
|
||||
def __init__(self, game: Game, ground_object: SamGroundObject) -> None:
|
||||
ground_object.skynet_capable = True
|
||||
super().__init__(game, ground_object)
|
||||
|
||||
self.vg.name = self.group_name_for_role(self.vg.id, self.primary_group_role())
|
||||
self.auxiliary_groups: List[VehicleGroup] = []
|
||||
|
||||
def add_auxiliary_group(self, name_suffix: str) -> VehicleGroup:
|
||||
group = VehicleGroup(
|
||||
self.game.next_group_id(), "|".join([self.go.group_name, name_suffix])
|
||||
)
|
||||
def add_auxiliary_group(self, role: SkynetRole) -> VehicleGroup:
|
||||
gid = self.game.next_group_id()
|
||||
group = VehicleGroup(gid, self.group_name_for_role(gid, role))
|
||||
self.auxiliary_groups.append(group)
|
||||
return group
|
||||
|
||||
def group_name_for_role(self, gid: int, role: SkynetRole) -> str:
|
||||
if role is SkynetRole.NoSkynetBehavior:
|
||||
# No special naming needed for air defense groups that don't participate in
|
||||
# Skynet.
|
||||
return f"{self.go.group_name}|{gid}"
|
||||
|
||||
# For those that do, we need a prefix of `$COLOR|SAM| so our Skynet config picks
|
||||
# the group up at all. To support PDs we need to append the ID of the TGO so
|
||||
# that the PD will know which group it's protecting. We then append the role so
|
||||
# our config knows what to do with the group, and finally the GID of *this*
|
||||
# group to ensure no conflicts.
|
||||
return "|".join(
|
||||
[self.go.faction_color, "SAM", str(self.go.group_id), role.value, str(gid)]
|
||||
)
|
||||
|
||||
def get_generated_group(self) -> VehicleGroup:
|
||||
raise RuntimeError(
|
||||
"Deprecated call to AirDefenseGroupGenerator.get_generated_group "
|
||||
@@ -52,3 +88,7 @@ class AirDefenseGroupGenerator(GroupGenerator, ABC):
|
||||
@abstractmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
...
|
||||
|
||||
@classmethod
|
||||
def primary_group_role(cls) -> SkynetRole:
|
||||
return cls.range().default_role
|
||||
|
||||
@@ -6,6 +6,7 @@ from dcs.vehicles import AirDefence
|
||||
from gen.sam.airdefensegroupgenerator import (
|
||||
AirDefenseRange,
|
||||
AirDefenseGroupGenerator,
|
||||
SkynetRole,
|
||||
)
|
||||
|
||||
|
||||
@@ -41,7 +42,7 @@ class HawkGenerator(AirDefenseGroupGenerator):
|
||||
)
|
||||
|
||||
# Triple A for close range defense
|
||||
aa_group = self.add_auxiliary_group("AA")
|
||||
aa_group = self.add_auxiliary_group(SkynetRole.NoSkynetBehavior)
|
||||
self.add_unit_to_group(
|
||||
aa_group,
|
||||
AirDefence.Vulcan,
|
||||
|
||||
@@ -6,6 +6,7 @@ from dcs.vehicles import AirDefence
|
||||
from gen.sam.airdefensegroupgenerator import (
|
||||
AirDefenseRange,
|
||||
AirDefenseGroupGenerator,
|
||||
SkynetRole,
|
||||
)
|
||||
|
||||
|
||||
@@ -34,7 +35,7 @@ class HQ7Generator(AirDefenseGroupGenerator):
|
||||
)
|
||||
|
||||
# Triple A for close range defense
|
||||
aa_group = self.add_auxiliary_group("AA")
|
||||
aa_group = self.add_auxiliary_group(SkynetRole.NoSkynetBehavior)
|
||||
self.add_unit_to_group(
|
||||
aa_group,
|
||||
AirDefence.Ural_375_ZU_23,
|
||||
|
||||
@@ -6,6 +6,7 @@ from dcs.vehicles import AirDefence
|
||||
from gen.sam.airdefensegroupgenerator import (
|
||||
AirDefenseRange,
|
||||
AirDefenseGroupGenerator,
|
||||
SkynetRole,
|
||||
)
|
||||
|
||||
|
||||
@@ -69,7 +70,7 @@ class PatriotGenerator(AirDefenseGroupGenerator):
|
||||
)
|
||||
|
||||
# Short range protection for high value site
|
||||
aa_group = self.add_auxiliary_group("AA")
|
||||
aa_group = self.add_auxiliary_group(SkynetRole.NoSkynetBehavior)
|
||||
num_launchers = random.randint(3, 4)
|
||||
positions = self.get_circular_position(
|
||||
num_launchers, launcher_distance=200, coverage=360
|
||||
|
||||
@@ -5,6 +5,7 @@ from dcs.vehicles import AirDefence
|
||||
from gen.sam.airdefensegroupgenerator import (
|
||||
AirDefenseRange,
|
||||
AirDefenseGroupGenerator,
|
||||
SkynetRole,
|
||||
)
|
||||
|
||||
|
||||
@@ -49,3 +50,7 @@ class RapierGenerator(AirDefenseGroupGenerator):
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
|
||||
@classmethod
|
||||
def primary_group_role(cls) -> SkynetRole:
|
||||
return SkynetRole.Sam
|
||||
|
||||
@@ -3,6 +3,7 @@ from dcs.vehicles import AirDefence, Unarmed
|
||||
from gen.sam.airdefensegroupgenerator import (
|
||||
AirDefenseRange,
|
||||
AirDefenseGroupGenerator,
|
||||
SkynetRole,
|
||||
)
|
||||
|
||||
|
||||
@@ -40,3 +41,7 @@ class RolandGenerator(AirDefenseGroupGenerator):
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.Short
|
||||
|
||||
@classmethod
|
||||
def primary_group_role(cls) -> SkynetRole:
|
||||
return SkynetRole.Sam
|
||||
|
||||
@@ -8,6 +8,7 @@ from game.theater import SamGroundObject
|
||||
from gen.sam.airdefensegroupgenerator import (
|
||||
AirDefenseRange,
|
||||
AirDefenseGroupGenerator,
|
||||
SkynetRole,
|
||||
)
|
||||
from pydcs_extensions.highdigitsams import highdigitsams
|
||||
|
||||
@@ -76,7 +77,7 @@ class SA10Generator(AirDefenseGroupGenerator):
|
||||
|
||||
def generate_defensive_groups(self) -> None:
|
||||
# AAA for defending against close targets.
|
||||
aa_group = self.add_auxiliary_group("AA")
|
||||
aa_group = self.add_auxiliary_group(SkynetRole.NoSkynetBehavior)
|
||||
num_launchers = random.randint(6, 8)
|
||||
positions = self.get_circular_position(
|
||||
num_launchers, launcher_distance=210, coverage=360
|
||||
@@ -101,7 +102,7 @@ class Tier2SA10Generator(SA10Generator):
|
||||
super().generate_defensive_groups()
|
||||
|
||||
# SA-15 for both shorter range targets and point defense.
|
||||
pd_group = self.add_auxiliary_group("PD")
|
||||
pd_group = self.add_auxiliary_group(SkynetRole.PointDefense)
|
||||
num_launchers = random.randint(2, 4)
|
||||
positions = self.get_circular_position(
|
||||
num_launchers, launcher_distance=140, coverage=360
|
||||
@@ -123,7 +124,7 @@ class Tier3SA10Generator(SA10Generator):
|
||||
|
||||
def generate_defensive_groups(self) -> None:
|
||||
# AAA for defending against close targets.
|
||||
aa_group = self.add_auxiliary_group("AA")
|
||||
aa_group = self.add_auxiliary_group(SkynetRole.NoSkynetBehavior)
|
||||
num_launchers = random.randint(6, 8)
|
||||
positions = self.get_circular_position(
|
||||
num_launchers, launcher_distance=210, coverage=360
|
||||
@@ -138,7 +139,7 @@ class Tier3SA10Generator(SA10Generator):
|
||||
)
|
||||
|
||||
# SA-15 for both shorter range targets and point defense.
|
||||
pd_group = self.add_auxiliary_group("PD")
|
||||
pd_group = self.add_auxiliary_group(SkynetRole.PointDefense)
|
||||
num_launchers = random.randint(2, 4)
|
||||
positions = self.get_circular_position(
|
||||
num_launchers, launcher_distance=140, coverage=360
|
||||
|
||||
Reference in New Issue
Block a user