Flesh out typing information, enforce.

This commit is contained in:
Dan Albert
2021-07-07 17:41:29 -07:00
parent 69c3d41a8a
commit fb9a0fe833
99 changed files with 426 additions and 453 deletions

View File

@@ -15,7 +15,7 @@ class BoforsGenerator(AirDefenseGroupGenerator):
name = "Bofors AAA"
def generate(self):
def generate(self) -> None:
index = 0
for i in range(4):

View File

@@ -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)

View File

@@ -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

View File

@@ -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",

View File

@@ -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):

View File

@@ -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

View File

@@ -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

View File

@@ -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
"""

View File

@@ -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

View File

@@ -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

View File

@@ -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(

View File

@@ -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

View File

@@ -15,7 +15,7 @@ class AvengerGenerator(AirDefenseGroupGenerator):
name = "Avenger Group"
def generate(self):
def generate(self) -> None:
num_launchers = 2
self.add_unit(

View File

@@ -15,7 +15,7 @@ class ChaparralGenerator(AirDefenseGroupGenerator):
name = "Chaparral Group"
def generate(self):
def generate(self) -> None:
num_launchers = 2
self.add_unit(

View File

@@ -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(

View File

@@ -17,7 +17,7 @@ class HawkGenerator(AirDefenseGroupGenerator):
name = "Hawk Site"
def generate(self):
def generate(self) -> None:
self.add_unit(
AirDefence.Hawk_sr,
"SR",

View File

@@ -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",

View File

@@ -15,7 +15,7 @@ class LinebackerGenerator(AirDefenseGroupGenerator):
name = "Linebacker Group"
def generate(self):
def generate(self) -> None:
num_launchers = 2
self.add_unit(

View File

@@ -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,

View File

@@ -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",

View File

@@ -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,

View File

@@ -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

View File

@@ -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",

View File

@@ -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",

View File

@@ -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

View File

@@ -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",

View File

@@ -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:

View File

@@ -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",

View File

@@ -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",

View File

@@ -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",

View File

@@ -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

View File

@@ -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",

View File

@@ -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(

View File

@@ -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(

View File

@@ -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

View File

@@ -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(

View File

@@ -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