Prepare the generators for template migration

adopt armor and ship generators for randomization
This commit is contained in:
RndName
2022-01-15 23:26:46 +01:00
parent 9e6b1cf716
commit 6baf36c587
66 changed files with 600 additions and 798 deletions

View File

@@ -0,0 +1,35 @@
import random
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class BoforsGenerator(AirDefenseGroupGenerator):
"""
This generate a Bofors flak artillery group
"""
name = "Bofors AAA"
def generate(self) -> None:
index = 0
for i in range(4):
spacing_x = random.randint(10, 40)
spacing_y = random.randint(10, 40)
index = index + 1
self.add_unit(
AirDefence.Bofors40,
"AAA#" + str(index),
self.position.x + spacing_x * i,
self.position.y + spacing_y * i,
self.heading,
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.AAA

99
gen/to_remove/aaa_flak.py Normal file
View File

@@ -0,0 +1,99 @@
import random
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
from game.utils import Heading
GFLAK = [
AirDefence.Flak38,
AirDefence.Flak18,
AirDefence.Flak36,
AirDefence.Flak37,
AirDefence.Flak41,
AirDefence.Flak30,
]
class FlakGenerator(AirDefenseGroupGenerator):
"""
This generate a German flak artillery group
"""
name = "Flak Site"
def generate(self) -> None:
index = 0
mixed = random.choice([True, False])
unit_type = random.choice(GFLAK)
for i in range(4):
index = index + 1
spacing_x = random.randint(10, 40)
spacing_y = random.randint(10, 40)
self.add_unit(
unit_type,
"AAA#" + str(index),
self.position.x + spacing_x * i + random.randint(1, 5),
self.position.y + spacing_y * i + random.randint(1, 5),
self.heading,
)
if mixed:
unit_type = random.choice(GFLAK)
# Search lights
search_pos = self.get_circular_position(random.randint(2, 3), 80)
for index, pos in enumerate(search_pos):
self.add_unit(
AirDefence.Flakscheinwerfer_37,
"SearchLight#" + str(index),
pos[0],
pos[1],
self.heading,
)
# Support
self.add_unit(
AirDefence.Maschinensatz_33,
"MC33#",
self.position.x - 20,
self.position.y - 20,
self.heading,
)
self.add_unit(
AirDefence.KDO_Mod40,
"KDO#",
self.position.x - 25,
self.position.y - 20,
self.heading,
)
# Commander
self.add_unit(
Unarmed.Kubelwagen_82,
"Kubel#",
self.position.x - 35,
self.position.y - 20,
self.heading,
)
# Some Opel Blitz trucks
index = 0
for i in range(int(max(1, 2))):
for j in range(int(max(1, 2))):
index += 1
self.add_unit(
Unarmed.Blitz_36_6700A,
"BLITZ#" + str(index),
self.position.x + 125 + 15 * i + random.randint(1, 5),
self.position.y + 15 * j + random.randint(1, 5),
Heading.from_degrees(75),
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.AAA

View File

@@ -0,0 +1,45 @@
import random
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class Flak18Generator(AirDefenseGroupGenerator):
"""
This generate a German flak artillery group using only free units, thus not requiring the WW2 asset pack
"""
name = "WW2 Flak Site"
def generate(self) -> None:
spacing = random.randint(30, 60)
index = 0
for i in range(3):
for j in range(2):
index = index + 1
self.add_unit(
AirDefence.Flak18,
"AAA#" + str(index),
self.position.x + spacing * i + random.randint(1, 5),
self.position.y + spacing * j + random.randint(1, 5),
self.heading,
)
# Add a commander truck
self.add_unit(
Unarmed.Blitz_36_6700A,
"Blitz#",
self.position.x - 35,
self.position.y - 20,
self.heading,
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.AAA

41
gen/to_remove/aaa_ks19.py Normal file
View File

@@ -0,0 +1,41 @@
import random
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
from pydcs_extensions.highdigitsams import highdigitsams
class KS19Generator(AirDefenseGroupGenerator):
"""
This generate a KS 19 flak artillery group (KS-19 from the High Digit SAM mod)
"""
name = "KS-19 AAA Site"
def generate(self) -> None:
self.add_unit(
highdigitsams.AAA_SON_9_Fire_Can,
"TR",
self.position.x - 20,
self.position.y - 20,
self.heading,
)
index = 0
for i in range(4):
spacing_x = random.randint(10, 40)
spacing_y = random.randint(10, 40)
index = index + 1
self.add_unit(
highdigitsams.AAA_100mm_KS_19,
"AAA#" + str(index),
self.position.x + spacing_x * i,
self.position.y + spacing_y * i,
self.heading,
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.AAA

View File

@@ -0,0 +1,81 @@
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
from game.utils import Heading
class AllyWW2FlakGenerator(AirDefenseGroupGenerator):
"""
This generate an ally flak artillery group
"""
name = "WW2 Ally Flak Site"
def generate(self) -> None:
positions = self.get_circular_position(4, launcher_distance=30, coverage=360)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.QF_37_AA,
"AA#" + str(i),
position[0],
position[1],
position[2],
)
positions = self.get_circular_position(8, launcher_distance=60, coverage=360)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.M1_37mm,
"AA#" + str(4 + i),
position[0],
position[1],
position[2],
)
positions = self.get_circular_position(8, launcher_distance=90, coverage=360)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.M45_Quadmount,
"AA#" + str(12 + i),
position[0],
position[1],
position[2],
)
# Add a commander truck
self.add_unit(
Unarmed.Willys_MB,
"CMD#1",
self.position.x,
self.position.y - 20,
Heading.random(),
)
self.add_unit(
Unarmed.M30_CC,
"LOG#1",
self.position.x,
self.position.y + 20,
Heading.random(),
)
self.add_unit(
Unarmed.M4_Tractor,
"LOG#2",
self.position.x + 20,
self.position.y,
Heading.random(),
)
self.add_unit(
Unarmed.Bedford_MWD,
"LOG#3",
self.position.x - 20,
self.position.y,
Heading.random(),
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.AAA

View File

@@ -0,0 +1,32 @@
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class ZSU57Generator(AirDefenseGroupGenerator):
"""
This generate a Zsu 57 group
"""
name = "ZSU-57-2 Group"
def generate(self) -> None:
num_launchers = 4
positions = self.get_circular_position(
num_launchers, launcher_distance=110, coverage=360
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.ZSU_57_2,
"SPAA#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.AAA

View File

@@ -0,0 +1,34 @@
import random
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class ZU23InsurgentGenerator(AirDefenseGroupGenerator):
"""
This generate a ZU23 insurgent flak artillery group
"""
name = "Zu-23 Site"
def generate(self) -> None:
index = 0
for i in range(4):
index = index + 1
spacing_x = random.randint(10, 40)
spacing_y = random.randint(10, 40)
self.add_unit(
AirDefence.ZU_23_Closed_Insurgent,
"AAA#" + str(index),
self.position.x + spacing_x * i,
self.position.y + spacing_y * i,
self.heading,
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.AAA

View File

@@ -0,0 +1,66 @@
from __future__ import annotations
from abc import ABC, abstractmethod
from typing import Iterator, List
from dcs.unitgroup import VehicleGroup
from game import Game
from game.theater.theatergroundobject import (
SamGroundObject,
SkynetRole,
AirDefenseRange,
)
from gen.group_generator import VehicleGroupGenerator
class AirDefenseGroupGenerator(VehicleGroupGenerator[SamGroundObject], ABC):
"""
This is the base for all SAM group generators
"""
def __init__(self, game: Game, ground_object: SamGroundObject) -> None:
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, 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", role.value, str(gid)])
def get_generated_group(self) -> VehicleGroup:
raise RuntimeError(
"Deprecated call to AirDefenseGroupGenerator.get_generated_group "
"misses auxiliary groups. Use AirDefenseGroupGenerator.groups "
"instead."
)
@property
def groups(self) -> Iterator[VehicleGroup]:
yield self.vg
yield from self.auxiliary_groups
@classmethod
@abstractmethod
def range(cls) -> AirDefenseRange:
...
@classmethod
def primary_group_role(cls) -> SkynetRole:
return cls.range().default_role

View File

@@ -0,0 +1,63 @@
import random
from typing import Optional
from dcs.unitgroup import VehicleGroup
from game import Game
from game.data.units import UnitClass
from game.dcs.groundunittype import GroundUnitType
from game.factions import FACTIONS
from game.theater.theatergroundobject import VehicleGroupGroundObject
from gen.to_remove.armored_group_generator import (
ArmoredGroupGenerator,
FixedSizeArmorGroupGenerator,
)
def generate_armor_group(
faction: str, game: Game, ground_object: VehicleGroupGroundObject
) -> Optional[VehicleGroup]:
"""
This generate a group of ground units
:return: Generated group
"""
armor_types = (
UnitClass.Apc,
UnitClass.Atgm,
UnitClass.Ifv,
UnitClass.Tank,
)
possible_unit = [
u for u in FACTIONS[faction].frontline_units if u.unit_class in armor_types
]
if len(possible_unit) > 0:
unit_type = random.choice(possible_unit)
return generate_armor_group_of_type(game, ground_object, unit_type)
return None
def generate_armor_group_of_type(
game: Game, ground_object: VehicleGroupGroundObject, unit_type: GroundUnitType
) -> VehicleGroup:
"""
This generate a group of ground units of given type
:return: Generated group
"""
generator = ArmoredGroupGenerator(game, ground_object, unit_type)
generator.generate()
return generator.get_generated_group()
def generate_armor_group_of_type_and_size(
game: Game,
ground_object: VehicleGroupGroundObject,
unit_type: GroundUnitType,
size: int,
) -> VehicleGroup:
"""
This generate a group of ground units of given type and size
:return: Generated group
"""
generator = FixedSizeArmorGroupGenerator(game, ground_object, unit_type, size)
generator.generate()
return generator.get_generated_group()

View File

@@ -0,0 +1,84 @@
import random
import dcs.vehicles
from dcs import Point
from game import Game
from game.dcs.groundunittype import GroundUnitType
from game.theater.theatergroundobject import VehicleGroupGroundObject
from game.utils import Heading
from gen.group_generator import VehicleGroupGenerator
class ArmoredGroupGenerator(VehicleGroupGenerator[VehicleGroupGroundObject]):
def __init__(
self,
game: Game,
ground_object: VehicleGroupGroundObject,
unit_type: GroundUnitType,
) -> None:
super().__init__(game, ground_object)
self.unit_type = unit_type
self.heading = Heading.from_degrees(0)
def generate(self) -> None:
grid_x = random.randint(2, 3)
grid_y = random.randint(1, 2)
spacing = random.randint(30, 80)
index = 0
for i in range(grid_x):
for j in range(grid_y):
index = index + 1
self.add_unit(
self.unit_type.dcs_unit_type,
"Armor#" + str(index),
self.position.x + spacing * i,
self.position.y + spacing * j,
self.heading,
)
class FixedSizeArmorGroupGenerator(VehicleGroupGenerator[VehicleGroupGroundObject]):
def __init__(
self,
game: Game,
ground_object: VehicleGroupGroundObject,
unit_type: GroundUnitType,
size: int,
) -> None:
super().__init__(game, ground_object)
self.unit_type = unit_type
self.size = size
self.spacing = random.randint(20, 70)
self.heading = Heading.from_degrees(0)
def generate(self) -> None:
index = 0
for i in range(self.size):
index = index + 1
self.add_unit(
self.unit_type.dcs_unit_type,
"Armor#" + str(index),
self.position.x + self.spacing * i,
self.position.y,
self.heading,
)
class FixedSizeArmorGroupGeneratorWithAA(FixedSizeArmorGroupGenerator):
def generate(self) -> None:
super(FixedSizeArmorGroupGeneratorWithAA, self).generate()
aux_group = self.add_vehicle_group()
index = 0
for i in [1, 2]:
index = index + 1
self.add_unit_to_group(
aux_group,
dcs.vehicles.AirDefence.M6_Linebacker,
"Anti Air#" + str(index),
Point(self.position.x - self.spacing * i, self.position.y),
self.heading,
)

View File

@@ -0,0 +1,124 @@
import random
import dcs.ships
from dcs import Point
from gen.group_generator import ShipGroupGenerator
from game.utils import Heading
from dcs.ships import USS_Arleigh_Burke_IIa, TICONDEROG
class CarrierGroupGenerator(ShipGroupGenerator):
def generate(self) -> None:
self.add_unit(
dcs.ships.Stennis,
"Carrier",
self.position.x,
self.position.y,
self.heading,
)
aux_group = self.add_auxiliary_group()
# Add destroyers escort
dd_type = dcs.ships.USS_Arleigh_Burke_IIa
self.add_unit_to_group(
aux_group,
dd_type,
"DD1",
Point(self.position.x + 2500, self.position.y + 4500),
self.heading,
)
self.add_unit_to_group(
aux_group,
dd_type,
"DD2",
Point(self.position.x + 2500, self.position.y - 4500),
self.heading,
)
self.add_unit_to_group(
aux_group,
dd_type,
"DD3",
Point(self.position.x + 4500, self.position.y + 8500),
self.heading,
)
self.add_unit_to_group(
aux_group,
dd_type,
"DD4",
Point(self.position.x + 4500, self.position.y - 8500),
self.heading,
)
self.get_generated_group().points[0].speed = 20
class CarrierStrikeGroup8Generator(ShipGroupGenerator):
def generate(self) -> None:
# Carrier Strike Group 8
carrier_type = dcs.ships.Stennis
self.add_unit(
carrier_type,
"CVN-75 Harry S. Truman",
self.position.x,
self.position.y,
self.heading,
)
aux_group = self.add_auxiliary_group()
# Add Arleigh Burke escort
self.add_unit_to_group(
aux_group,
USS_Arleigh_Burke_IIa,
"USS Ramage",
Point(self.position.x + 6482, self.position.y + 6667),
self.heading,
)
self.add_unit_to_group(
aux_group,
USS_Arleigh_Burke_IIa,
"USS Mitscher",
Point(self.position.x - 7963, self.position.y + 7037),
self.heading,
)
self.add_unit_to_group(
aux_group,
USS_Arleigh_Burke_IIa,
"USS Forrest Sherman",
Point(self.position.x - 7408, self.position.y - 7408),
self.heading,
)
self.add_unit_to_group(
aux_group,
USS_Arleigh_Burke_IIa,
"USS Lassen",
Point(self.position.x + 8704, self.position.y - 6296),
self.heading,
)
# Add Ticonderoga escort
if self.heading >= Heading.from_degrees(180):
self.add_unit_to_group(
aux_group,
TICONDEROG,
"USS Hué City",
Point(self.position.x + 2222, self.position.y - 3333),
self.heading,
)
else:
self.add_unit_to_group(
aux_group,
TICONDEROG,
"USS Hué City",
Point(self.position.x - 3333, self.position.y + 2222),
self.heading,
)
self.get_generated_group().points[0].speed = 20

View File

@@ -0,0 +1,59 @@
from __future__ import annotations
import random
from typing import TYPE_CHECKING
from dcs.ships import (
Type_052C,
Type_052B,
Type_054A,
)
from game.factions.faction import Faction
from game.theater.theatergroundobject import ShipGroundObject
from gen.to_remove.dd_group import DDGroupGenerator
from gen.group_generator import ShipGroupGenerator
if TYPE_CHECKING:
from game.game import Game
class ChineseNavyGroupGenerator(ShipGroupGenerator):
def generate(self) -> None:
self.add_unit(
Type_054A,
"FF1",
self.position.x + 1200,
self.position.y + 900,
self.heading,
)
self.add_unit(
Type_054A,
"FF2",
self.position.x + 1200,
self.position.y - 900,
self.heading,
)
self.add_unit(
Type_052C,
"DD1",
self.position.x + 2400,
self.position.y + 900,
self.heading,
)
self.add_unit(
Type_052C,
"DD2",
self.position.x + 2400,
self.position.y - 900,
self.heading,
)
self.get_generated_group().points[0].speed = 20
class Type54GroupGenerator(DDGroupGenerator):
def __init__(self, game: Game, ground_object: ShipGroundObject, faction: Faction):
super(Type54GroupGenerator, self).__init__(
game, ground_object, faction, Type_054A
)

View File

@@ -0,0 +1,13 @@
import logging
import random
from typing import Optional
from dcs.unitgroup import VehicleGroup
from game import db, Game
from game.theater.theatergroundobject import CoastalSiteGroundObject
from gen.to_remove.silkworm import SilkwormGenerator
COASTAL_MAP = {
"SilkwormGenerator": SilkwormGenerator,
}

View File

@@ -0,0 +1,153 @@
import random
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator):
"""
This generator attempt to mimic an early cold-war era flak AAA site.
The Flak 18 88mm is used as the main long range gun, S-60 is used as a mid range gun and 2 Bofors 40mm guns provide short range protection.
This does not include search lights and telemeter computer (Kdo.G 40) because these are paid units only available in WW2 asset pack
"""
name = "Early Cold War Flak Site"
def generate(self) -> None:
spacing = random.randint(30, 60)
index = 0
# Long range guns
for i in range(3):
for j in range(2):
index = index + 1
self.add_unit(
AirDefence.Flak18,
"AAA#" + str(index),
self.position.x + spacing * i + random.randint(1, 5),
self.position.y + spacing * j + random.randint(1, 5),
self.heading,
)
# Medium range guns
self.add_unit(
AirDefence.S_60_Type59_Artillery,
"SHO#1",
self.position.x - 40,
self.position.y - 40,
self.heading.opposite,
),
self.add_unit(
AirDefence.S_60_Type59_Artillery,
"SHO#2",
self.position.x + spacing * 2 + 40,
self.position.y + spacing + 40,
self.heading,
),
# Short range guns
self.add_unit(
AirDefence.ZU_23_Emplacement_Closed,
"SHO#3",
self.position.x - 80,
self.position.y - 40,
self.heading.opposite,
),
self.add_unit(
AirDefence.ZU_23_Emplacement_Closed,
"SHO#4",
self.position.x + spacing * 2 + 80,
self.position.y + spacing + 40,
self.heading,
),
# Add a truck
self.add_unit(
Unarmed.KAMAZ_Truck,
"Truck#",
self.position.x - 60,
self.position.y - 20,
self.heading,
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.AAA
class ColdWarFlakGenerator(AirDefenseGroupGenerator):
"""
This generator attempt to mimic a cold-war era flak AAA site.
The Flak 18 88mm is used as the main long range gun, 2 S-60 57mm gun improve mid range firepower, while 2 Zu-23 guns even provide short range protection.
The site is also fitted with a P-19 radar for early detection.
"""
name = "Cold War Flak Site"
def generate(self) -> None:
spacing = random.randint(30, 60)
index = 0
# Long range guns
for i in range(3):
for j in range(2):
index = index + 1
self.add_unit(
AirDefence.Flak18,
"AAA#" + str(index),
self.position.x + spacing * i + random.randint(1, 5),
self.position.y + spacing * j + random.randint(1, 5),
self.heading,
)
# Medium range guns
self.add_unit(
AirDefence.S_60_Type59_Artillery,
"SHO#1",
self.position.x - 40,
self.position.y - 40,
self.heading.opposite,
),
self.add_unit(
AirDefence.S_60_Type59_Artillery,
"SHO#2",
self.position.x + spacing * 2 + 40,
self.position.y + spacing + 40,
self.heading,
),
# Short range guns
self.add_unit(
AirDefence.ZU_23_Emplacement_Closed,
"SHO#3",
self.position.x - 80,
self.position.y - 40,
self.heading.opposite,
),
self.add_unit(
AirDefence.ZU_23_Emplacement_Closed,
"SHO#4",
self.position.x + spacing * 2 + 80,
self.position.y + spacing + 40,
self.heading,
),
# Add a P19 Radar for EWR
self.add_unit(
AirDefence.P_19_s_125_sr,
"SR#0",
self.position.x - 60,
self.position.y - 20,
self.heading,
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.AAA

56
gen/to_remove/dd_group.py Normal file
View File

@@ -0,0 +1,56 @@
from __future__ import annotations
from typing import TYPE_CHECKING, Type
from dcs.ships import PERRY, USS_Arleigh_Burke_IIa
from dcs.unittype import ShipType
from game.factions.faction import Faction
from game.theater.theatergroundobject import ShipGroundObject
from gen.group_generator import ShipGroupGenerator
if TYPE_CHECKING:
from game.game import Game
class DDGroupGenerator(ShipGroupGenerator):
def __init__(
self,
game: Game,
ground_object: ShipGroundObject,
faction: Faction,
ddtype: Type[ShipType],
):
super(DDGroupGenerator, self).__init__(game, ground_object, faction)
self.ddtype = ddtype
def generate(self) -> None:
self.add_unit(
self.ddtype,
"DD1",
self.position.x + 500,
self.position.y + 900,
self.heading,
)
self.add_unit(
self.ddtype,
"DD2",
self.position.x + 500,
self.position.y - 900,
self.heading,
)
self.get_generated_group().points[0].speed = 20
class OliverHazardPerryGroupGenerator(DDGroupGenerator):
def __init__(self, game: Game, ground_object: ShipGroundObject, faction: Faction):
super(OliverHazardPerryGroupGenerator, self).__init__(
game, ground_object, faction, PERRY
)
class ArleighBurkeGroupGenerator(DDGroupGenerator):
def __init__(self, game: Game, ground_object: ShipGroundObject, faction: Faction):
super(ArleighBurkeGroupGenerator, self).__init__(
game, ground_object, faction, USS_Arleigh_Burke_IIa
)

View File

@@ -0,0 +1,27 @@
from gen.to_remove.ewrs import (
BigBirdGenerator,
BoxSpringGenerator,
DogEarGenerator,
FlatFaceGenerator,
HawkEwrGenerator,
PatriotEwrGenerator,
RolandEwrGenerator,
SnowDriftGenerator,
StraightFlushGenerator,
TallRackGenerator,
TinShieldGenerator,
)
EWR_MAP = {
"BoxSpringGenerator": BoxSpringGenerator,
"TallRackGenerator": TallRackGenerator,
"DogEarGenerator": DogEarGenerator,
"RolandEwrGenerator": RolandEwrGenerator,
"FlatFaceGenerator": FlatFaceGenerator,
"PatriotEwrGenerator": PatriotEwrGenerator,
"BigBirdGenerator": BigBirdGenerator,
"SnowDriftGenerator": SnowDriftGenerator,
"StraightFlushGenerator": StraightFlushGenerator,
"HawkEwrGenerator": HawkEwrGenerator,
"TinShieldGenerator": TinShieldGenerator,
}

114
gen/to_remove/ewrs.py Normal file
View File

@@ -0,0 +1,114 @@
from typing import Type
from dcs.unittype import VehicleType
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import EwrGroundObject
from gen.group_generator import VehicleGroupGenerator
class EwrGenerator(VehicleGroupGenerator[EwrGroundObject]):
unit_type: Type[VehicleType] = AirDefence.P_19_s_125_sr
@classmethod
def name(cls) -> str:
return cls.unit_type.name
def generate(self) -> None:
self.add_unit(
self.unit_type,
"EWR",
self.position.x,
self.position.y,
self.heading,
)
class BoxSpringGenerator(EwrGenerator):
"""1L13 "Box Spring" EWR."""
unit_type = AirDefence._1L13_EWR
class TallRackGenerator(EwrGenerator):
"""55G6 "Tall Rack" EWR."""
unit_type = AirDefence._55G6_EWR
class DogEarGenerator(EwrGenerator):
"""9S80M1 "Dog Ear" EWR.
This is the SA-8 search radar, but used as an early warning radar.
"""
unit_type = AirDefence.Dog_Ear_radar
class RolandEwrGenerator(EwrGenerator):
"""Roland EWR.
This is the Roland search radar, but used as an early warning radar.
"""
unit_type = AirDefence.Roland_Radar
class FlatFaceGenerator(EwrGenerator):
"""P-19 "Flat Face" EWR.
This is the SA-3 search radar, but used as an early warning radar.
"""
unit_type = AirDefence.P_19_s_125_sr
class PatriotEwrGenerator(EwrGenerator):
"""Patriot EWR.
This is the Patriot search/track radar, but used as an early warning radar.
"""
unit_type = AirDefence.Patriot_str
class BigBirdGenerator(EwrGenerator):
"""64H6E "Big Bird" EWR.
This is the SA-10 track radar, but used as an early warning radar.
"""
unit_type = AirDefence.S_300PS_64H6E_sr
class SnowDriftGenerator(EwrGenerator):
"""9S18M1 "Snow Drift" EWR.
This is the SA-11 search radar, but used as an early warning radar.
"""
unit_type = AirDefence.SA_11_Buk_SR_9S18M1
class StraightFlushGenerator(EwrGenerator):
"""1S91 "Straight Flush" EWR.
This is the SA-6 search/track radar, but used as an early warning radar.
"""
unit_type = AirDefence.Kub_1S91_str
class HawkEwrGenerator(EwrGenerator):
"""Hawk EWR.
This is the Hawk search radar, but used as an early warning radar.
"""
unit_type = AirDefence.Hawk_sr
class TinShieldGenerator(EwrGenerator):
"""19ZH6 "Tin Shield" EWR."""
unit_type = AirDefence.RLS_19J6

110
gen/to_remove/freya_ewr.py Normal file
View File

@@ -0,0 +1,110 @@
from dcs.vehicles import AirDefence, Infantry, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
from game.utils import Heading
class FreyaGenerator(AirDefenseGroupGenerator):
"""
This generate a German flak artillery group using only free units, thus not requiring the WW2 asset pack
"""
name = "Freya EWR Site"
def generate(self) -> None:
# TODO : would be better with the Concrete structure that is supposed to protect it
self.add_unit(
AirDefence.FuMG_401,
"EWR#1",
self.position.x,
self.position.y,
self.heading,
)
positions = self.get_circular_position(4, launcher_distance=50, coverage=360)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Flak38,
"AA#" + str(i),
position[0],
position[1],
position[2],
)
positions = self.get_circular_position(4, launcher_distance=100, coverage=360)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Flak18,
"AA#" + str(4 + i),
position[0],
position[1],
position[2],
)
# Command/Logi
self.add_unit(
Unarmed.Kubelwagen_82,
"Kubel#1",
self.position.x - 20,
self.position.y - 20,
self.heading,
)
self.add_unit(
Unarmed.Sd_Kfz_7,
"Sdkfz#1",
self.position.x + 20,
self.position.y + 22,
self.heading,
)
self.add_unit(
Unarmed.Sd_Kfz_2,
"Sdkfz#2",
self.position.x - 22,
self.position.y + 20,
self.heading,
)
# Maschinensatz_33 and Kdo.g 40 Telemeter
self.add_unit(
AirDefence.Maschinensatz_33,
"Energy#1",
self.position.x + 20,
self.position.y - 20,
self.heading,
)
self.add_unit(
AirDefence.KDO_Mod40,
"Telemeter#1",
self.position.x + 20,
self.position.y - 10,
self.heading,
)
self.add_unit(
Infantry.Soldier_mauser98,
"Inf#1",
self.position.x + 20,
self.position.y - 14,
self.heading,
)
self.add_unit(
Infantry.Soldier_mauser98,
"Inf#2",
self.position.x + 20,
self.position.y - 22,
self.heading,
)
self.add_unit(
Infantry.Soldier_mauser98,
"Inf#3",
self.position.x + 20,
self.position.y - 24,
self.heading + Heading.from_degrees(45),
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Short

View File

@@ -0,0 +1,13 @@
from dcs.ships import La_Combattante_II
from game import Game
from game.factions.faction import Faction
from game.theater.theatergroundobject import ShipGroundObject
from gen.to_remove.dd_group import DDGroupGenerator
class LaCombattanteIIGroupGenerator(DDGroupGenerator):
def __init__(self, game: Game, ground_object: ShipGroundObject, faction: Faction):
super(LaCombattanteIIGroupGenerator, self).__init__(
game, ground_object, faction, La_Combattante_II
)

View File

@@ -0,0 +1,39 @@
import random
import dcs.ships
from dcs import Point
from gen.group_generator import ShipGroupGenerator
class LHAGroupGenerator(ShipGroupGenerator):
def generate(self) -> None:
# Add carrier
self.add_unit(
dcs.ships.LHA_Tarawa,
"LHA",
self.position.x,
self.position.y,
self.heading,
)
# Add destroyers escort
aux_group = self.add_auxiliary_group()
dd_type = dcs.ships.USS_Arleigh_Burke_IIa
self.add_unit_to_group(
aux_group,
dd_type,
"DD1",
Point(self.position.x + 1250, self.position.y + 1450),
self.heading,
)
self.add_unit_to_group(
aux_group,
dd_type,
"DD2",
Point(self.position.x + 1250, self.position.y - 1450),
self.heading,
)
self.get_generated_group().points[0].speed = 20

View File

@@ -0,0 +1,12 @@
import logging
import random
from typing import Optional
from dcs.unitgroup import VehicleGroup
from game import db, Game
from game.theater.theatergroundobject import MissileSiteGroundObject
from gen.to_remove.scud_site import ScudGenerator
from gen.to_remove.v1_group import V1GroupGenerator
MISSILES_MAP = {"V1GroupGenerator": V1GroupGenerator, "ScudGenerator": ScudGenerator}

View File

@@ -0,0 +1,92 @@
from __future__ import annotations
import random
from typing import TYPE_CHECKING
from dcs.ships import (
ALBATROS,
MOLNIYA,
NEUSTRASH,
REZKY,
MOSCOW,
KILO,
SOM,
)
from game.factions.faction import Faction
from game.theater.theatergroundobject import ShipGroundObject
from gen.to_remove.dd_group import DDGroupGenerator
from gen.group_generator import ShipGroupGenerator
if TYPE_CHECKING:
from game.game import Game
class RussianNavyGroupGenerator(ShipGroupGenerator):
def generate(self) -> None:
self.add_unit(
ALBATROS,
"FF1",
self.position.x + 1200,
self.position.y + 900,
self.heading,
)
self.add_unit(
ALBATROS,
"FF2",
self.position.x + 1200,
self.position.y - 900,
self.heading,
)
self.add_unit(
NEUSTRASH,
"DD1",
self.position.x + 2400,
self.position.y + 900,
self.heading,
)
self.add_unit(
NEUSTRASH,
"DD2",
self.position.x + 2400,
self.position.y - 900,
self.heading,
)
# Only include the Moskva for now, the Pyotry Velikiy is an unkillable monster.
# See https://github.com/dcs-liberation/dcs_liberation/issues/567
self.add_unit(
MOSCOW,
"CC1",
self.position.x,
self.position.y,
self.heading,
)
self.get_generated_group().points[0].speed = 20
class GrishaGroupGenerator(DDGroupGenerator):
def __init__(self, game: Game, ground_object: ShipGroundObject, faction: Faction):
super(GrishaGroupGenerator, self).__init__(
game, ground_object, faction, ALBATROS
)
class MolniyaGroupGenerator(DDGroupGenerator):
def __init__(self, game: Game, ground_object: ShipGroundObject, faction: Faction):
super(MolniyaGroupGenerator, self).__init__(
game, ground_object, faction, MOLNIYA
)
class KiloSubGroupGenerator(DDGroupGenerator):
def __init__(self, game: Game, ground_object: ShipGroundObject, faction: Faction):
super(KiloSubGroupGenerator, self).__init__(game, ground_object, faction, KILO)
class TangoSubGroupGenerator(DDGroupGenerator):
def __init__(self, game: Game, ground_object: ShipGroundObject, faction: Faction):
super(TangoSubGroupGenerator, self).__init__(game, ground_object, faction, SOM)

View File

@@ -0,0 +1,40 @@
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class AvengerGenerator(AirDefenseGroupGenerator):
"""
This generate an Avenger group
"""
name = "Avenger Group"
def generate(self) -> None:
num_launchers = 2
self.add_unit(
Unarmed.M_818,
"TRUCK",
self.position.x,
self.position.y,
self.heading,
)
positions = self.get_circular_position(
num_launchers, launcher_distance=110, coverage=180
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.M1097_Avenger,
"SPAA#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Short

View File

@@ -0,0 +1,40 @@
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class ChaparralGenerator(AirDefenseGroupGenerator):
"""
This generate a Chaparral group
"""
name = "Chaparral Group"
def generate(self) -> None:
num_launchers = 2
self.add_unit(
Unarmed.M_818,
"TRUCK",
self.position.x,
self.position.y,
self.heading,
)
positions = self.get_circular_position(
num_launchers, launcher_distance=110, coverage=180
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.M48_Chaparral,
"SPAA#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Short

View File

@@ -0,0 +1,40 @@
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class GepardGenerator(AirDefenseGroupGenerator):
"""
This generate a Gepard group
"""
name = "Gepard Group"
def generate(self) -> None:
num_launchers = 2
positions = self.get_circular_position(
num_launchers, launcher_distance=120, coverage=180
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Gepard,
"SPAA#" + str(i),
position[0],
position[1],
position[2],
)
self.add_unit(
Unarmed.M_818,
"TRUCK",
self.position.x + 80,
self.position.y,
self.heading,
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Short

View File

@@ -0,0 +1,172 @@
import random
from typing import Dict, Iterable, List, Optional, Sequence, Set, Type
from dcs.unitgroup import VehicleGroup
from game import Game
from game.factions.faction import Faction
from game.theater.theatergroundobject import SamGroundObject, AirDefenseRange
from gen.to_remove.aaa_bofors import BoforsGenerator
from gen.to_remove.aaa_flak import FlakGenerator
from gen.to_remove.aaa_flak18 import Flak18Generator
from gen.to_remove.aaa_ks19 import KS19Generator
from gen.to_remove.aaa_ww2_ally_flak import AllyWW2FlakGenerator
from gen.to_remove.aaa_zsu57 import ZSU57Generator
from gen.to_remove.aaa_zu23_insurgent import ZU23InsurgentGenerator
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
from gen.to_remove.cold_war_flak import (
ColdWarFlakGenerator,
EarlyColdWarFlakGenerator,
)
from gen.to_remove.freya_ewr import FreyaGenerator
from gen.to_remove.sam_avenger import AvengerGenerator
from gen.to_remove.sam_chaparral import ChaparralGenerator
from gen.to_remove.sam_gepard import GepardGenerator
from gen.to_remove.sam_hawk import HawkGenerator
from gen.to_remove.sam_hq7 import HQ7Generator
from gen.to_remove.sam_linebacker import LinebackerGenerator
from gen.to_remove.sam_nasams import NasamBGenerator, NasamCGenerator
from gen.to_remove.sam_patriot import PatriotGenerator
from gen.to_remove.sam_rapier import RapierGenerator
from gen.to_remove.sam_roland import RolandGenerator
from gen.to_remove.sam_sa10 import (
SA10Generator,
Tier2SA10Generator,
Tier3SA10Generator,
SA10BGenerator,
SA12Generator,
SA20Generator,
SA20BGenerator,
SA23Generator,
)
from gen.to_remove.sam_sa11 import SA11Generator
from gen.to_remove.sam_sa13 import SA13Generator
from gen.to_remove.sam_sa15 import SA15Generator
from gen.to_remove.sam_sa17 import SA17Generator
from gen.to_remove.sam_sa19 import SA19Generator
from gen.to_remove.sam_sa2 import SA2Generator
from gen.to_remove.sam_sa3 import SA3Generator
from gen.to_remove.sam_sa5 import SA5Generator, SA5FlatFaceGenerator
from gen.to_remove.sam_sa6 import SA6Generator
from gen.to_remove.sam_sa8 import SA8Generator
from gen.to_remove.sam_sa9 import SA9Generator
from gen.to_remove.sam_vulcan import VulcanGenerator
from gen.to_remove.sam_zsu23 import ZSU23Generator
from gen.to_remove.sam_zu23 import ZU23Generator
from gen.to_remove.sam_zu23_ural import ZU23UralGenerator
from gen.to_remove.sam_zu23_ural_insurgent import ZU23UralInsurgentGenerator
SAM_MAP: Dict[str, Type[AirDefenseGroupGenerator]] = {
"HawkGenerator": HawkGenerator,
"ZU23Generator": ZU23Generator,
"ZU23UralGenerator": ZU23UralGenerator,
"ZU23UralInsurgentGenerator": ZU23UralInsurgentGenerator,
"ZU23InsurgentGenerator": ZU23InsurgentGenerator,
"ZSU23Generator": ZSU23Generator,
"VulcanGenerator": VulcanGenerator,
"LinebackerGenerator": LinebackerGenerator,
"RapierGenerator": RapierGenerator,
"AvengerGenerator": AvengerGenerator,
"GepardGenerator": GepardGenerator,
"RolandGenerator": RolandGenerator,
"PatriotGenerator": PatriotGenerator,
"ChaparralGenerator": ChaparralGenerator,
"BoforsGenerator": BoforsGenerator,
"FlakGenerator": FlakGenerator,
"SA2Generator": SA2Generator,
"SA3Generator": SA3Generator,
"SA5Generator": SA5Generator,
"SA5FlatFaceGenerator": SA5FlatFaceGenerator,
"SA6Generator": SA6Generator,
"SA8Generator": SA8Generator,
"SA9Generator": SA9Generator,
"SA10Generator": SA10Generator,
"Tier2SA10Generator": Tier2SA10Generator,
"Tier3SA10Generator": Tier3SA10Generator,
"SA11Generator": SA11Generator,
"SA13Generator": SA13Generator,
"SA15Generator": SA15Generator,
"SA19Generator": SA19Generator,
"HQ7Generator": HQ7Generator,
"Flak18Generator": Flak18Generator,
"ColdWarFlakGenerator": ColdWarFlakGenerator,
"EarlyColdWarFlakGenerator": EarlyColdWarFlakGenerator,
"FreyaGenerator": FreyaGenerator,
"AllyWW2FlakGenerator": AllyWW2FlakGenerator,
"ZSU57Generator": ZSU57Generator,
"KS19Generator": KS19Generator,
"SA10BGenerator": SA10BGenerator,
"SA12Generator": SA12Generator,
"SA17Generator": SA17Generator,
"SA20Generator": SA20Generator,
"SA20BGenerator": SA20BGenerator,
"SA23Generator": SA23Generator,
"NasamBGenerator": NasamBGenerator,
"NasamCGenerator": NasamCGenerator,
}
def get_faction_possible_sams_generator(
faction: Faction,
) -> List[Type[AirDefenseGroupGenerator]]:
"""
Return the list of possible SAM generator for the given faction
:param faction: Faction name to search units for
"""
return [SAM_MAP[s] for s in faction.air_defenses]
def _generate_anti_air_from(
generators: Sequence[Type[AirDefenseGroupGenerator]],
game: Game,
ground_object: SamGroundObject,
) -> List[VehicleGroup]:
if not generators:
return []
sam_generator_class = random.choice(generators)
generator = sam_generator_class(game, ground_object)
generator.generate()
return list(generator.groups)
def generate_anti_air_group(
game: Game,
ground_object: SamGroundObject,
faction: Faction,
ranges: Optional[Iterable[Set[AirDefenseRange]]] = None,
) -> List[VehicleGroup]:
"""
This generate a SAM group
:param game: The Game.
:param ground_object: The ground object which will own the sam group.
:param faction: Owner faction.
:param ranges: Optional list of preferred ranges of the air defense to
create. If None, any generator may be used. Otherwise generators
matching the given ranges will be used in order of preference. For
example, when given `[{Long, Medium}, {Short}]`, long and medium range
air defenses will be tried first with no bias, and short range air
defenses will be used if no long or medium range generators are
available to the faction. If instead `[{Long}, {Medium}, {Short}]` had
been used, long range systems would take precedence over medium range
systems. If instead `[{Long, Medium, Short}]` had been used, all types
would be considered with equal preference.
:return: The generated group, or None if one could not be generated.
"""
generators = get_faction_possible_sams_generator(faction)
if ranges is None:
ranges = [
{
AirDefenseRange.Long,
AirDefenseRange.Medium,
AirDefenseRange.Short,
}
]
for range_options in ranges:
generators_for_range = [g for g in generators if g.range() in range_options]
groups = _generate_anti_air_from(generators_for_range, game, ground_object)
if groups:
return groups
return []

66
gen/to_remove/sam_hawk.py Normal file
View File

@@ -0,0 +1,66 @@
from dcs.mapping import Point
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import AirDefenseRange, SkynetRole
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class HawkGenerator(AirDefenseGroupGenerator):
"""
This generate an HAWK group
"""
name = "Hawk Site"
def generate(self) -> None:
self.add_unit(
AirDefence.Hawk_sr,
"SR",
self.position.x + 20,
self.position.y,
self.heading,
)
self.add_unit(
AirDefence.Hawk_pcp,
"PCP",
self.position.x,
self.position.y,
self.heading,
)
self.add_unit(
AirDefence.Hawk_tr,
"TR",
self.position.x + 40,
self.position.y,
self.heading,
)
# Triple A for close range defense
aa_group = self.add_auxiliary_group(SkynetRole.NoSkynetBehavior)
self.add_unit_to_group(
aa_group,
AirDefence.Vulcan,
"AAA",
self.position + Point(20, 30),
self.heading,
)
num_launchers = 6
positions = self.get_circular_position(
num_launchers, launcher_distance=120, coverage=180
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Hawk_ln,
"LN#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Medium

59
gen/to_remove/sam_hq7.py Normal file
View File

@@ -0,0 +1,59 @@
from dcs.mapping import Point
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import AirDefenseRange, SkynetRole
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class HQ7Generator(AirDefenseGroupGenerator):
"""
This generate an HQ7 group
"""
name = "HQ-7 Site"
def generate(self) -> None:
self.add_unit(
AirDefence.HQ_7_STR_SP,
"STR",
self.position.x,
self.position.y,
self.heading,
)
# Triple A for close range defense
aa_group = self.add_auxiliary_group(SkynetRole.NoSkynetBehavior)
self.add_unit_to_group(
aa_group,
AirDefence.Ural_375_ZU_23,
"AAA1",
self.position + Point(20, 30),
self.heading,
)
self.add_unit_to_group(
aa_group,
AirDefence.Ural_375_ZU_23,
"AAA2",
self.position - Point(20, 30),
self.heading,
)
num_launchers = 2
if num_launchers > 0:
positions = self.get_circular_position(
num_launchers, launcher_distance=120, coverage=360
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.HQ_7_LN_SP,
"LN#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Short

View File

@@ -0,0 +1,40 @@
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class LinebackerGenerator(AirDefenseGroupGenerator):
"""
This generate an m6 linebacker group
"""
name = "Linebacker Group"
def generate(self) -> None:
num_launchers = 2
self.add_unit(
Unarmed.M_818,
"TRUCK",
self.position.x,
self.position.y,
self.heading,
)
positions = self.get_circular_position(
num_launchers, launcher_distance=110, coverage=180
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.M6_Linebacker,
"M6#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Short

View File

@@ -0,0 +1,67 @@
from typing import Type
from dcs.unittype import VehicleType
from dcs.vehicles import AirDefence
from game import Game
from game.theater import SamGroundObject
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class NasamCGenerator(AirDefenseGroupGenerator):
"""
This generate a Nasams group with AIM-120C missiles
"""
name = "NASAMS AIM-120C"
def __init__(self, game: Game, ground_object: SamGroundObject):
super().__init__(game, ground_object)
self.launcherType: Type[VehicleType] = AirDefence.NASAMS_LN_C
def generate(self) -> None:
# Command Post
self.add_unit(
AirDefence.NASAMS_Command_Post,
"CP",
self.position.x + 30,
self.position.y + 30,
self.heading,
)
# Radar
self.add_unit(
AirDefence.NASAMS_Radar_MPQ64F1,
"RADAR",
self.position.x - 30,
self.position.y - 30,
self.heading,
)
positions = self.get_circular_position(4, launcher_distance=120, coverage=360)
for i, position in enumerate(positions):
self.add_unit(
self.launcherType,
"LN#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Medium
class NasamBGenerator(NasamCGenerator):
"""
This generate a Nasams group with AIM-120B missiles
"""
name = "NASAMS AIM-120B"
def __init__(self, game: Game, ground_object: SamGroundObject):
super().__init__(game, ground_object)
self.launcherType: Type[VehicleType] = AirDefence.NASAMS_LN_B

View File

@@ -0,0 +1,88 @@
from dcs.mapping import Point
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import SkynetRole, AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class PatriotGenerator(AirDefenseGroupGenerator):
"""
This generate a Patriot group
"""
name = "Patriot Battery"
def generate(self) -> None:
# Command Post
self.add_unit(
AirDefence.Patriot_str,
"STR",
self.position.x + 30,
self.position.y + 30,
self.heading,
)
self.add_unit(
AirDefence.Patriot_AMG,
"MRC",
self.position.x,
self.position.y,
self.heading,
)
self.add_unit(
AirDefence.Patriot_ECS,
"MSQ",
self.position.x + 30,
self.position.y,
self.heading,
)
self.add_unit(
AirDefence.Patriot_cp,
"ICC",
self.position.x + 60,
self.position.y,
self.heading,
)
self.add_unit(
AirDefence.Patriot_EPP,
"EPP",
self.position.x,
self.position.y + 30,
self.heading,
)
positions = self.get_circular_position(8, launcher_distance=120, coverage=360)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Patriot_ln,
"LN#" + str(i),
position[0],
position[1],
position[2],
)
# Short range protection for high value site
aa_group = self.add_auxiliary_group(SkynetRole.NoSkynetBehavior)
positions = self.get_circular_position(2, launcher_distance=200, coverage=360)
for i, (x, y, heading) in enumerate(positions):
self.add_unit_to_group(
aa_group,
AirDefence.Vulcan,
f"SPAAA#{i}",
Point(x, y),
heading,
)
positions = self.get_circular_position(2, launcher_distance=300, coverage=360)
for i, (x, y, heading) in enumerate(positions):
self.add_unit_to_group(
aa_group,
AirDefence.M1097_Avenger,
f"Avenger#{i}",
Point(x, y),
heading,
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Long

View File

@@ -0,0 +1,52 @@
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import SkynetRole, AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class RapierGenerator(AirDefenseGroupGenerator):
"""
This generate a Rapier Group
"""
name = "Rapier AA Site"
def generate(self) -> None:
self.add_unit(
AirDefence.Rapier_fsa_blindfire_radar,
"BT",
self.position.x,
self.position.y,
self.heading,
)
self.add_unit(
AirDefence.Rapier_fsa_optical_tracker_unit,
"OT",
self.position.x + 20,
self.position.y,
self.heading,
)
num_launchers = 2
positions = self.get_circular_position(
num_launchers, launcher_distance=80, coverage=240
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Rapier_fsa_launcher,
"LN#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Short
@classmethod
def primary_group_role(cls) -> SkynetRole:
return SkynetRole.Sam

View File

@@ -0,0 +1,51 @@
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import SkynetRole, AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class RolandGenerator(AirDefenseGroupGenerator):
"""
This generate a Roland group
"""
name = "Roland Site"
def generate(self) -> None:
num_launchers = 2
self.add_unit(
AirDefence.Roland_Radar,
"EWR",
self.position.x + 40,
self.position.y,
self.heading,
)
positions = self.get_circular_position(
num_launchers, launcher_distance=80, coverage=240
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Roland_ADS,
"ADS#" + str(i),
position[0],
position[1],
position[2],
)
self.add_unit(
Unarmed.M_818,
"TRUCK",
self.position.x + 80,
self.position.y,
self.heading,
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Short
@classmethod
def primary_group_role(cls) -> SkynetRole:
return SkynetRole.Sam

222
gen/to_remove/sam_sa10.py Normal file
View File

@@ -0,0 +1,222 @@
from typing import Type
from dcs.mapping import Point
from dcs.unittype import VehicleType
from dcs.vehicles import AirDefence
from game import Game
from game.theater import SamGroundObject
from game.theater.theatergroundobject import SkynetRole, AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
from pydcs_extensions.highdigitsams import highdigitsams
class SA10Generator(AirDefenseGroupGenerator):
"""
This generate a SA-10 group
"""
name = "SA-10/S-300PS Battery - With ZSU-23"
def __init__(self, game: Game, ground_object: SamGroundObject):
super().__init__(game, ground_object)
self.sr1: Type[VehicleType] = AirDefence.S_300PS_40B6MD_sr
self.sr2: Type[VehicleType] = AirDefence.S_300PS_64H6E_sr
self.cp: Type[VehicleType] = AirDefence.S_300PS_54K6_cp
self.tr1: Type[VehicleType] = AirDefence.S_300PS_40B6M_tr
self.tr2: Type[VehicleType] = AirDefence.S_300PS_40B6M_tr
self.ln1: Type[VehicleType] = AirDefence.S_300PS_5P85C_ln
self.ln2: Type[VehicleType] = AirDefence.S_300PS_5P85D_ln
def generate(self) -> None:
# Search Radar
self.add_unit(
self.sr1, "SR1", self.position.x, self.position.y + 40, self.heading
)
# Search radar for missiles (optionnal)
self.add_unit(
self.sr2, "SR2", self.position.x - 40, self.position.y, self.heading
)
# Command Post
self.add_unit(self.cp, "CP", self.position.x, self.position.y, self.heading)
# 1 Tracking radar
self.add_unit(
self.tr1, "TR1", self.position.x - 40, self.position.y - 40, self.heading
)
# 2 different launcher type (C & D)
num_launchers = 6
positions = self.get_circular_position(
num_launchers, launcher_distance=100, coverage=360
)
for i, position in enumerate(positions):
if i % 2 == 0:
self.add_unit(
self.ln1, "LN#" + str(i), position[0], position[1], position[2]
)
else:
self.add_unit(
self.ln2, "LN#" + str(i), position[0], position[1], position[2]
)
self.generate_defensive_groups()
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Long
def generate_defensive_groups(self) -> None:
# AAA for defending against close targets.
aa_group = self.add_auxiliary_group(SkynetRole.NoSkynetBehavior)
num_launchers = 2
positions = self.get_circular_position(
num_launchers, launcher_distance=210, coverage=360
)
for i, (x, y, heading) in enumerate(positions):
self.add_unit_to_group(
aa_group,
AirDefence.ZSU_23_4_Shilka,
f"AA#{i}",
Point(x, y),
heading,
)
class Tier2SA10Generator(SA10Generator):
name = "SA-10/S-300PS Battery - With SA-15 PD"
def generate_defensive_groups(self) -> None:
# Create AAA the way the main group does.
super().generate_defensive_groups()
# SA-15 for both shorter range targets and point defense.
pd_group = self.add_auxiliary_group(SkynetRole.PointDefense)
num_launchers = 2
positions = self.get_circular_position(
num_launchers, launcher_distance=140, coverage=360
)
for i, (x, y, heading) in enumerate(positions):
self.add_unit_to_group(
pd_group,
AirDefence.Tor_9A331,
f"PD#{i}",
Point(x, y),
heading,
)
class Tier3SA10Generator(SA10Generator):
name = "SA-10/S-300PS Battery - With SA-15 PD & SA-19 SHORAD"
def generate_defensive_groups(self) -> None:
# AAA for defending against close targets.
aa_group = self.add_auxiliary_group(SkynetRole.NoSkynetBehavior)
num_launchers = 2
positions = self.get_circular_position(
num_launchers, launcher_distance=210, coverage=360
)
for i, (x, y, heading) in enumerate(positions):
self.add_unit_to_group(
aa_group,
AirDefence._2S6_Tunguska,
f"AA#{i}",
Point(x, y),
heading,
)
# SA-15 for both shorter range targets and point defense.
pd_group = self.add_auxiliary_group(SkynetRole.PointDefense)
num_launchers = 2
positions = self.get_circular_position(
num_launchers, launcher_distance=140, coverage=360
)
for i, (x, y, heading) in enumerate(positions):
self.add_unit_to_group(
pd_group,
AirDefence.Tor_9A331,
f"PD#{i}",
Point(x, y),
heading,
)
class SA10BGenerator(Tier3SA10Generator):
name = "SA-10B/S-300PS Battery"
def __init__(self, game: Game, ground_object: SamGroundObject):
super().__init__(game, ground_object)
self.sr1 = highdigitsams.SAM_SA_10B_S_300PS_40B6MD_SR
self.sr2 = highdigitsams.SAM_SA_10B_S_300PS_64H6E_SR
self.cp = highdigitsams.SAM_SA_10B_S_300PS_54K6_CP
self.tr1 = highdigitsams.SAM_SA_10B_S_300PS_30N6_TR
self.tr2 = highdigitsams.SAM_SA_10B_S_300PS_40B6M_TR
self.ln1 = highdigitsams.SAM_SA_10B_S_300PS_5P85SE_LN
self.ln2 = highdigitsams.SAM_SA_10B_S_300PS_5P85SU_LN
class SA12Generator(Tier3SA10Generator):
name = "SA-12/S-300V Battery"
def __init__(self, game: Game, ground_object: SamGroundObject):
super().__init__(game, ground_object)
self.sr1 = highdigitsams.SAM_SA_12_S_300V_9S15_SR
self.sr2 = highdigitsams.SAM_SA_12_S_300V_9S19_SR
self.cp = highdigitsams.SAM_SA_12_S_300V_9S457_CP
self.tr1 = highdigitsams.SAM_SA_12_S_300V_9S32_TR
self.tr2 = highdigitsams.SAM_SA_12_S_300V_9S32_TR
self.ln1 = highdigitsams.SAM_SA_12_S_300V_9A82_LN
self.ln2 = highdigitsams.SAM_SA_12_S_300V_9A83_LN
class SA20Generator(Tier3SA10Generator):
name = "SA-20/S-300PMU-1 Battery"
def __init__(self, game: Game, ground_object: SamGroundObject):
super().__init__(game, ground_object)
self.sr1 = highdigitsams.SAM_SA_20_S_300PMU1_SR_5N66E
self.sr2 = highdigitsams.SAM_SA_20_S_300PMU1_SR_64N6E
self.cp = highdigitsams.SAM_SA_20_S_300PMU1_CP_54K6
self.tr1 = highdigitsams.SAM_SA_20_S_300PMU1_TR_30N6E
self.tr2 = highdigitsams.SAM_SA_20_S_300PMU1_TR_30N6E_truck
self.ln1 = highdigitsams.SAM_SA_20_S_300PMU1_LN_5P85CE
self.ln2 = highdigitsams.SAM_SA_20_S_300PMU1_LN_5P85DE
class SA20BGenerator(Tier3SA10Generator):
name = "SA-20B/S-300PMU-2 Battery"
def __init__(self, game: Game, ground_object: SamGroundObject):
super().__init__(game, ground_object)
self.sr1 = highdigitsams.SAM_SA_20_S_300PMU1_SR_5N66E
self.sr2 = highdigitsams.SAM_SA_20_S_300PMU1_SR_64N6E
self.cp = highdigitsams.SAM_SA_20B_S_300PMU2_CP_54K6E2
self.tr1 = highdigitsams.SAM_SA_20B_S_300PMU2_TR_92H6E_truck
self.tr2 = highdigitsams.SAM_SA_20B_S_300PMU2_TR_92H6E_truck
self.ln1 = highdigitsams.SAM_SA_20B_S_300PMU2_LN_5P85SE2
self.ln2 = highdigitsams.SAM_SA_20B_S_300PMU2_LN_5P85SE2
class SA23Generator(Tier3SA10Generator):
name = "SA-23/S-300VM Battery"
def __init__(self, game: Game, ground_object: SamGroundObject):
super().__init__(game, ground_object)
self.sr1 = highdigitsams.SAM_SA_23_S_300VM_9S15M2_SR
self.sr2 = highdigitsams.SAM_SA_23_S_300VM_9S19M2_SR
self.cp = highdigitsams.SAM_SA_23_S_300VM_9S457ME_CP
self.tr1 = highdigitsams.SAM_SA_23_S_300VM_9S32ME_TR
self.tr2 = highdigitsams.SAM_SA_23_S_300VM_9S32ME_TR
self.ln1 = highdigitsams.SAM_SA_23_S_300VM_9A82ME_LN
self.ln2 = highdigitsams.SAM_SA_23_S_300VM_9A83ME_LN

48
gen/to_remove/sam_sa11.py Normal file
View File

@@ -0,0 +1,48 @@
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class SA11Generator(AirDefenseGroupGenerator):
"""
This generate a SA-11 group
"""
name = "SA-11 Buk Battery"
def generate(self) -> None:
self.add_unit(
AirDefence.SA_11_Buk_SR_9S18M1,
"SR",
self.position.x + 20,
self.position.y,
self.heading,
)
self.add_unit(
AirDefence.SA_11_Buk_CC_9S470M1,
"CC",
self.position.x,
self.position.y,
self.heading,
)
num_launchers = 4
positions = self.get_circular_position(
num_launchers, launcher_distance=140, coverage=180
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.SA_11_Buk_LN_9A310M1,
"LN#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Medium

47
gen/to_remove/sam_sa13.py Normal file
View File

@@ -0,0 +1,47 @@
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class SA13Generator(AirDefenseGroupGenerator):
"""
This generate a SA-13 group
"""
name = "SA-13 Strela Group"
def generate(self) -> None:
self.add_unit(
Unarmed.UAZ_469,
"UAZ",
self.position.x,
self.position.y,
self.heading,
)
self.add_unit(
Unarmed.KAMAZ_Truck,
"TRUCK",
self.position.x + 40,
self.position.y,
self.heading,
)
num_launchers = 2
positions = self.get_circular_position(
num_launchers, launcher_distance=120, coverage=360
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Strela_10M3,
"LN#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Short

46
gen/to_remove/sam_sa15.py Normal file
View File

@@ -0,0 +1,46 @@
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class SA15Generator(AirDefenseGroupGenerator):
"""
This generate a SA-15 group
"""
name = "SA-15 Tor Group"
def generate(self) -> None:
num_launchers = 2
positions = self.get_circular_position(
num_launchers, launcher_distance=120, coverage=360
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Tor_9A331,
"ADS#" + str(i),
position[0],
position[1],
position[2],
)
self.add_unit(
Unarmed.UAZ_469,
"EWR",
self.position.x + 40,
self.position.y,
self.heading,
)
self.add_unit(
Unarmed.KAMAZ_Truck,
"TRUCK",
self.position.x + 80,
self.position.y,
self.heading,
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Medium

46
gen/to_remove/sam_sa17.py Normal file
View File

@@ -0,0 +1,46 @@
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
from pydcs_extensions.highdigitsams import highdigitsams
class SA17Generator(AirDefenseGroupGenerator):
"""
This generate a SA-17 group
"""
name = "SA-17 Grizzly Battery"
def generate(self) -> None:
self.add_unit(
AirDefence.SA_11_Buk_SR_9S18M1,
"SR",
self.position.x + 20,
self.position.y,
self.heading,
)
self.add_unit(
AirDefence.SA_11_Buk_CC_9S470M1,
"CC",
self.position.x,
self.position.y,
self.heading,
)
positions = self.get_circular_position(3, launcher_distance=140, coverage=180)
for i, position in enumerate(positions):
self.add_unit(
highdigitsams.SAM_SA_17_Buk_M1_2_LN_9A310M1_2,
"LN#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Medium

42
gen/to_remove/sam_sa19.py Normal file
View File

@@ -0,0 +1,42 @@
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class SA19Generator(AirDefenseGroupGenerator):
"""
This generate a SA-19 group
"""
name = "SA-19 Tunguska Group"
def generate(self) -> None:
num_launchers = 2
if num_launchers == 1:
self.add_unit(
AirDefence._2S6_Tunguska,
"LN#0",
self.position.x,
self.position.y,
self.heading,
)
else:
positions = self.get_circular_position(
num_launchers, launcher_distance=120, coverage=180
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence._2S6_Tunguska,
"LN#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Short

48
gen/to_remove/sam_sa2.py Normal file
View File

@@ -0,0 +1,48 @@
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class SA2Generator(AirDefenseGroupGenerator):
"""
This generate a SA-2 group
"""
name = "SA-2/S-75 Site"
def generate(self) -> None:
self.add_unit(
AirDefence.P_19_s_125_sr,
"SR",
self.position.x,
self.position.y,
self.heading,
)
self.add_unit(
AirDefence.SNR_75V,
"TR",
self.position.x + 20,
self.position.y,
self.heading,
)
num_launchers = 6
positions = self.get_circular_position(
num_launchers, launcher_distance=120, coverage=180
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.S_75M_Volhov,
"LN#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Medium

48
gen/to_remove/sam_sa3.py Normal file
View File

@@ -0,0 +1,48 @@
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class SA3Generator(AirDefenseGroupGenerator):
"""
This generate a SA-3 group
"""
name = "SA-3/S-125 Site"
def generate(self) -> None:
self.add_unit(
AirDefence.P_19_s_125_sr,
"SR",
self.position.x,
self.position.y,
self.heading,
)
self.add_unit(
AirDefence.Snr_s_125_tr,
"TR",
self.position.x + 20,
self.position.y,
self.heading,
)
num_launchers = 4
positions = self.get_circular_position(
num_launchers, launcher_distance=120, coverage=180
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence._5p73_s_125_ln,
"LN#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Medium

77
gen/to_remove/sam_sa5.py Normal file
View File

@@ -0,0 +1,77 @@
from typing import Type
from dcs.unittype import VehicleType
from dcs.vehicles import AirDefence, Unarmed
from game import Game
from game.theater import SamGroundObject
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class SA5Generator(AirDefenseGroupGenerator):
"""
This generate a SA-5 group using the TinShield SR
"""
name = "SA-5/S-200 Site"
def __init__(self, game: Game, ground_object: SamGroundObject):
super().__init__(game, ground_object)
self.sr: Type[VehicleType] = AirDefence.RLS_19J6
def generate(self) -> None:
self.add_unit(
self.sr,
"SR",
self.position.x,
self.position.y,
self.heading,
)
self.add_unit(
AirDefence.RPC_5N62V,
"TR",
self.position.x + 20,
self.position.y,
self.heading,
)
self.add_unit(
Unarmed.Ural_375,
"LOGI",
self.position.x - 20,
self.position.y,
self.heading,
)
num_launchers = 6
positions = self.get_circular_position(
num_launchers, launcher_distance=120, coverage=360
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.S_200_Launcher,
"LN#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Long
# TODO Replace this legacy handling once the Generators can be faction sensitive #1903
class SA5FlatFaceGenerator(SA5Generator):
"""
This generate a SA-5 group using the P-19 FlatFace SR
"""
name = "SA-5/S-200 Site wit FlatFace SR"
def __init__(self, game: Game, ground_object: SamGroundObject):
super().__init__(game, ground_object)
self.sr: Type[VehicleType] = AirDefence.P_19_s_125_sr

41
gen/to_remove/sam_sa6.py Normal file
View File

@@ -0,0 +1,41 @@
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class SA6Generator(AirDefenseGroupGenerator):
"""
This generate a SA-6 group
"""
name = "SA-6 Kub Site"
def generate(self) -> None:
self.add_unit(
AirDefence.Kub_1S91_str,
"STR",
self.position.x,
self.position.y,
self.heading,
)
num_launchers = 4
positions = self.get_circular_position(
num_launchers, launcher_distance=120, coverage=360
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Kub_2P25_ln,
"LN#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Medium

40
gen/to_remove/sam_sa8.py Normal file
View File

@@ -0,0 +1,40 @@
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class SA8Generator(AirDefenseGroupGenerator):
"""
This generate a SA-8 group
"""
name = "SA-8 OSA Site"
def generate(self) -> None:
num_launchers = 2
positions = self.get_circular_position(
num_launchers, launcher_distance=120, coverage=180
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Osa_9A33_ln,
"OSA" + str(i),
position[0],
position[1],
position[2],
)
self.add_unit(
AirDefence.SA_8_Osa_LD_9T217,
"LD",
self.position.x + 20,
self.position.y,
self.heading,
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Medium

47
gen/to_remove/sam_sa9.py Normal file
View File

@@ -0,0 +1,47 @@
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class SA9Generator(AirDefenseGroupGenerator):
"""
This generate a SA-9 group
"""
name = "SA-9 Group"
def generate(self) -> None:
self.add_unit(
Unarmed.UAZ_469,
"UAZ",
self.position.x,
self.position.y,
self.heading,
)
self.add_unit(
Unarmed.KAMAZ_Truck,
"TRUCK",
self.position.x + 40,
self.position.y,
self.heading,
)
num_launchers = 2
positions = self.get_circular_position(
num_launchers, launcher_distance=120, coverage=360
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Strela_1_9P31,
"LN#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Short

View File

@@ -0,0 +1,40 @@
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class VulcanGenerator(AirDefenseGroupGenerator):
"""
This generate a Vulcan group
"""
name = "Vulcan Group"
def generate(self) -> None:
num_launchers = 2
positions = self.get_circular_position(
num_launchers, launcher_distance=120, coverage=180
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Vulcan,
"SPAA#" + str(i),
position[0],
position[1],
position[2],
)
self.add_unit(
Unarmed.M_818,
"TRUCK",
self.position.x + 80,
self.position.y,
self.heading,
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.AAA

View File

@@ -0,0 +1,40 @@
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class ZSU23Generator(AirDefenseGroupGenerator):
"""
This generate a ZSU 23 group
"""
name = "ZSU-23 Group"
def generate(self) -> None:
num_launchers = 4
positions = self.get_circular_position(
num_launchers, launcher_distance=120, coverage=180
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.ZSU_23_4_Shilka,
"SPAA#" + str(i),
position[0],
position[1],
position[2],
)
self.add_unit(
Unarmed.M_818,
"TRUCK",
self.position.x + 80,
self.position.y,
self.heading,
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.AAA

41
gen/to_remove/sam_zu23.py Normal file
View File

@@ -0,0 +1,41 @@
import random
from dcs.vehicles import AirDefence, Unarmed
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class ZU23Generator(AirDefenseGroupGenerator):
"""
This generate a ZU23 flak artillery group
"""
name = "ZU-23 Group"
def generate(self) -> None:
index = 0
for i in range(4):
index = index + 1
spacing_x = random.randint(10, 40)
spacing_y = random.randint(10, 40)
self.add_unit(
AirDefence.ZU_23_Emplacement_Closed,
"AAA#" + str(index),
self.position.x + spacing_x * i,
self.position.y + spacing_y * i,
self.heading,
)
self.add_unit(
Unarmed.M_818,
"TRUCK",
self.position.x + 80,
self.position.y,
self.heading,
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.AAA

View File

@@ -0,0 +1,33 @@
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class ZU23UralGenerator(AirDefenseGroupGenerator):
"""
This generate a Zu23 Ural group
"""
name = "ZU-23 Ural Group"
def generate(self) -> None:
num_launchers = 4
positions = self.get_circular_position(
num_launchers, launcher_distance=80, coverage=360
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Ural_375_ZU_23,
"SPAA#" + str(i),
position[0],
position[1],
position[2],
)
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.AAA

View File

@@ -0,0 +1,33 @@
from dcs.vehicles import AirDefence
from game.theater.theatergroundobject import AirDefenseRange
from gen.to_remove.airdefensegroupgenerator import (
AirDefenseGroupGenerator,
)
class ZU23UralInsurgentGenerator(AirDefenseGroupGenerator):
"""
This generate a Zu23 Ural group
"""
name = "ZU-23 Ural Insurgent Group"
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.AAA
def generate(self) -> None:
num_launchers = 4
positions = self.get_circular_position(
num_launchers, launcher_distance=80, coverage=360
)
for i, position in enumerate(positions):
self.add_unit(
AirDefence.Ural_375_ZU_23_Insurgent,
"SPAA#" + str(i),
position[0],
position[1],
position[2],
)

View File

@@ -0,0 +1,20 @@
import random
from dcs.ships import Schnellboot_type_S130
from gen.group_generator import ShipGroupGenerator
class SchnellbootGroupGenerator(ShipGroupGenerator):
def generate(self) -> None:
for i in range(random.randint(2, 4)):
self.add_unit(
Schnellboot_type_S130,
"Schnellboot" + str(i),
self.position.x + i * random.randint(100, 250),
self.position.y + (random.randint(100, 200) - 100),
self.heading,
)
self.get_generated_group().points[0].speed = 20

View File

@@ -0,0 +1,68 @@
import random
from dcs.vehicles import Unarmed, MissilesSS, AirDefence
from game import Game
from game.factions.faction import Faction
from game.theater.theatergroundobject import MissileSiteGroundObject
from game.utils import Heading
from gen.group_generator import VehicleGroupGenerator
class ScudGenerator(VehicleGroupGenerator[MissileSiteGroundObject]):
def __init__(
self, game: Game, ground_object: MissileSiteGroundObject, faction: Faction
) -> None:
super(ScudGenerator, self).__init__(game, ground_object)
self.faction = faction
def generate(self) -> None:
# Scuds
self.add_unit(
MissilesSS.Scud_B,
"V1#0",
self.position.x,
self.position.y + random.randint(1, 8),
self.heading,
)
self.add_unit(
MissilesSS.Scud_B,
"V1#1",
self.position.x + 50,
self.position.y + random.randint(1, 8),
self.heading,
)
self.add_unit(
MissilesSS.Scud_B,
"V1#2",
self.position.x + 100,
self.position.y + random.randint(1, 8),
self.heading,
)
# Commander
self.add_unit(
Unarmed.UAZ_469,
"Kubel#0",
self.position.x - 35,
self.position.y - 20,
self.heading,
)
# Shorad
self.add_unit(
AirDefence.ZSU_23_4_Shilka,
"SHILKA#0",
self.position.x - 55,
self.position.y - 38,
self.heading,
)
self.add_unit(
AirDefence.Strela_1_9P31,
"STRELA#0",
self.position.x + 200,
self.position.y + 15,
Heading.from_degrees(90),
)

View File

@@ -0,0 +1,52 @@
from __future__ import annotations
import logging
import random
from typing import TYPE_CHECKING, Optional
from dcs.unitgroup import ShipGroup
from game import db
from game.theater.theatergroundobject import (
LhaGroundObject,
CarrierGroundObject,
ShipGroundObject,
)
from gen.to_remove.carrier_group import CarrierGroupGenerator
from gen.to_remove.cn_dd_group import ChineseNavyGroupGenerator, Type54GroupGenerator
from gen.to_remove.dd_group import (
ArleighBurkeGroupGenerator,
OliverHazardPerryGroupGenerator,
)
from gen.to_remove.lacombattanteII import LaCombattanteIIGroupGenerator
from gen.to_remove.lha_group import LHAGroupGenerator
from gen.to_remove.ru_dd_group import (
RussianNavyGroupGenerator,
GrishaGroupGenerator,
MolniyaGroupGenerator,
KiloSubGroupGenerator,
TangoSubGroupGenerator,
)
from gen.to_remove.schnellboot import SchnellbootGroupGenerator
from gen.to_remove.uboat import UBoatGroupGenerator
from gen.to_remove.ww2lst import WW2LSTGroupGenerator
if TYPE_CHECKING:
from game import Game
SHIP_MAP = {
"SchnellbootGroupGenerator": SchnellbootGroupGenerator,
"WW2LSTGroupGenerator": WW2LSTGroupGenerator,
"UBoatGroupGenerator": UBoatGroupGenerator,
"OliverHazardPerryGroupGenerator": OliverHazardPerryGroupGenerator,
"ArleighBurkeGroupGenerator": ArleighBurkeGroupGenerator,
"RussianNavyGroupGenerator": RussianNavyGroupGenerator,
"ChineseNavyGroupGenerator": ChineseNavyGroupGenerator,
"GrishaGroupGenerator": GrishaGroupGenerator,
"MolniyaGroupGenerator": MolniyaGroupGenerator,
"KiloSubGroupGenerator": KiloSubGroupGenerator,
"TangoSubGroupGenerator": TangoSubGroupGenerator,
"Type54GroupGenerator": Type54GroupGenerator,
"LaCombattanteIIGroupGenerator": LaCombattanteIIGroupGenerator,
}

64
gen/to_remove/silkworm.py Normal file
View File

@@ -0,0 +1,64 @@
from dcs.vehicles import MissilesSS, Unarmed, AirDefence
from game import Game
from game.factions.faction import Faction
from game.theater.theatergroundobject import CoastalSiteGroundObject
from game.utils import Heading
from gen.group_generator import VehicleGroupGenerator
class SilkwormGenerator(VehicleGroupGenerator[CoastalSiteGroundObject]):
def __init__(
self, game: Game, ground_object: CoastalSiteGroundObject, faction: Faction
) -> None:
super(SilkwormGenerator, self).__init__(game, ground_object)
self.faction = faction
def generate(self) -> None:
positions = self.get_circular_position(5, launcher_distance=120, coverage=180)
self.add_unit(
MissilesSS.Silkworm_SR,
"SR#0",
self.position.x,
self.position.y,
self.heading,
)
# Launchers
for i, p in enumerate(positions):
self.add_unit(
MissilesSS.Hy_launcher,
"Missile#" + str(i),
p[0],
p[1],
self.heading,
)
# Commander
self.add_unit(
Unarmed.KAMAZ_Truck,
"KAMAZ#0",
self.position.x - 35,
self.position.y - 20,
self.heading,
)
# Shorad
self.add_unit(
AirDefence.ZSU_23_4_Shilka,
"SHILKA#0",
self.position.x - 55,
self.position.y - 38,
self.heading,
)
# Shorad 2
self.add_unit(
AirDefence.Strela_1_9P31,
"STRELA#0",
self.position.x + 200,
self.position.y + 15,
Heading.from_degrees(90),
)

20
gen/to_remove/uboat.py Normal file
View File

@@ -0,0 +1,20 @@
import random
from dcs.ships import Uboat_VIIC
from gen.group_generator import ShipGroupGenerator
class UBoatGroupGenerator(ShipGroupGenerator):
def generate(self) -> None:
for i in range(random.randint(1, 4)):
self.add_unit(
Uboat_VIIC,
"Uboat" + str(i),
self.position.x + i * random.randint(100, 250),
self.position.y + (random.randint(100, 200) - 100),
self.heading,
)
self.get_generated_group().points[0].speed = 20

70
gen/to_remove/v1_group.py Normal file
View File

@@ -0,0 +1,70 @@
import random
from dcs.vehicles import Unarmed, MissilesSS, AirDefence
from game import Game
from game.factions.faction import Faction
from game.theater.theatergroundobject import MissileSiteGroundObject
from game.utils import Heading
from gen.group_generator import VehicleGroupGenerator
class V1GroupGenerator(VehicleGroupGenerator[MissileSiteGroundObject]):
def __init__(
self, game: Game, ground_object: MissileSiteGroundObject, faction: Faction
) -> None:
super(V1GroupGenerator, self).__init__(game, ground_object)
self.faction = faction
def generate(self) -> None:
# Ramps
self.add_unit(
MissilesSS.V1_launcher,
"V1#0",
self.position.x,
self.position.y + random.randint(1, 8),
self.heading,
)
self.add_unit(
MissilesSS.V1_launcher,
"V1#1",
self.position.x + 50,
self.position.y + random.randint(1, 8),
self.heading,
)
self.add_unit(
MissilesSS.V1_launcher,
"V1#2",
self.position.x + 100,
self.position.y + random.randint(1, 8),
self.heading,
)
# Commander
self.add_unit(
Unarmed.Kubelwagen_82,
"Kubel#0",
self.position.x - 35,
self.position.y - 20,
self.heading,
)
# Self defense flak
flak_unit = random.choice([AirDefence.Flak38, AirDefence.Flak30])
self.add_unit(
flak_unit,
"FLAK#0",
self.position.x - 55,
self.position.y - 38,
self.heading,
)
self.add_unit(
Unarmed.Blitz_36_6700A,
"Blitz#0",
self.position.x + 200,
self.position.y + 15,
Heading.from_degrees(90),
)

29
gen/to_remove/ww2lst.py Normal file
View File

@@ -0,0 +1,29 @@
import random
from dcs.ships import USS_Samuel_Chase, LST_Mk2
from gen.group_generator import ShipGroupGenerator
class WW2LSTGroupGenerator(ShipGroupGenerator):
def generate(self) -> None:
# Add LS Samuel Chase
self.add_unit(
USS_Samuel_Chase,
"SamuelChase",
self.position.x,
self.position.y,
self.heading,
)
for i in range(1, random.randint(3, 4)):
self.add_unit(
LST_Mk2,
"LST" + str(i),
self.position.x + i * random.randint(800, 1200),
self.position.y,
self.heading,
)
self.get_generated_group().points[0].speed = 20