mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Prepare the generators for template migration
adopt armor and ship generators for randomization
This commit is contained in:
35
gen/to_remove/aaa_bofors.py
Normal file
35
gen/to_remove/aaa_bofors.py
Normal 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
99
gen/to_remove/aaa_flak.py
Normal 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
|
||||
45
gen/to_remove/aaa_flak18.py
Normal file
45
gen/to_remove/aaa_flak18.py
Normal 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
41
gen/to_remove/aaa_ks19.py
Normal 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
|
||||
81
gen/to_remove/aaa_ww2_ally_flak.py
Normal file
81
gen/to_remove/aaa_ww2_ally_flak.py
Normal 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
|
||||
32
gen/to_remove/aaa_zsu57.py
Normal file
32
gen/to_remove/aaa_zsu57.py
Normal 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
|
||||
34
gen/to_remove/aaa_zu23_insurgent.py
Normal file
34
gen/to_remove/aaa_zu23_insurgent.py
Normal 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
|
||||
66
gen/to_remove/airdefensegroupgenerator.py
Normal file
66
gen/to_remove/airdefensegroupgenerator.py
Normal 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
|
||||
63
gen/to_remove/armor_group_generator.py
Normal file
63
gen/to_remove/armor_group_generator.py
Normal 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()
|
||||
84
gen/to_remove/armored_group_generator.py
Normal file
84
gen/to_remove/armored_group_generator.py
Normal 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,
|
||||
)
|
||||
124
gen/to_remove/carrier_group.py
Normal file
124
gen/to_remove/carrier_group.py
Normal 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
|
||||
59
gen/to_remove/cn_dd_group.py
Normal file
59
gen/to_remove/cn_dd_group.py
Normal 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
|
||||
)
|
||||
13
gen/to_remove/coastal_group_generator.py
Normal file
13
gen/to_remove/coastal_group_generator.py
Normal 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,
|
||||
}
|
||||
153
gen/to_remove/cold_war_flak.py
Normal file
153
gen/to_remove/cold_war_flak.py
Normal 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
56
gen/to_remove/dd_group.py
Normal 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
|
||||
)
|
||||
27
gen/to_remove/ewr_group_generator.py
Normal file
27
gen/to_remove/ewr_group_generator.py
Normal 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
114
gen/to_remove/ewrs.py
Normal 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
110
gen/to_remove/freya_ewr.py
Normal 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
|
||||
13
gen/to_remove/lacombattanteII.py
Normal file
13
gen/to_remove/lacombattanteII.py
Normal 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
|
||||
)
|
||||
39
gen/to_remove/lha_group.py
Normal file
39
gen/to_remove/lha_group.py
Normal 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
|
||||
12
gen/to_remove/missiles_group_generator.py
Normal file
12
gen/to_remove/missiles_group_generator.py
Normal 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}
|
||||
92
gen/to_remove/ru_dd_group.py
Normal file
92
gen/to_remove/ru_dd_group.py
Normal 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)
|
||||
40
gen/to_remove/sam_avenger.py
Normal file
40
gen/to_remove/sam_avenger.py
Normal 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
|
||||
40
gen/to_remove/sam_chaparral.py
Normal file
40
gen/to_remove/sam_chaparral.py
Normal 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
|
||||
40
gen/to_remove/sam_gepard.py
Normal file
40
gen/to_remove/sam_gepard.py
Normal 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
|
||||
172
gen/to_remove/sam_group_generator.py
Normal file
172
gen/to_remove/sam_group_generator.py
Normal 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
66
gen/to_remove/sam_hawk.py
Normal 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
59
gen/to_remove/sam_hq7.py
Normal 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
|
||||
40
gen/to_remove/sam_linebacker.py
Normal file
40
gen/to_remove/sam_linebacker.py
Normal 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
|
||||
67
gen/to_remove/sam_nasams.py
Normal file
67
gen/to_remove/sam_nasams.py
Normal 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
|
||||
88
gen/to_remove/sam_patriot.py
Normal file
88
gen/to_remove/sam_patriot.py
Normal 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
|
||||
52
gen/to_remove/sam_rapier.py
Normal file
52
gen/to_remove/sam_rapier.py
Normal 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
|
||||
51
gen/to_remove/sam_roland.py
Normal file
51
gen/to_remove/sam_roland.py
Normal 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
222
gen/to_remove/sam_sa10.py
Normal 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
48
gen/to_remove/sam_sa11.py
Normal 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
47
gen/to_remove/sam_sa13.py
Normal 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
46
gen/to_remove/sam_sa15.py
Normal 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
46
gen/to_remove/sam_sa17.py
Normal 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
42
gen/to_remove/sam_sa19.py
Normal 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
48
gen/to_remove/sam_sa2.py
Normal 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
48
gen/to_remove/sam_sa3.py
Normal 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
77
gen/to_remove/sam_sa5.py
Normal 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
41
gen/to_remove/sam_sa6.py
Normal 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
40
gen/to_remove/sam_sa8.py
Normal 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
47
gen/to_remove/sam_sa9.py
Normal 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
|
||||
40
gen/to_remove/sam_vulcan.py
Normal file
40
gen/to_remove/sam_vulcan.py
Normal 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
|
||||
40
gen/to_remove/sam_zsu23.py
Normal file
40
gen/to_remove/sam_zsu23.py
Normal 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
41
gen/to_remove/sam_zu23.py
Normal 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
|
||||
33
gen/to_remove/sam_zu23_ural.py
Normal file
33
gen/to_remove/sam_zu23_ural.py
Normal 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
|
||||
33
gen/to_remove/sam_zu23_ural_insurgent.py
Normal file
33
gen/to_remove/sam_zu23_ural_insurgent.py
Normal 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],
|
||||
)
|
||||
20
gen/to_remove/schnellboot.py
Normal file
20
gen/to_remove/schnellboot.py
Normal 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
|
||||
68
gen/to_remove/scud_site.py
Normal file
68
gen/to_remove/scud_site.py
Normal 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),
|
||||
)
|
||||
52
gen/to_remove/ship_group_generator.py
Normal file
52
gen/to_remove/ship_group_generator.py
Normal 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
64
gen/to_remove/silkworm.py
Normal 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
20
gen/to_remove/uboat.py
Normal 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
70
gen/to_remove/v1_group.py
Normal 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
29
gen/to_remove/ww2lst.py
Normal 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
|
||||
Reference in New Issue
Block a user