diff --git a/game/data/doctrine.py b/game/data/doctrine.py index 866ae897..e7333096 100644 --- a/game/data/doctrine.py +++ b/game/data/doctrine.py @@ -1,95 +1,88 @@ +from dataclasses import dataclass + from game.utils import nm_to_meter, feet_to_meter -MODERN_DOCTRINE = { - "GENERATORS": { - "CAS": True, - "CAP": True, - "SEAD": True, - "STRIKE": True, - "ANTISHIP": True, - }, +@dataclass(frozen=True) +class Doctrine: + cas: bool + cap: bool + sead: bool + strike: bool + antiship: bool - "STRIKE_MAX_RANGE": 1500000, - "SEAD_MAX_RANGE": 1500000, + strike_max_range: int + sead_max_range: int - "CAP_EVERY_X_MINUTES": 20, - "CAS_EVERY_X_MINUTES": 30, - "SEAD_EVERY_X_MINUTES": 40, - "STRIKE_EVERY_X_MINUTES": 40, + ingress_egress_distance: int + ingress_altitude: int + egress_altitude: int + min_patrol_altitude: int + max_patrol_altitude: int + pattern_altitude: int - "INGRESS_EGRESS_DISTANCE": nm_to_meter(45), - "INGRESS_ALT": feet_to_meter(20000), - "EGRESS_ALT": feet_to_meter(20000), - "PATROL_ALT_RANGE": (feet_to_meter(15000), feet_to_meter(33000)), - "PATTERN_ALTITUDE": feet_to_meter(5000), + cap_min_track_length: int + cap_max_track_length: int + cap_min_distance_from_cp: int + cap_max_distance_from_cp: int - "CAP_PATTERN_LENGTH": (nm_to_meter(15), nm_to_meter(40)), - "FRONTLINE_CAP_DISTANCE_FROM_FRONTLINE": (nm_to_meter(6), nm_to_meter(15)), - "CAP_DISTANCE_FROM_CP": (nm_to_meter(10), nm_to_meter(40)), - "MAX_NUMBER_OF_INTERCEPTION_GROUP": 3, -} +MODERN_DOCTRINE = Doctrine( + cap=True, + cas=True, + sead=True, + strike=True, + antiship=True, + strike_max_range=1500000, + sead_max_range=1500000, + ingress_egress_distance=nm_to_meter(45), + ingress_altitude=feet_to_meter(20000), + egress_altitude=feet_to_meter(20000), + min_patrol_altitude=feet_to_meter(15000), + max_patrol_altitude=feet_to_meter(33000), + pattern_altitude=feet_to_meter(5000), + cap_min_track_length=nm_to_meter(15), + cap_max_track_length=nm_to_meter(40), + cap_min_distance_from_cp=nm_to_meter(10), + cap_max_distance_from_cp=nm_to_meter(40), +) -COLDWAR_DOCTRINE = { +COLDWAR_DOCTRINE = Doctrine( + cap=True, + cas=True, + sead=True, + strike=True, + antiship=True, + strike_max_range=1500000, + sead_max_range=1500000, + ingress_egress_distance=nm_to_meter(30), + ingress_altitude=feet_to_meter(18000), + egress_altitude=feet_to_meter(18000), + min_patrol_altitude=feet_to_meter(10000), + max_patrol_altitude=feet_to_meter(24000), + pattern_altitude=feet_to_meter(5000), + cap_min_track_length=nm_to_meter(12), + cap_max_track_length=nm_to_meter(24), + cap_min_distance_from_cp=nm_to_meter(8), + cap_max_distance_from_cp=nm_to_meter(25), +) - "GENERATORS": { - "CAS": True, - "CAP": True, - "SEAD": True, - "STRIKE": True, - "ANTISHIP": True, - }, - - "STRIKE_MAX_RANGE": 1500000, - "SEAD_MAX_RANGE": 1500000, - - "CAP_EVERY_X_MINUTES": 20, - "CAS_EVERY_X_MINUTES": 30, - "SEAD_EVERY_X_MINUTES": 40, - "STRIKE_EVERY_X_MINUTES": 40, - - "INGRESS_EGRESS_DISTANCE": nm_to_meter(30), - "INGRESS_ALT": feet_to_meter(18000), - "EGRESS_ALT": feet_to_meter(18000), - "PATROL_ALT_RANGE": (feet_to_meter(10000), feet_to_meter(24000)), - "PATTERN_ALTITUDE": feet_to_meter(5000), - - "CAP_PATTERN_LENGTH": (nm_to_meter(12), nm_to_meter(24)), - "FRONTLINE_CAP_DISTANCE_FROM_FRONTLINE": (nm_to_meter(2), nm_to_meter(8)), - "CAP_DISTANCE_FROM_CP": (nm_to_meter(8), nm_to_meter(25)), - - "MAX_NUMBER_OF_INTERCEPTION_GROUP": 3, -} - -WWII_DOCTRINE = { - - "GENERATORS": { - "CAS": True, - "CAP": True, - "SEAD": False, - "STRIKE": True, - "ANTISHIP": True, - }, - - "STRIKE_MAX_RANGE": 1500000, - "SEAD_MAX_RANGE": 1500000, - - "CAP_EVERY_X_MINUTES": 20, - "CAS_EVERY_X_MINUTES": 30, - "SEAD_EVERY_X_MINUTES": 40, - "STRIKE_EVERY_X_MINUTES": 40, - - "INGRESS_EGRESS_DISTANCE": nm_to_meter(7), - "INGRESS_ALT": feet_to_meter(8000), - "EGRESS_ALT": feet_to_meter(8000), - "PATROL_ALT_RANGE": (feet_to_meter(4000), feet_to_meter(15000)), - "PATTERN_ALTITUDE": feet_to_meter(5000), - - "CAP_PATTERN_LENGTH": (nm_to_meter(8), nm_to_meter(18)), - "FRONTLINE_CAP_DISTANCE_FROM_FRONTLINE": (nm_to_meter(1), nm_to_meter(6)), - "CAP_DISTANCE_FROM_CP": (nm_to_meter(0), nm_to_meter(5)), - - "MAX_NUMBER_OF_INTERCEPTION_GROUP": 3, - -} +WWII_DOCTRINE = Doctrine( + cap=True, + cas=True, + sead=False, + strike=True, + antiship=True, + strike_max_range=1500000, + sead_max_range=1500000, + ingress_egress_distance=nm_to_meter(7), + ingress_altitude=feet_to_meter(8000), + egress_altitude=feet_to_meter(8000), + min_patrol_altitude=feet_to_meter(4000), + max_patrol_altitude=feet_to_meter(15000), + pattern_altitude=feet_to_meter(5000), + cap_min_track_length=nm_to_meter(8), + cap_max_track_length=nm_to_meter(18), + cap_min_distance_from_cp=nm_to_meter(0), + cap_max_distance_from_cp=nm_to_meter(5), +) diff --git a/gen/flights/flightplan.py b/gen/flights/flightplan.py index c8bd988a..0c631b31 100644 --- a/gen/flights/flightplan.py +++ b/gen/flights/flightplan.py @@ -11,7 +11,7 @@ import logging import random from typing import List, Optional, TYPE_CHECKING -from game.data.doctrine import MODERN_DOCTRINE +from game.data.doctrine import Doctrine, MODERN_DOCTRINE from .flight import Flight, FlightType, FlightWaypointType, FlightWaypoint from ..conflictgen import Conflict from theater import ControlPoint, FrontLine, MissionTarget, TheaterGroundObject @@ -39,7 +39,7 @@ class FlightPlanBuilder: faction = self.game.player_faction else: faction = self.game.enemy_faction - self.doctrine = faction.get("doctrine", MODERN_DOCTRINE) + self.doctrine: Doctrine = faction.get("doctrine", MODERN_DOCTRINE) def populate_flight_plan(self, flight: Flight, objective_location: MissionTarget) -> None: @@ -113,13 +113,13 @@ class FlightPlanBuilder: egress_heading = heading - 180 - 25 ingress_pos = location.position.point_from_heading( - ingress_heading, self.doctrine["INGRESS_EGRESS_DISTANCE"] + ingress_heading, self.doctrine.ingress_egress_distance ) ingress_point = FlightWaypoint( FlightWaypointType.INGRESS_STRIKE, ingress_pos.x, ingress_pos.y, - self.doctrine["INGRESS_ALT"] + self.doctrine.ingress_altitude ) ingress_point.pretty_name = "INGRESS on " + location.name ingress_point.description = "INGRESS on " + location.name @@ -187,13 +187,13 @@ class FlightPlanBuilder: flight.points.append(point) egress_pos = location.position.point_from_heading( - egress_heading, self.doctrine["INGRESS_EGRESS_DISTANCE"] + egress_heading, self.doctrine.ingress_egress_distance ) egress_point = FlightWaypoint( FlightWaypointType.EGRESS, egress_pos.x, egress_pos.y, - self.doctrine["EGRESS_ALT"] + self.doctrine.egress_altitude ) egress_point.name = "EGRESS" egress_point.pretty_name = "EGRESS from " + location.name @@ -222,19 +222,19 @@ class FlightPlanBuilder: flight.flight_type = FlightType.CAP patrol_alt = random.randint( - self.doctrine["PATROL_ALT_RANGE"][0], - self.doctrine["PATROL_ALT_RANGE"][1] + self.doctrine.min_patrol_altitude, + self.doctrine.max_patrol_altitude ) loc = location.position.point_from_heading( random.randint(0, 360), - random.randint(self.doctrine["CAP_DISTANCE_FROM_CP"][0], - self.doctrine["CAP_DISTANCE_FROM_CP"][1]) + random.randint(self.doctrine.cap_min_distance_from_cp, + self.doctrine.cap_max_distance_from_cp) ) hdg = location.position.heading_between_point(loc) radius = random.randint( - self.doctrine["CAP_PATTERN_LENGTH"][0], - self.doctrine["CAP_PATTERN_LENGTH"][1] + self.doctrine.cap_min_track_length, + self.doctrine.cap_max_track_length ) orbit0p = loc.point_from_heading(hdg - 90, radius) orbit1p = loc.point_from_heading(hdg + 90, radius) @@ -286,8 +286,8 @@ class FlightPlanBuilder: ally_cp, enemy_cp = location.control_points flight.flight_type = FlightType.CAP - patrol_alt = random.randint(self.doctrine["PATROL_ALT_RANGE"][0], - self.doctrine["PATROL_ALT_RANGE"][1]) + patrol_alt = random.randint(self.doctrine.min_patrol_altitude, + self.doctrine.max_patrol_altitude) # Find targets waypoints ingress, heading, distance = Conflict.frontline_vector( @@ -372,13 +372,13 @@ class FlightPlanBuilder: egress_heading = heading - 180 - 25 ingress_pos = location.position.point_from_heading( - ingress_heading, self.doctrine["INGRESS_EGRESS_DISTANCE"] + ingress_heading, self.doctrine.ingress_egress_distance ) ingress_point = FlightWaypoint( FlightWaypointType.INGRESS_SEAD, ingress_pos.x, ingress_pos.y, - self.doctrine["INGRESS_ALT"] + self.doctrine.ingress_altitude ) ingress_point.name = "INGRESS" ingress_point.pretty_name = "INGRESS on " + location.name @@ -426,13 +426,13 @@ class FlightPlanBuilder: flight.points.append(point) egress_pos = location.position.point_from_heading( - egress_heading, self.doctrine["INGRESS_EGRESS_DISTANCE"] + egress_heading, self.doctrine.ingress_egress_distance ) egress_point = FlightWaypoint( FlightWaypointType.EGRESS, egress_pos.x, egress_pos.y, - self.doctrine["EGRESS_ALT"] + self.doctrine.egress_altitude ) egress_point.name = "EGRESS" egress_point.pretty_name = "EGRESS from " + location.name @@ -531,7 +531,7 @@ class FlightPlanBuilder: FlightWaypointType.ASCEND_POINT, pos_ascend.x, pos_ascend.y, - self.doctrine["PATTERN_ALTITUDE"] + self.doctrine.pattern_altitude ) ascend.name = "ASCEND" ascend.alt_type = "RADIO" @@ -553,7 +553,7 @@ class FlightPlanBuilder: FlightWaypointType.DESCENT_POINT, descend.x, descend.y, - self.doctrine["PATTERN_ALTITUDE"] + self.doctrine.pattern_altitude ) descend.name = "DESCEND" descend.alt_type = "RADIO"