mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Flesh out typing information, enforce.
This commit is contained in:
@@ -15,7 +15,7 @@ class BoforsGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Bofors AAA"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
|
||||
index = 0
|
||||
for i in range(4):
|
||||
|
||||
@@ -24,7 +24,7 @@ class FlakGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Flak Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
index = 0
|
||||
mixed = random.choice([True, False])
|
||||
unit_type = random.choice(GFLAK)
|
||||
|
||||
@@ -15,7 +15,7 @@ class Flak18Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "WW2 Flak Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
|
||||
spacing = random.randint(30, 60)
|
||||
index = 0
|
||||
|
||||
@@ -14,7 +14,7 @@ class KS19Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "KS-19 AAA Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
self.add_unit(
|
||||
highdigitsams.AAA_SON_9_Fire_Can,
|
||||
"TR",
|
||||
|
||||
@@ -15,7 +15,7 @@ class AllyWW2FlakGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "WW2 Ally Flak Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
|
||||
positions = self.get_circular_position(4, launcher_distance=30, coverage=360)
|
||||
for i, position in enumerate(positions):
|
||||
|
||||
@@ -13,7 +13,7 @@ class ZSU57Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "ZSU-57-2 Group"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
num_launchers = 4
|
||||
positions = self.get_circular_position(
|
||||
num_launchers, launcher_distance=110, coverage=360
|
||||
|
||||
@@ -15,7 +15,7 @@ class ZU23InsurgentGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Zu-23 Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
index = 0
|
||||
for i in range(4):
|
||||
index = index + 1
|
||||
|
||||
@@ -38,7 +38,7 @@ class AirDefenseRange(Enum):
|
||||
self.default_role = default_role
|
||||
|
||||
|
||||
class AirDefenseGroupGenerator(GroupGenerator, ABC):
|
||||
class AirDefenseGroupGenerator(GroupGenerator[VehicleGroup], ABC):
|
||||
"""
|
||||
This is the base for all SAM group generators
|
||||
"""
|
||||
|
||||
@@ -18,7 +18,7 @@ class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Early Cold War Flak Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
|
||||
spacing = random.randint(30, 60)
|
||||
index = 0
|
||||
@@ -90,7 +90,7 @@ class ColdWarFlakGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Cold War Flak Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
|
||||
spacing = random.randint(30, 60)
|
||||
index = 0
|
||||
|
||||
@@ -1,12 +1,13 @@
|
||||
from typing import Type
|
||||
|
||||
from dcs.unitgroup import VehicleGroup
|
||||
from dcs.vehicles import AirDefence
|
||||
from dcs.unittype import VehicleType
|
||||
|
||||
from gen.sam.group_generator import GroupGenerator
|
||||
|
||||
|
||||
class EwrGenerator(GroupGenerator):
|
||||
class EwrGenerator(GroupGenerator[VehicleGroup]):
|
||||
unit_type: Type[VehicleType]
|
||||
|
||||
@classmethod
|
||||
|
||||
@@ -13,7 +13,7 @@ class FreyaGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Freya EWR Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
|
||||
# TODO : would be better with the Concrete structure that is supposed to protect it
|
||||
self.add_unit(
|
||||
|
||||
@@ -3,13 +3,15 @@ from __future__ import annotations
|
||||
import logging
|
||||
import math
|
||||
import random
|
||||
from typing import TYPE_CHECKING, Type
|
||||
from collections import Iterable
|
||||
from typing import TYPE_CHECKING, Type, TypeVar, Generic
|
||||
|
||||
from dcs import unitgroup
|
||||
from dcs.mapping import Point
|
||||
from dcs.point import PointAction
|
||||
from dcs.unit import Ship, Vehicle
|
||||
from dcs.unittype import VehicleType
|
||||
from dcs.unitgroup import MovingGroup, ShipGroup
|
||||
from dcs.unittype import VehicleType, UnitType
|
||||
|
||||
from game.dcs.groundunittype import GroundUnitType
|
||||
from game.factions.faction import Faction
|
||||
@@ -19,12 +21,15 @@ if TYPE_CHECKING:
|
||||
from game.game import Game
|
||||
|
||||
|
||||
GroupType = TypeVar("GroupType", bound=MovingGroup)
|
||||
|
||||
|
||||
# TODO: Generate a group description rather than a pydcs group.
|
||||
# It appears that all of this work gets redone at miz generation time (see
|
||||
# groundobjectsgen for an example). We can do less work and include the data we
|
||||
# care about in the format we want if we just generate our own group description
|
||||
# types rather than pydcs groups.
|
||||
class GroupGenerator:
|
||||
class GroupGenerator(Generic[GroupType]):
|
||||
|
||||
price: int
|
||||
|
||||
@@ -38,10 +43,10 @@ class GroupGenerator:
|
||||
wp = self.vg.add_waypoint(self.position, PointAction.OffRoad, 0)
|
||||
wp.ETA_locked = True
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
raise NotImplementedError
|
||||
|
||||
def get_generated_group(self) -> unitgroup.VehicleGroup:
|
||||
def get_generated_group(self) -> GroupType:
|
||||
return self.vg
|
||||
|
||||
def add_unit(
|
||||
@@ -58,7 +63,7 @@ class GroupGenerator:
|
||||
|
||||
def add_unit_to_group(
|
||||
self,
|
||||
group: unitgroup.VehicleGroup,
|
||||
group: GroupType,
|
||||
unit_type: Type[VehicleType],
|
||||
name: str,
|
||||
position: Point,
|
||||
@@ -78,7 +83,9 @@ class GroupGenerator:
|
||||
|
||||
return unit
|
||||
|
||||
def get_circular_position(self, num_units, launcher_distance, coverage=90):
|
||||
def get_circular_position(
|
||||
self, num_units: int, launcher_distance: int, coverage: int = 90
|
||||
) -> Iterable[tuple[float, float, int]]:
|
||||
"""
|
||||
Given a position on the map, array a group of units in a circle a uniform distance from the unit
|
||||
:param num_units:
|
||||
@@ -104,21 +111,20 @@ class GroupGenerator:
|
||||
else:
|
||||
current_offset = self.heading
|
||||
current_offset -= outer_offset * (math.ceil(num_units / 2) - 1)
|
||||
for x in range(1, num_units + 1):
|
||||
positions.append(
|
||||
(
|
||||
self.position.x
|
||||
+ launcher_distance * math.cos(math.radians(current_offset)),
|
||||
self.position.y
|
||||
+ launcher_distance * math.sin(math.radians(current_offset)),
|
||||
current_offset,
|
||||
)
|
||||
for _ in range(1, num_units + 1):
|
||||
x: float = self.position.x + launcher_distance * math.cos(
|
||||
math.radians(current_offset)
|
||||
)
|
||||
y: float = self.position.y + launcher_distance * math.sin(
|
||||
math.radians(current_offset)
|
||||
)
|
||||
heading = current_offset
|
||||
positions.append((x, y, int(heading)))
|
||||
current_offset += outer_offset
|
||||
return positions
|
||||
|
||||
|
||||
class ShipGroupGenerator(GroupGenerator):
|
||||
class ShipGroupGenerator(GroupGenerator[ShipGroup]):
|
||||
"""Abstract class for other ship generator classes"""
|
||||
|
||||
def __init__(
|
||||
@@ -133,7 +139,14 @@ class ShipGroupGenerator(GroupGenerator):
|
||||
wp = self.vg.add_waypoint(self.position, 0)
|
||||
wp.ETA_locked = True
|
||||
|
||||
def add_unit(self, unit_type, name, pos_x, pos_y, heading) -> Ship:
|
||||
def add_unit(
|
||||
self,
|
||||
unit_type: Type[UnitType],
|
||||
name: str,
|
||||
pos_x: float,
|
||||
pos_y: float,
|
||||
heading: int,
|
||||
) -> Ship:
|
||||
unit = Ship(self.game.next_unit_id(), f"{self.go.group_name}|{name}", unit_type)
|
||||
unit.position.x = pos_x
|
||||
unit.position.y = pos_y
|
||||
|
||||
@@ -15,7 +15,7 @@ class AvengerGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Avenger Group"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
num_launchers = 2
|
||||
|
||||
self.add_unit(
|
||||
|
||||
@@ -15,7 +15,7 @@ class ChaparralGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Chaparral Group"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
num_launchers = 2
|
||||
|
||||
self.add_unit(
|
||||
|
||||
@@ -15,7 +15,7 @@ class GepardGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Gepard Group"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
num_launchers = 2
|
||||
|
||||
positions = self.get_circular_position(
|
||||
|
||||
@@ -17,7 +17,7 @@ class HawkGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Hawk Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
self.add_unit(
|
||||
AirDefence.Hawk_sr,
|
||||
"SR",
|
||||
|
||||
@@ -17,7 +17,7 @@ class HQ7Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "HQ-7 Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
self.add_unit(
|
||||
AirDefence.HQ_7_STR_SP,
|
||||
"STR",
|
||||
|
||||
@@ -15,7 +15,7 @@ class LinebackerGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Linebacker Group"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
num_launchers = 2
|
||||
|
||||
self.add_unit(
|
||||
|
||||
@@ -15,7 +15,7 @@ class PatriotGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Patriot Battery"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
# Command Post
|
||||
self.add_unit(
|
||||
AirDefence.Patriot_str,
|
||||
|
||||
@@ -16,7 +16,7 @@ class RapierGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Rapier AA Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
self.add_unit(
|
||||
AirDefence.Rapier_fsa_blindfire_radar,
|
||||
"BT",
|
||||
|
||||
@@ -14,7 +14,7 @@ class RolandGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Roland Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
num_launchers = 2
|
||||
self.add_unit(
|
||||
AirDefence.Roland_Radar,
|
||||
|
||||
@@ -28,7 +28,7 @@ class SA10Generator(AirDefenseGroupGenerator):
|
||||
self.ln1 = AirDefence.S_300PS_5P85C_ln
|
||||
self.ln2 = AirDefence.S_300PS_5P85D_ln
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
# Search Radar
|
||||
self.add_unit(
|
||||
self.sr1, "SR1", self.position.x, self.position.y + 40, self.heading
|
||||
|
||||
@@ -15,7 +15,7 @@ class SA11Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "SA-11 Buk Battery"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
self.add_unit(
|
||||
AirDefence.SA_11_Buk_SR_9S18M1,
|
||||
"SR",
|
||||
|
||||
@@ -15,7 +15,7 @@ class SA13Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "SA-13 Strela Group"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
self.add_unit(
|
||||
Unarmed.UAZ_469,
|
||||
"UAZ",
|
||||
|
||||
@@ -13,7 +13,7 @@ class SA15Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "SA-15 Tor Group"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
num_launchers = 2
|
||||
positions = self.get_circular_position(
|
||||
num_launchers, launcher_distance=120, coverage=360
|
||||
|
||||
@@ -14,7 +14,7 @@ class SA17Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "SA-17 Grizzly Battery"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
self.add_unit(
|
||||
AirDefence.SA_11_Buk_SR_9S18M1,
|
||||
"SR",
|
||||
|
||||
@@ -15,7 +15,7 @@ class SA19Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "SA-19 Tunguska Group"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
num_launchers = 2
|
||||
|
||||
if num_launchers == 1:
|
||||
|
||||
@@ -15,7 +15,7 @@ class SA2Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "SA-2/S-75 Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
self.add_unit(
|
||||
AirDefence.P_19_s_125_sr,
|
||||
"SR",
|
||||
|
||||
@@ -15,7 +15,7 @@ class SA3Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "SA-3/S-125 Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
self.add_unit(
|
||||
AirDefence.P_19_s_125_sr,
|
||||
"SR",
|
||||
|
||||
@@ -15,7 +15,7 @@ class SA6Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "SA-6 Kub Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
self.add_unit(
|
||||
AirDefence.Kub_1S91_str,
|
||||
"STR",
|
||||
|
||||
@@ -13,7 +13,7 @@ class SA8Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "SA-8 OSA Site"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
num_launchers = 2
|
||||
positions = self.get_circular_position(
|
||||
num_launchers, launcher_distance=120, coverage=180
|
||||
|
||||
@@ -15,7 +15,7 @@ class SA9Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "SA-9 Group"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
self.add_unit(
|
||||
Unarmed.UAZ_469,
|
||||
"UAZ",
|
||||
|
||||
@@ -15,7 +15,7 @@ class VulcanGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "Vulcan Group"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
num_launchers = 2
|
||||
|
||||
positions = self.get_circular_position(
|
||||
|
||||
@@ -15,7 +15,7 @@ class ZSU23Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "ZSU-23 Group"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
num_launchers = 4
|
||||
|
||||
positions = self.get_circular_position(
|
||||
|
||||
@@ -15,7 +15,7 @@ class ZU23Generator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "ZU-23 Group"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
index = 0
|
||||
for i in range(4):
|
||||
index = index + 1
|
||||
|
||||
@@ -15,7 +15,7 @@ class ZU23UralGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "ZU-23 Ural Group"
|
||||
|
||||
def generate(self):
|
||||
def generate(self) -> None:
|
||||
num_launchers = 4
|
||||
|
||||
positions = self.get_circular_position(
|
||||
|
||||
@@ -15,7 +15,11 @@ class ZU23UralInsurgentGenerator(AirDefenseGroupGenerator):
|
||||
|
||||
name = "ZU-23 Ural Insurgent Group"
|
||||
|
||||
def generate(self):
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
def generate(self) -> None:
|
||||
num_launchers = 4
|
||||
|
||||
positions = self.get_circular_position(
|
||||
@@ -29,7 +33,3 @@ class ZU23UralInsurgentGenerator(AirDefenseGroupGenerator):
|
||||
position[1],
|
||||
position[2],
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def range(cls) -> AirDefenseRange:
|
||||
return AirDefenseRange.AAA
|
||||
|
||||
Reference in New Issue
Block a user