Compare commits

..

1 Commits

Author SHA1 Message Date
zhexu14
9386544207 Update README.md
Remove reference to DCS Stable and Open Beta as they are now merged.
2024-06-06 22:37:37 +10:00
227 changed files with 3439 additions and 5843 deletions

View File

@@ -31,7 +31,7 @@ body:
If the bug was found in a development build, select "Development build"
and provide a link to the build in the field below.
options:
- 11.1.1
- 11.0.0
- Development build
- type: textarea
attributes:

View File

@@ -39,7 +39,7 @@ body:
If the bug was found in a development build, select "Development build"
and provide a link to the build in the field below.
options:
- 11.1.1
- 11.0.0
- Development build
- type: textarea
attributes:

View File

@@ -35,7 +35,7 @@ jobs:
Compress-Archive -Path .\dist\dcs_liberation\ -DestinationPath
dist\dcs_liberation.zip
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v2
with:
name: dcs_liberation
path: dist/dcs_liberation.zip

View File

@@ -11,7 +11,7 @@ jobs:
- uses: actions/setup-python@v2
- uses: psf/black@stable
with:
version: ~=24.3.0
version: ~=23.11
src: "."
options: "--check"

View File

@@ -33,7 +33,7 @@ jobs:
with:
release: true
- uses: actions/upload-artifact@v4
- uses: actions/upload-artifact@v2
with:
name: dcs_liberation
path: dist/
@@ -42,7 +42,7 @@ jobs:
needs: [build]
runs-on: windows-latest
steps:
- uses: actions/download-artifact@v4.1.7
- uses: actions/download-artifact@v2
with:
name: dcs_liberation

View File

@@ -2,6 +2,8 @@
(Github Readme Banner and Splash screen Artwork by Andriy Dankovych, CC BY-SA 4.0)
[![Patreon](https://img.shields.io/badge/patreon-become%20a%20patron-orange?logo=patreon)](https://patreon.com/dcsliberation)
[![Download](https://img.shields.io/github/downloads/dcs-liberation/dcs_liberation/total?label=Download)](https://github.com/dcs-liberation/dcs_liberation/releases)
[![Discord](https://img.shields.io/discord/595702951800995872?label=Discord&logo=discord)](https://discord.gg/bKrtrkJ)

View File

@@ -1,30 +1,10 @@
# 12.0.0
# 11.1.0
Saves from 11.x are not compatible with 12.0.0.
Saves from 11.0.0 are compatible with 11.1.0. See Known Issues section for exceptions.
## Features/Improvements
* **[Engine]** Support for DCS 2.9.9.2280.
* **[Campaign]** Flights are assigned different callsigns appropriate to the faction.
* **[Campaign]** Removed deprecated settings for generating persistent and invulnerable AWACs and tankers.
* **[Data]** Added ability to restrict weapons usage for a faction to a different year from the nominal weapon introduction year. Updated faction data to restrict more advanced missiles from Soviet client states during the cold war. Updated Egypt 2000 faction to restrict AIM-120 usage.
* **[Mission Generation]** Added option to skip combat when fast forwarding, which progresses fast forward as if the combat did not occur. Simplified fast forward settings by consolidating "Fast forward mission to first contact" and "Player missions interrupt fast forward" into a single setting and expanding options for "Auto-resolve combat during fast-forward (WIP)".
* **[Mods]** F/A-18 E/F/G Super Hornet mod version updated to 2.3.
## Fixes
* **[Data]** Added/updated weapons data for F4E weapons such as AIM-7, AIM-9, AGM-12, AGM-45 and AGM-65.
* **[Campaign]** Do not allow aircraft from a captured control point to retreat if the captured control point has a damaged runway.
* **[Campaign]** Do not allow ground units to be transferred to LHAs, CVNs or off map spawns.
* **[Mission Generation]** Fixed aircraft not spawning correctly on CVNs, LHAs and FARPs.
# 11.1.1
Saves from 11.0.0 are compatible with 11.1.1. See Known Issues section for exceptions.
## Features/Improvements
* **[Engine]** Support for DCS 2.9.5.55918 including Heatblur F-4E and Polychop OH-58D Kiowa Warrior support.
* **[Engine]** Support for DCS 2.9.5.55300 including Heatblur F-4E.
## Fixes

1381
client/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -15,7 +15,7 @@
"@types/react": "^18.0.21",
"@types/react-dom": "^18.0.6",
"@types/react-redux": "^7.1.24",
"axios": "^1.7.4",
"axios": "^1.6.0",
"electron-window-state": "^5.0.3",
"esri-leaflet": "^3.0.8",
"leaflet": "^1.9.2",
@@ -74,7 +74,7 @@
"msw": "^1.2.2",
"react-scripts": "5.0.1",
"ts-node": "^10.9.1",
"wait-on": "^8.0.0"
"wait-on": "^6.0.1"
},
"jest": {
"transformIgnorePatterns": [

View File

@@ -9,7 +9,7 @@
project = "DCS Liberation"
copyright = "2024, DCS Liberation Team"
author = "DCS Liberation Team"
release = "12.0.0"
release = "11.1.0"
# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration

View File

@@ -1,5 +1,4 @@
"""Objective adjacency lists."""
from __future__ import annotations
from typing import Dict, Iterator, List, Optional, TYPE_CHECKING

View File

@@ -21,7 +21,6 @@ from ..sidc import (
)
if TYPE_CHECKING:
from game.callsigns.callsigngenerator import Callsign
from game.dcs.aircrafttype import AircraftType
from game.sim.gameupdateevents import GameUpdateEvents
from game.sim.simulationresults import SimulationResults
@@ -50,7 +49,6 @@ class Flight(SidcDescribable):
custom_name: Optional[str] = None,
cargo: Optional[TransferOrder] = None,
roster: Optional[FlightRoster] = None,
callsign: Optional[Callsign] = None,
) -> None:
self.id = uuid.uuid4()
self.package = package
@@ -71,8 +69,6 @@ class Flight(SidcDescribable):
# Only used by transport missions.
self.cargo = cargo
self.callsign = callsign
# Flight properties that can be set in the mission editor. This is used for
# things like HMD selection, ripple quantity, etc. Any values set here will take
# the place of the defaults defined by DCS.

View File

@@ -5,7 +5,6 @@ MissionPlanner. Those only plan basic information like the objective, aircraft
type, and the size of the flight. The FlightPlanBuilder is responsible for
generating the waypoints for the mission.
"""
from __future__ import annotations
import math

View File

@@ -30,7 +30,8 @@ LayoutT = TypeVar("LayoutT", bound=FormationLayout)
class FormationFlightPlan(LoiterFlightPlan[LayoutT], ABC):
@property
@abstractmethod
def package_speed_waypoints(self) -> set[FlightWaypoint]: ...
def package_speed_waypoints(self) -> set[FlightWaypoint]:
...
@property
def combat_speed_waypoints(self) -> set[FlightWaypoint]:
@@ -68,11 +69,13 @@ class FormationFlightPlan(LoiterFlightPlan[LayoutT], ABC):
@property
@abstractmethod
def join_time(self) -> datetime: ...
def join_time(self) -> datetime:
...
@property
@abstractmethod
def split_time(self) -> datetime: ...
def split_time(self) -> datetime:
...
def tot_for_waypoint(self, waypoint: FlightWaypoint) -> datetime | None:
if waypoint == self.layout.join:

View File

@@ -60,7 +60,8 @@ class IBuilder(ABC, Generic[FlightPlanT, LayoutT]):
return self.flight.departure.theater
@abstractmethod
def build(self, dump_debug_info: bool = False) -> FlightPlanT: ...
def build(self, dump_debug_info: bool = False) -> FlightPlanT:
...
@property
def package(self) -> Package:

View File

@@ -30,7 +30,8 @@ class LoiterFlightPlan(StandardFlightPlan[LayoutT], ABC):
@property
@abstractmethod
def push_time(self) -> datetime: ...
def push_time(self) -> datetime:
...
def depart_time_for_waypoint(self, waypoint: FlightWaypoint) -> datetime | None:
if waypoint == self.layout.hold:

View File

@@ -14,4 +14,5 @@ class UiZone:
class UiZoneDisplay(abc.ABC):
@abc.abstractmethod
def ui_zone(self) -> UiZone: ...
def ui_zone(self) -> UiZone:
...

View File

@@ -57,12 +57,14 @@ class FlightState(ABC):
@property
@abstractmethod
def cancelable(self) -> bool: ...
def cancelable(self) -> bool:
...
@abstractmethod
def on_game_tick(
self, events: GameUpdateEvents, time: datetime, duration: timedelta
) -> None: ...
) -> None:
...
@property
def in_flight(self) -> bool:
@@ -93,14 +95,17 @@ class FlightState(ABC):
@property
@abstractmethod
def is_waiting_for_start(self) -> bool: ...
def is_waiting_for_start(self) -> bool:
...
@abstractmethod
def estimate_position(self) -> Point: ...
def estimate_position(self) -> Point:
...
@property
@abstractmethod
def spawn_type(self) -> StartType: ...
def spawn_type(self) -> StartType:
...
def a2a_commit_region(self) -> Optional[ThreatPoly]:
return None

View File

@@ -67,13 +67,16 @@ class InFlight(FlightState, ABC):
)
@abstractmethod
def estimate_position(self) -> Point: ...
def estimate_position(self) -> Point:
...
@abstractmethod
def estimate_altitude(self) -> tuple[Distance, str]: ...
def estimate_altitude(self) -> tuple[Distance, str]:
...
@abstractmethod
def estimate_speed(self) -> Speed: ...
def estimate_speed(self) -> Speed:
...
def estimate_fuel_at_current_waypoint(self) -> float:
initial_fuel = super().estimate_fuel()

View File

@@ -8,9 +8,6 @@ from .atdeparture import AtDeparture
from .taxi import Taxi
from ..starttype import StartType
from game.settings.settings import FastForwardStopCondition
if TYPE_CHECKING:
from game.ato.flight import Flight
from game.settings import Settings
@@ -40,8 +37,7 @@ class StartUp(AtDeparture):
def should_halt_sim(self) -> bool:
if (
self.flight.client_count > 0
and self.settings.fast_forward_stop_condition
== FastForwardStopCondition.PLAYER_STARTUP
and self.settings.player_mission_interrupts_sim_at is StartType.COLD
):
logging.info(
f"Interrupting simulation because {self.flight} has players and has "

View File

@@ -9,8 +9,6 @@ from .navigating import Navigating
from ..starttype import StartType
from ...utils import LBS_TO_KG
from game.settings.settings import FastForwardStopCondition
if TYPE_CHECKING:
from game.ato.flight import Flight
from game.settings import Settings
@@ -47,8 +45,7 @@ class Takeoff(AtDeparture):
def should_halt_sim(self) -> bool:
if (
self.flight.client_count > 0
and self.settings.fast_forward_stop_condition
== FastForwardStopCondition.PLAYER_TAKEOFF
and self.settings.player_mission_interrupts_sim_at is StartType.RUNWAY
):
logging.info(
f"Interrupting simulation because {self.flight} has players and has "

View File

@@ -8,8 +8,6 @@ from .atdeparture import AtDeparture
from .takeoff import Takeoff
from ..starttype import StartType
from game.settings.settings import FastForwardStopCondition
if TYPE_CHECKING:
from game.ato.flight import Flight
from game.settings import Settings
@@ -39,8 +37,7 @@ class Taxi(AtDeparture):
def should_halt_sim(self) -> bool:
if (
self.flight.client_count > 0
and self.settings.fast_forward_stop_condition
== FastForwardStopCondition.PLAYER_TAXI
and self.settings.player_mission_interrupts_sim_at is StartType.WARM
):
logging.info(
f"Interrupting simulation because {self.flight} has players and has "

View File

@@ -9,20 +9,26 @@ if TYPE_CHECKING:
class IFlightRoster(ABC):
@abstractmethod
def iter_pilots(self) -> Iterator[Pilot | None]: ...
def iter_pilots(self) -> Iterator[Pilot | None]:
...
@abstractmethod
def pilot_at(self, idx: int) -> Pilot | None: ...
def pilot_at(self, idx: int) -> Pilot | None:
...
@property
@abstractmethod
def max_size(self) -> int: ...
def max_size(self) -> int:
...
@abstractmethod
def resize(self, new_size: int) -> None: ...
def resize(self, new_size: int) -> None:
...
@abstractmethod
def set_pilot(self, index: int, pilot: Optional[Pilot]) -> None: ...
def set_pilot(self, index: int, pilot: Optional[Pilot]) -> None:
...
@abstractmethod
def clear(self) -> None: ...
def clear(self) -> None:
...

View File

@@ -10,8 +10,6 @@ from dcs.unittype import FlyingType
from game.data.weapons import Pylon, Weapon, WeaponType
from game.dcs.aircrafttype import AircraftType
from game.factions.faction import Faction
from .flighttype import FlightType
if TYPE_CHECKING:
@@ -54,7 +52,6 @@ class Loadout:
weapon: Weapon,
pylon: Pylon,
date: datetime.date,
faction: Faction,
skip_types: Optional[Iterable[WeaponType]] = None,
) -> Optional[Weapon]:
if skip_types is None:
@@ -62,16 +59,14 @@ class Loadout:
for fallback in weapon.fallbacks:
if not pylon.can_equip(fallback):
continue
if not fallback.available_on(date, faction):
if not fallback.available_on(date):
continue
if fallback.weapon_group.type in skip_types:
continue
return fallback
return None
def degrade_for_date(
self, unit_type: AircraftType, date: datetime.date, faction: Faction
) -> Loadout:
def degrade_for_date(self, unit_type: AircraftType, date: datetime.date) -> Loadout:
if self.date is not None and self.date <= date:
return Loadout(self.name, self.pylons, self.date, self.is_custom)
@@ -80,9 +75,9 @@ class Loadout:
if weapon is None:
del new_pylons[pylon_number]
continue
if not weapon.available_on(date, faction):
if not weapon.available_on(date):
pylon = Pylon.for_aircraft(unit_type, pylon_number)
fallback = self._fallback_for(weapon, pylon, date, faction)
fallback = self._fallback_for(weapon, pylon, date)
if fallback is None:
del new_pylons[pylon_number]
else:
@@ -94,11 +89,11 @@ class Loadout:
# If the loadout was chosen explicitly by the user, assume they know what
# they're doing. They may be coordinating buddy-lase.
if not loadout.is_custom:
loadout.replace_lgbs_if_no_tgp(unit_type, date, faction)
loadout.replace_lgbs_if_no_tgp(unit_type, date)
return loadout
def replace_lgbs_if_no_tgp(
self, unit_type: AircraftType, date: datetime.date, faction: Faction
self, unit_type: AircraftType, date: datetime.date
) -> None:
if self.has_weapon_of_type(WeaponType.TGP):
return
@@ -111,7 +106,7 @@ class Loadout:
if weapon is not None and weapon.weapon_group.type is WeaponType.LGB:
pylon = Pylon.for_aircraft(unit_type, pylon_number)
fallback = self._fallback_for(
weapon, pylon, date, faction, skip_types={WeaponType.LGB}
weapon, pylon, date, skip_types={WeaponType.LGB}
)
if fallback is None:
del new_pylons[pylon_number]

View File

@@ -1,5 +1,4 @@
"""Support for working with DCS group callsigns."""
import logging
import re
from typing import Any

View File

@@ -1,248 +0,0 @@
from __future__ import annotations
from abc import ABC
from dataclasses import dataclass
from enum import StrEnum
from collections import deque
from typing import Any, List, Optional
from dcs.country import Country
from dcs.countries import countries_by_name
from game.ato.flight import Flight
from game.ato.flighttype import FlightType
MAX_GROUP_ID = 99
class CallsignCategory(StrEnum):
AIR = "Air"
TANKERS = "Tankers"
AWACS = "AWACS"
GROUND_UNITS = "GroundUnits"
HELIPADS = "Helipad"
GRASS_AIRFIELDS = "GrassAirfield"
@dataclass(frozen=True)
class Callsign:
name: Optional[
str
] # Callsign name e.g. "Enfield" for western callsigns. None for eastern callsigns.
group_id: int # ID of the group e.g. 2 in Enfield-2-3 for western callsigns. First two digits of eastern callsigns.
unit_id: int # ID of the unit e.g. 3 in Enfield-2-3 for western callsigns. Last digit of eastern callsigns.
def __post_init__(self) -> None:
if self.group_id < 1 or self.group_id > MAX_GROUP_ID:
raise ValueError(
f"Invalid group ID {self.group_id}. Group IDs have to be between 1 and {MAX_GROUP_ID}."
)
if self.unit_id < 1 or self.unit_id > 9:
raise ValueError(
f"Invalid unit ID {self.unit_id}. Unit IDs have to be between 1 and 9."
)
def __str__(self) -> str:
if self.name is not None:
return f"{self.name}{self.group_id}{self.unit_id}"
else:
return str(self.group_id * 10 + self.unit_id)
def lead_callsign(self) -> Callsign:
return Callsign(self.name, self.group_id, 1)
def unit_callsign(self, unit_id: int) -> Callsign:
return Callsign(self.name, self.group_id, unit_id)
def group_name(self) -> str:
if self.name is not None:
return f"{self.name}-{self.group_id}"
else:
return str(self.lead_callsign())
def pydcs_dict(self, country: str) -> dict[Any, Any]:
country_obj = countries_by_name[country]()
for category in CallsignCategory:
if category in country_obj.callsign:
for index, name in enumerate(country_obj.callsign[category]):
if name == self.name:
return {
"name": str(self),
1: index + 1,
2: self.group_id,
3: self.unit_id,
}
raise ValueError(f"Could not find callsign {name} in {country}.")
class WesternGroupIdRegistry:
def __init__(self, country: Country, max_group_id: int = MAX_GROUP_ID):
self._names: dict[str, deque[int]] = {}
for category in CallsignCategory:
if category in country.callsign:
for name in country.callsign[category]:
self._names[name] = deque()
self._max_group_id = max_group_id
self.reset()
def reset(self) -> None:
for name in self._names:
self._names[name] = deque()
for i in range(
self._max_group_id, 0, -1
): # Put group IDs on FIFO queue so 1 gets popped first
self._names[name].appendleft(i)
def alloc_group_id(self, name: str) -> int:
return self._names[name].popleft()
def release_group_id(self, callsign: Callsign) -> None:
if callsign.name is None:
raise ValueError("Releasing eastern callsign")
self._names[callsign.name].appendleft(callsign.group_id)
class EasternGroupIdRegistry:
def __init__(self, max_group_id: int = MAX_GROUP_ID):
self._max_group_id = max_group_id
self._queue: deque[int] = deque()
self.reset()
def reset(self) -> None:
self._queue = deque()
for i in range(
self._max_group_id, 0, -1
): # Put group IDs on FIFO queue so 1 gets popped first
self._queue.appendleft(i)
def alloc_group_id(self) -> int:
return self._queue.popleft()
def release_group_id(self, callsign: Callsign) -> None:
self._queue.appendleft(callsign.group_id)
class RoundRobinNameAllocator:
def __init__(self, names: List[str]):
self.names = names
self._index = 0
def allocate(self) -> str:
this_index = self._index
if this_index == len(self.names) - 1:
self._index = 0
else:
self._index += 1
return self.names[this_index]
class FlightTypeNameAllocator:
def __init__(self, names: List[str]):
self.names = names
def allocate(self, flight: Flight) -> str:
index = self.FLIGHT_TYPE_LOOKUP.get(flight.flight_type, 0)
return self.names[index]
FLIGHT_TYPE_LOOKUP: dict[FlightType, int] = {
FlightType.TARCAP: 1,
FlightType.BARCAP: 1,
FlightType.INTERCEPTION: 1,
FlightType.SWEEP: 1,
FlightType.CAS: 2,
FlightType.ANTISHIP: 2,
FlightType.BAI: 2,
FlightType.STRIKE: 3,
FlightType.OCA_RUNWAY: 3,
FlightType.OCA_AIRCRAFT: 3,
FlightType.SEAD: 4,
FlightType.DEAD: 4,
FlightType.ESCORT: 5,
FlightType.AIR_ASSAULT: 6,
FlightType.TRANSPORT: 7,
FlightType.FERRY: 7,
}
class WesternFlightCallsignGenerator:
"""Generate western callsign for lead unit in a group"""
def __init__(self, country: str) -> None:
self._country = countries_by_name[country]()
self._group_id_registry = WesternGroupIdRegistry(self._country)
self._awacs_name_allocator = None
self._tankers_name_allocator = None
if CallsignCategory.AWACS in self._country.callsign:
self._awacs_name_allocator = RoundRobinNameAllocator(
self._country.callsign[CallsignCategory.AWACS]
)
if CallsignCategory.TANKERS in self._country.callsign:
self._tankers_name_allocator = RoundRobinNameAllocator(
self._country.callsign[CallsignCategory.TANKERS]
)
self._air_name_allocator = FlightTypeNameAllocator(
self._country.callsign[CallsignCategory.AIR]
)
def reset(self) -> None:
self._group_id_registry.reset()
def alloc_callsign(self, flight: Flight) -> Callsign:
if flight.flight_type == FlightType.AEWC:
if self._awacs_name_allocator is None:
raise ValueError(f"{self._country.name} does not have AWACs callsigns")
name = self._awacs_name_allocator.allocate()
elif flight.flight_type == FlightType.REFUELING:
if self._tankers_name_allocator is None:
raise ValueError(f"{self._country.name} does not have tanker callsigns")
name = self._tankers_name_allocator.allocate()
else:
name = self._air_name_allocator.allocate(flight)
group_id = self._group_id_registry.alloc_group_id(name)
return Callsign(name, group_id, 1)
def release_callsign(self, callsign: Callsign) -> None:
self._group_id_registry.release_group_id(callsign)
class EasternFlightCallsignGenerator:
"""Generate eastern callsign for lead unit in a group"""
def __init__(self) -> None:
self._group_id_registry = EasternGroupIdRegistry()
def reset(self) -> None:
self._group_id_registry.reset()
def alloc_callsign(self, flight: Flight) -> Callsign:
group_id = self._group_id_registry.alloc_group_id()
return Callsign(None, group_id, 1)
def release_callsign(self, callsign: Callsign) -> None:
self._group_id_registry.release_group_id(callsign)
class FlightCallsignGenerator:
def __init__(self, country: str):
self._generators: dict[
bool, WesternFlightCallsignGenerator | EasternFlightCallsignGenerator
] = {
True: WesternFlightCallsignGenerator(country),
False: EasternFlightCallsignGenerator(),
}
self._use_western_callsigns = countries_by_name[country]().use_western_callsigns
def reset(self) -> None:
self._generators[self._use_western_callsigns].reset()
def alloc_callsign(self, flight: Flight) -> Callsign:
return self._generators[self._use_western_callsigns].alloc_callsign(flight)
def release_callsign(self, callsign: Callsign) -> None:
self._generators[self._use_western_callsigns].release_callsign(callsign)

View File

@@ -14,10 +14,12 @@ class FactionRecommendation(ABC):
self.name = name
@abstractmethod
def register_campaign_specific_faction(self, factions: Factions) -> None: ...
def register_campaign_specific_faction(self, factions: Factions) -> None:
...
@abstractmethod
def get_faction(self, factions: Factions) -> Faction: ...
def get_faction(self, factions: Factions) -> Faction:
...
@staticmethod
def from_field(

View File

@@ -61,8 +61,6 @@ class MizCampaignLoader:
AirDefence.Hawk_ln.id,
AirDefence.S_75M_Volhov.id,
AirDefence.X_5p73_s_125_ln.id,
AirDefence.NASAMS_LN_B.id,
AirDefence.NASAMS_LN_C.id,
}
SHORT_RANGE_SAM_UNIT_TYPES = {

View File

@@ -7,7 +7,6 @@ from faker import Faker
from game.armedforces.armedforces import ArmedForces
from game.ato.airtaaskingorder import AirTaskingOrder
from game.callsigns.callsigngenerator import FlightCallsignGenerator
from game.campaignloader.defaultsquadronassigner import DefaultSquadronAssigner
from game.commander import TheaterCommander
from game.commander.missionscheduler import MissionScheduler
@@ -47,7 +46,6 @@ class Coalition:
self.air_wing = AirWing(player, game, self.faction)
self.armed_forces = ArmedForces(self.faction)
self.transfers = PendingTransfers(game, player)
self.callsign_generator = FlightCallsignGenerator(faction.country)
# Late initialized because the two coalitions in the game are mutually
# dependent, so must be both constructed before this property can be set.
@@ -165,8 +163,6 @@ class Coalition:
# is handled correctly.
self.transfers.perform_transfers()
self.callsign_generator.reset()
def preinit_turn_0(self) -> None:
"""Runs final Coalition initialization.

View File

@@ -2,7 +2,6 @@ from __future__ import annotations
from typing import Optional, TYPE_CHECKING
from game.callsigns.callsigngenerator import FlightCallsignGenerator
from game.theater import ControlPoint, MissionTarget, OffMapSpawn
from game.utils import nautical_miles
from ..ato.flight import Flight
@@ -27,7 +26,6 @@ class PackageBuilder:
closest_airfields: ClosestAirfields,
air_wing: AirWing,
laser_code_registry: LaserCodeRegistry,
callsign_generator: FlightCallsignGenerator,
flight_db: Database[Flight],
is_player: bool,
package_country: str,
@@ -40,7 +38,6 @@ class PackageBuilder:
self.package = Package(location, flight_db, auto_asap=asap)
self.air_wing = air_wing
self.laser_code_registry = laser_code_registry
self.callsign_generator = callsign_generator
self.start_type = start_type
def plan_flight(self, plan: ProposedFlight) -> bool:
@@ -74,7 +71,6 @@ class PackageBuilder:
member.assign_tgp_laser_code(
self.laser_code_registry.alloc_laser_code()
)
flight.callsign = self.callsign_generator.alloc_callsign(flight)
self.package.add_flight(flight)
return True
@@ -104,6 +100,4 @@ class PackageBuilder:
"""Returns any planned flights to the inventory."""
flights = list(self.package.flights)
for flight in flights:
if flight.callsign is not None:
self.callsign_generator.release_callsign(flight.callsign)
self.package.remove_flight(flight)

View File

@@ -142,7 +142,6 @@ class PackageFulfiller:
ObjectiveDistanceCache.get_closest_airfields(mission.location),
self.air_wing,
self.coalition.laser_code_registry,
self.coalition.callsign_generator,
self.flight_db,
self.is_player,
self.coalition.country_name,

View File

@@ -21,7 +21,8 @@ class FrontLineStanceTask(TheaterCommanderTask, ABC):
@property
@abstractmethod
def stance(self) -> CombatStance: ...
def stance(self) -> CombatStance:
...
@staticmethod
def management_allowed(state: TheaterState) -> bool:
@@ -48,7 +49,8 @@ class FrontLineStanceTask(TheaterCommanderTask, ABC):
@property
@abstractmethod
def have_sufficient_front_line_advantage(self) -> bool: ...
def have_sufficient_front_line_advantage(self) -> bool:
...
@property
def ground_force_balance(self) -> float:

View File

@@ -54,7 +54,8 @@ class PackagePlanningTask(TheaterCommanderTask, Generic[MissionTargetT]):
coalition.ato.add_package(self.package)
@abstractmethod
def propose_flights(self) -> None: ...
def propose_flights(self) -> None:
...
def propose_flight(
self,
@@ -117,9 +118,9 @@ class PackagePlanningTask(TheaterCommanderTask, Generic[MissionTargetT]):
target_ranges: list[
tuple[Union[IadsGroundObject, NavalGroundObject], Distance]
] = []
all_iads: Iterator[Union[IadsGroundObject, NavalGroundObject]] = (
itertools.chain(state.enemy_air_defenses, state.enemy_ships)
)
all_iads: Iterator[
Union[IadsGroundObject, NavalGroundObject]
] = itertools.chain(state.enemy_air_defenses, state.enemy_ships)
for target in all_iads:
distance = meters(target.distance_to(self.target))
if range_type is RangeType.Detection:

View File

@@ -12,4 +12,5 @@ if TYPE_CHECKING:
class TheaterCommanderTask(PrimitiveTask[TheaterState]):
@abstractmethod
def execute(self, coalition: Coalition) -> None: ...
def execute(self, coalition: Coalition) -> None:
...

View File

@@ -52,7 +52,6 @@ even though it is a primitive task used by many other tasks.
https://en.wikipedia.org/wiki/Hierarchical_task_network
"""
from __future__ import annotations
from datetime import datetime

View File

@@ -2,11 +2,11 @@ from __future__ import annotations
from pathlib import Path
import yaml
from typing import Any, ClassVar, Optional
from typing import Any, ClassVar
from dataclasses import dataclass
from datetime import timedelta
from dcs.task import OptAAMissileAttackRange
from game.data.units import UnitClass
from game.utils import Distance, feet, nautical_miles
@@ -115,25 +115,6 @@ class Cap:
)
@dataclass(frozen=True)
class Tactics:
#: Air-to-air missile attack range options
air_to_air_missile_attack_range: Optional[OptAAMissileAttackRange.Values]
#: Air defence units evade ARMs
air_defence_evades_anti_radiation_missiles: bool
@staticmethod
def from_dict(data: dict[str, Any]) -> Tactics:
return Tactics(
air_to_air_missile_attack_range=None,
air_defence_evades_anti_radiation_missiles=data.get(
"air_defence_evades_anti_radiation_missiles", False
),
)
@dataclass(frozen=True)
class Doctrine:
#: Name of the doctrine, used to assign a doctrine in a faction.
@@ -178,9 +159,6 @@ class Doctrine:
#: Doctrine for Fighter Sweep missions.
sweep: Sweep
#: Tactics options
tactics: Tactics
_by_name: ClassVar[dict[str, Doctrine]] = {}
_loaded: ClassVar[bool] = False
@@ -241,7 +219,6 @@ class Doctrine:
cas=Cas.from_dict(data["cas"]),
cap=Cap.from_dict(data["cap"]),
sweep=Sweep.from_dict(data["sweep"]),
tactics=Tactics.from_dict(data.get("tactics", {})),
)
)
cls._loaded = True

View File

@@ -14,8 +14,6 @@ from dcs.flyingunit import FlyingUnit
from dcs.weapons_data import weapon_ids
from game.dcs.aircrafttype import AircraftType
from game.factions.faction import Faction
PydcsWeapon = Any
PydcsWeaponAssignment = tuple[int, PydcsWeapon]
@@ -79,12 +77,8 @@ class Weapon:
WeaponGroup.load_all()
cls._loaded = True
def available_on(self, date: datetime.date, faction: Faction) -> bool:
def available_on(self, date: datetime.date) -> bool:
introduction_year = self.weapon_group.introduction_year
if self.weapon_group.name in faction.weapons_introduction_year_overrides:
introduction_year = faction.weapons_introduction_year_overrides[
self.weapon_group.name
]
if introduction_year is None:
return True
return date >= datetime.date(introduction_year, 1, 1)
@@ -249,9 +243,9 @@ class Pylon:
def make_pydcs_assignment(self, weapon: Weapon) -> PydcsWeaponAssignment:
return self.number, weapon.pydcs_data
def available_on(self, date: datetime.date, faction: Faction) -> Iterator[Weapon]:
def available_on(self, date: datetime.date) -> Iterator[Weapon]:
for weapon in self.allowed:
if weapon.available_on(date, faction):
if weapon.available_on(date):
yield weapon
@classmethod

View File

@@ -37,7 +37,6 @@ from game.radio.channels import (
PhantomChannelNamer,
HindChannelNamer,
HipChannelNamer,
KiowaChannelNamer,
)
from game.utils import (
Distance,
@@ -117,7 +116,6 @@ class RadioConfig:
"phantom": PhantomChannelNamer,
"hind": HindChannelNamer,
"hip": HipChannelNamer,
"kiowa": KiowaChannelNamer,
}[config.get("namer", "default")]

View File

@@ -60,9 +60,9 @@ class GroundUnitType(UnitType[Type[VehicleType]]):
reversed_heading: bool = False
_by_name: ClassVar[dict[str, GroundUnitType]] = {}
_by_unit_type: ClassVar[dict[type[VehicleType], list[GroundUnitType]]] = (
defaultdict(list)
)
_by_unit_type: ClassVar[
dict[type[VehicleType], list[GroundUnitType]]
] = defaultdict(list)
def __setstate__(self, state: dict[str, Any]) -> None:
# Update any existing models with new data on load.

View File

@@ -17,10 +17,12 @@ class LaserCodeConfig(ABC):
)
@abstractmethod
def iter_prop_ids(self) -> Iterator[str]: ...
def iter_prop_ids(self) -> Iterator[str]:
...
@abstractmethod
def property_dict_for_code(self, code: int) -> dict[str, int]: ...
def property_dict_for_code(self, code: int) -> dict[str, int]:
...
class SinglePropertyLaserCodeConfig(LaserCodeConfig):

View File

@@ -3,7 +3,6 @@ from __future__ import annotations
import itertools
import logging
from dataclasses import dataclass, field
import datetime
from functools import cached_property
from typing import Any, Dict, Iterator, List, Optional, TYPE_CHECKING, Type
@@ -119,13 +118,6 @@ class Faction:
#: both will use it.
unrestricted_satnav: bool = False
#: Overrides default weapons introduction years for faction. Maps names of
#: weapons groups to their introduction years.
weapons_introduction_year_overrides: Dict[str, int] = field(default_factory=dict)
#: Set to True if the faction has access to countermeasures (chaff and flares).
countermeasures_available: bool = True
def has_access_to_dcs_type(self, unit_type: Type[DcsUnitType]) -> bool:
# Vehicle and Ship Units
if any(unit_type == u.dcs_unit_type for u in self.accessible_units):
@@ -270,12 +262,6 @@ class Faction:
faction.unrestricted_satnav = json.get("unrestricted_satnav", False)
faction.weapons_introduction_year_overrides = json.get(
"weapons_introduction_year_overrides", {}
)
faction.countermeasures_available = json.get("countermeasures_available", True)
return faction
@property

View File

@@ -15,12 +15,15 @@ if TYPE_CHECKING:
class WaypointAction(ABC):
@abstractmethod
def describe(self) -> str: ...
def describe(self) -> str:
...
@abstractmethod
def update_state(
self, state: ActionState, time: datetime, duration: timedelta
) -> timedelta: ...
) -> timedelta:
...
@abstractmethod
def iter_tasks(self, ctx: TaskContext) -> Iterator[Task]: ...
def iter_tasks(self, ctx: TaskContext) -> Iterator[Task]:
...

View File

@@ -28,12 +28,14 @@ def point_at_heading(p: Point, heading: Heading, distance: Distance) -> Point:
class Prerequisite(ABC):
@abstractmethod
def is_satisfied(self) -> bool: ...
def is_satisfied(self) -> bool:
...
@abstractmethod
def describe_debug_info(
self, to_geojson: Callable[[BaseGeometry], dict[str, Any]]
) -> dict[str, Any]: ...
) -> dict[str, Any]:
...
class DistancePrerequisite(Prerequisite):

View File

@@ -11,7 +11,8 @@ WorldStateT = TypeVar("WorldStateT", bound="WorldState[Any]")
class WorldState(ABC, Generic[WorldStateT]):
@abstractmethod
def clone(self) -> WorldStateT: ...
def clone(self) -> WorldStateT:
...
class Task(Generic[WorldStateT]):
@@ -23,17 +24,18 @@ Method = Sequence[Task[WorldStateT]]
class PrimitiveTask(Task[WorldStateT], Generic[WorldStateT], ABC):
@abstractmethod
def preconditions_met(self, state: WorldStateT) -> bool: ...
def preconditions_met(self, state: WorldStateT) -> bool:
...
@abstractmethod
def apply_effects(self, state: WorldStateT) -> None: ...
def apply_effects(self, state: WorldStateT) -> None:
...
class CompoundTask(Task[WorldStateT], Generic[WorldStateT], ABC):
@abstractmethod
def each_valid_method(
self, state: WorldStateT
) -> Iterator[Method[WorldStateT]]: ...
def each_valid_method(self, state: WorldStateT) -> Iterator[Method[WorldStateT]]:
...
PrimitiveTaskT = TypeVar("PrimitiveTaskT", bound=PrimitiveTask[Any])

View File

@@ -10,11 +10,9 @@ class Information:
def __str__(self) -> str:
return "[{}][{}] {} {}".format(
(
self.timestamp.strftime("%Y-%m-%d %H:%M:%S")
if self.timestamp is not None
else ""
),
self.timestamp.strftime("%Y-%m-%d %H:%M:%S")
if self.timestamp is not None
else "",
self.turn,
self.title,
self.text,

View File

@@ -9,7 +9,9 @@ if TYPE_CHECKING:
class ILaserCodeRegistry(ABC):
@abstractmethod
def alloc_laser_code(self) -> LaserCode: ...
def alloc_laser_code(self) -> LaserCode:
...
@abstractmethod
def release_code(self, code: LaserCode) -> None: ...
def release_code(self, code: LaserCode) -> None:
...

View File

@@ -1,5 +1,4 @@
"""Logging APIs."""
import logging
import logging.config
import os

View File

@@ -6,7 +6,7 @@ from typing import Optional, TYPE_CHECKING
from dcs.flyingunit import FlyingUnit
from game.callsigns.callsign import create_group_callsign_from_unit
from game.callsigns import create_group_callsign_from_unit
if TYPE_CHECKING:
from game.ato import FlightType, FlightWaypoint, Package

View File

@@ -10,8 +10,7 @@ from dcs.unit import Skill
from dcs.unitgroup import FlyingGroup
from game.ato import Flight, FlightType
from game.callsigns.callsign import callsign_for_support_unit
from game.callsigns.callsigngenerator import Callsign, FlightCallsignGenerator
from game.callsigns import callsign_for_support_unit
from game.data.weapons import Pylon
from game.missiongenerator.logisticsgenerator import LogisticsGenerator
from game.missiongenerator.missiondata import AwacsInfo, MissionData, TankerInfo
@@ -116,8 +115,6 @@ class FlightGroupConfigurator:
self.flight.flight_plan.waypoints,
)
self.set_callsigns()
return FlightData(
package=self.flight.package,
aircraft_type=self.flight.unit_type,
@@ -245,11 +242,7 @@ class FlightGroupConfigurator:
loadout = member.loadout
if self.game.settings.restrict_weapons_by_date:
loadout = loadout.degrade_for_date(
self.flight.unit_type,
self.game.date,
self.flight.squadron.coalition.faction,
)
loadout = loadout.degrade_for_date(self.flight.unit_type, self.game.date)
for pylon_number, weapon in loadout.pylons.items():
if weapon is None:
@@ -276,17 +269,3 @@ class FlightGroupConfigurator:
# our own tracking, so undo that.
# https://github.com/pydcs/dcs/commit/303a81a8e0c778599fe136dd22cb2ae8123639a6
unit.fuel = self.flight.unit_type.dcs_unit_type.fuel_max
def set_callsigns(self) -> None:
if self.flight.callsign is None:
return
for unit_index, unit in enumerate(self.group.units):
unit_callsign = self.flight.callsign.unit_callsign(unit_index + 1)
if (
unit_callsign.name is None
): # pydcs needs unit.callsign to be set for eastern callsigns
unit.callsign = str(unit_callsign) # type: ignore
else: # Use western callsign
unit.callsign_dict = unit_callsign.pydcs_dict(
country=self.flight.country
)

View File

@@ -0,0 +1,210 @@
from __future__ import annotations
import logging
from typing import List, TYPE_CHECKING, Tuple, Type
from dcs.mission import Mission, StartType
from dcs.planes import IL_78M, KC130, KC135MPRS, KC_135, PlaneType
from dcs.task import (
AWACS,
ActivateBeaconCommand,
MainTask,
Refueling,
SetImmortalCommand,
SetInvisibleCommand,
)
from dcs.unittype import UnitType
from game.ato import FlightType
from game.callsigns import callsign_for_support_unit
from game.naming import namegen
from game.radio.radios import RadioRegistry
from game.radio.tacan import TacanBand, TacanRegistry, TacanUsage
from game.utils import Heading
from .airconflictdescription import AirConflictDescription
from .missiondata import AwacsInfo, MissionData, TankerInfo
if TYPE_CHECKING:
from game import Game
TANKER_DISTANCE = 15000
TANKER_ALT = 4572
TANKER_HEADING_OFFSET = 45
AWACS_DISTANCE = 150000
AWACS_ALT = 13000
class AirSupportGenerator:
def __init__(
self,
mission: Mission,
conflict: AirConflictDescription,
game: Game,
radio_registry: RadioRegistry,
tacan_registry: TacanRegistry,
mission_data: MissionData,
) -> None:
self.mission = mission
self.conflict = conflict
self.game = game
self.radio_registry = radio_registry
self.tacan_registry = tacan_registry
self.mission_data = mission_data
@classmethod
def support_tasks(cls) -> List[Type[MainTask]]:
return [Refueling, AWACS]
@staticmethod
def _get_tanker_params(unit_type: Type[UnitType]) -> Tuple[int, int]:
if unit_type is KC130:
return TANKER_ALT - 500, 596
elif unit_type is KC_135:
return TANKER_ALT, 770
elif unit_type is KC135MPRS:
return TANKER_ALT + 500, 596
return TANKER_ALT, 574
def generate(self) -> None:
player_cp = (
self.conflict.blue_cp
if self.conflict.blue_cp.captured
else self.conflict.red_cp
)
country = self.mission.country(self.game.blue.country_name)
if not self.game.settings.disable_legacy_tanker:
fallback_tanker_number = 0
for i, tanker_unit_type in enumerate(
self.game.faction_for(player=True).tankers
):
unit_type = tanker_unit_type.dcs_unit_type
if not issubclass(unit_type, PlaneType):
logging.warning(f"Refueling aircraft {unit_type} must be a plane")
continue
# TODO: Make loiter altitude a property of the unit type.
alt, airspeed = self._get_tanker_params(tanker_unit_type.dcs_unit_type)
freq = self.radio_registry.alloc_uhf()
tacan = self.tacan_registry.alloc_for_band(
TacanBand.Y, TacanUsage.AirToAir
)
tanker_heading = Heading.from_degrees(
self.conflict.red_cp.position.heading_between_point(
self.conflict.blue_cp.position
)
+ TANKER_HEADING_OFFSET * i
)
tanker_position = player_cp.position.point_from_heading(
tanker_heading.degrees, TANKER_DISTANCE
)
tanker_group = self.mission.refuel_flight(
country=country,
name=namegen.next_tanker_name(country, tanker_unit_type),
airport=None,
plane_type=unit_type,
position=tanker_position,
altitude=alt,
race_distance=58000,
frequency=freq.mhz,
start_type=StartType.Warm,
speed=airspeed,
tacanchannel=str(tacan),
)
tanker_group.set_frequency(freq.mhz)
callsign = callsign_for_support_unit(tanker_group)
tacan_callsign = {
"Texaco": "TEX",
"Arco": "ARC",
"Shell": "SHL",
}.get(callsign)
if tacan_callsign is None:
# The dict above is all the callsigns currently in the game, but
# non-Western countries don't use the callsigns and instead just
# use numbers. It's possible that none of those nations have
# TACAN compatible refueling aircraft, but fallback just in
# case.
tacan_callsign = f"TK{fallback_tanker_number}"
fallback_tanker_number += 1
if tanker_unit_type != IL_78M:
# Override PyDCS tacan channel.
tanker_group.points[0].tasks.pop()
tanker_group.points[0].tasks.append(
ActivateBeaconCommand(
tacan.number,
tacan.band.value,
tacan_callsign,
True,
tanker_group.units[0].id,
True,
)
)
tanker_group.points[0].tasks.append(SetInvisibleCommand(True))
tanker_group.points[0].tasks.append(SetImmortalCommand(True))
self.mission_data.tankers.append(
TankerInfo(
group_name=str(tanker_group.name),
callsign=callsign,
variant=tanker_unit_type.display_name,
freq=freq,
tacan=tacan,
start_time=None,
end_time=None,
blue=True,
)
)
if not self.game.settings.disable_legacy_aewc:
possible_awacs = [
a
for a in self.game.faction_for(player=True).aircrafts
if a.capable_of(FlightType.AEWC)
]
if not possible_awacs:
logging.warning("No AWACS for faction")
return
awacs_unit = possible_awacs[0]
freq = self.radio_registry.alloc_uhf()
unit_type = awacs_unit.dcs_unit_type
if not issubclass(unit_type, PlaneType):
logging.warning(f"AWACS aircraft {unit_type} must be a plane")
return
awacs_flight = self.mission.awacs_flight(
country=country,
name=namegen.next_awacs_name(country),
plane_type=unit_type,
altitude=AWACS_ALT,
airport=None,
position=self.conflict.center.random_point_within(
AWACS_DISTANCE, AWACS_DISTANCE
),
frequency=freq.mhz,
start_type=StartType.Warm,
)
awacs_flight.set_frequency(freq.mhz)
awacs_flight.points[0].tasks.append(SetInvisibleCommand(True))
awacs_flight.points[0].tasks.append(SetImmortalCommand(True))
self.mission_data.awacs.append(
AwacsInfo(
group_name=str(awacs_flight.name),
callsign=callsign_for_support_unit(awacs_flight),
freq=freq,
depature_location=None,
start_time=None,
end_time=None,
blue=True,
)
)

View File

@@ -1,7 +1,6 @@
"""
Briefing generation logic
"""
from __future__ import annotations
import os
@@ -17,7 +16,7 @@ from game.radio.radios import RadioFrequency
from game.runways import RunwayData
from game.theater import ControlPoint, FrontLine
from .aircraft.flightdata import FlightData
from .missiondata import AwacsInfo, TankerInfo
from .airsupportgenerator import AwacsInfo, TankerInfo
from .flotgenerator import JtacInfo
if TYPE_CHECKING:

View File

@@ -27,7 +27,7 @@ from dcs.triggers import Event, TriggerOnce
from dcs.unit import Skill, Vehicle
from dcs.unitgroup import VehicleGroup
from game.callsigns.callsign import callsign_for_support_unit
from game.callsigns import callsign_for_support_unit
from game.data.units import UnitClass
from game.dcs.aircrafttype import AircraftType
from game.dcs.groundunittype import GroundUnitType

View File

@@ -22,7 +22,6 @@ https://forums.eagle.ru/showthread.php?t=206360 claims that kneeboard pages can
only be added per airframe, so PvP missions where each side have the same
aircraft will be able to see the enemy's kneeboard for the same airframe.
"""
import datetime
import math
import textwrap
@@ -47,7 +46,7 @@ from game.theater.bullseye import Bullseye
from game.utils import Distance, UnitSystem, meters, mps, pounds
from game.weather.weather import Weather
from .aircraft.flightdata import FlightData
from .missiondata import AwacsInfo, TankerInfo
from .airsupportgenerator import AwacsInfo, TankerInfo
from .briefinggenerator import CommInfo, JtacInfo, MissionInfoGenerator
from ..ato import Package

View File

@@ -24,6 +24,7 @@ from game.theater import Airfield
from game.theater.bullseye import Bullseye
from game.unitmap import UnitMap
from .airconflictdescription import AirConflictDescription
from .airsupportgenerator import AirSupportGenerator
from .briefinggenerator import BriefingGenerator, MissionInfoGenerator
from .cargoshipgenerator import CargoShipGenerator
from .convoygenerator import ConvoyGenerator
@@ -239,6 +240,17 @@ class MissionGenerator:
def generate_air_units(self, tgo_generator: TgoGenerator) -> None:
"""Generate the air units for the Operation"""
# Air Support (Tanker & Awacs)
air_support_generator = AirSupportGenerator(
self.mission,
AirConflictDescription.for_theater(self.game.theater),
self.game,
self.radio_registry,
self.tacan_registry,
self.mission_data,
)
air_support_generator.generate()
# Generate Aircraft Activity on the map
aircraft_generator = AircraftGenerator(
self.mission,
@@ -248,7 +260,7 @@ class MissionGenerator:
self.radio_registry,
self.tacan_registry,
self.unit_map,
mission_data=self.mission_data,
mission_data=air_support_generator.mission_data,
helipads=tgo_generator.helipads,
)
@@ -274,7 +286,7 @@ class MissionGenerator:
if not flight.client_units:
continue
flight.aircraft_type.assign_channels_for_flight(
flight, self.mission_data
flight, air_support_generator.mission_data
)
self.mission_data.briefing_data = aircraft_generator.briefing_data

View File

@@ -5,7 +5,6 @@ groups, statics, missile sites, and AA sites for the mission. Each of these
objectives is defined in the Theater by a TheaterGroundObject. These classes
create the pydcs groups and statics for those areas and add them to the mission.
"""
from __future__ import annotations
import logging

View File

@@ -48,10 +48,12 @@ class PurchaseAdapter(Generic[ItemType]):
return self.pending_delivery_quantity(item) < 0
@abstractmethod
def current_quantity_of(self, item: ItemType) -> int: ...
def current_quantity_of(self, item: ItemType) -> int:
...
@abstractmethod
def pending_delivery_quantity(self, item: ItemType) -> int: ...
def pending_delivery_quantity(self, item: ItemType) -> int:
...
def expected_quantity_next_turn(self, item: ItemType) -> int:
return self.current_quantity_of(item) + self.pending_delivery_quantity(item)
@@ -63,28 +65,36 @@ class PurchaseAdapter(Generic[ItemType]):
return self.can_sell(item) or self.has_pending_orders(item)
@abstractmethod
def can_sell(self, item: ItemType) -> bool: ...
def can_sell(self, item: ItemType) -> bool:
...
@abstractmethod
def do_purchase(self, item: ItemType) -> None: ...
def do_purchase(self, item: ItemType) -> None:
...
@abstractmethod
def do_cancel_purchase(self, item: ItemType) -> None: ...
def do_cancel_purchase(self, item: ItemType) -> None:
...
@abstractmethod
def do_sale(self, item: ItemType) -> None: ...
def do_sale(self, item: ItemType) -> None:
...
@abstractmethod
def do_cancel_sale(self, item: ItemType) -> None: ...
def do_cancel_sale(self, item: ItemType) -> None:
...
@abstractmethod
def price_of(self, item: ItemType) -> int: ...
def price_of(self, item: ItemType) -> int:
...
@abstractmethod
def name_of(self, item: ItemType, multiline: bool = False) -> str: ...
def name_of(self, item: ItemType, multiline: bool = False) -> str:
...
@abstractmethod
def unit_type_of(self, item: ItemType) -> UnitType[Any]: ...
def unit_type_of(self, item: ItemType) -> UnitType[Any]:
...
class AircraftPurchaseAdapter(PurchaseAdapter[Squadron]):

View File

@@ -437,16 +437,3 @@ class HipChannelNamer(ChannelNamer):
@classmethod
def name(cls) -> str:
return "hip"
class KiowaChannelNamer(ChannelNamer):
"""Channel namer for OH58D Kiowa Warrior"""
@staticmethod
def channel_name(radio_id: int, channel_id: int) -> str:
radio_name = ["UHF AM", "VHF AM", "VHF FM1", "VHF FM2"][radio_id - 1]
return f"{radio_name} Ch {channel_id}"
@classmethod
def name(cls) -> str:
return "kiowa"

View File

@@ -160,7 +160,6 @@ RADIOS: List[Radio] = [
Radio("AN/ARC-164", (RadioRange(MHz(225), MHz(400), MHz(1), Modulation.AM),)),
Radio("AN/ARC-186(V) AM", (RadioRange(MHz(116), MHz(152), MHz(1), Modulation.AM),)),
Radio("AN/ARC-186(V) FM", (RadioRange(MHz(30), MHz(76), MHz(1), Modulation.FM),)),
Radio("AN/ARC-201", (RadioRange(MHz(30), MHz(88), kHz(25), Modulation.FM),)),
Radio(
"AN/ARC-210",
(

View File

@@ -1,5 +1,4 @@
"""TACAN channel handling."""
from __future__ import annotations
import re

View File

@@ -1,5 +1,4 @@
"""Runway information and selection."""
from __future__ import annotations
import logging

View File

@@ -1,5 +1,4 @@
"""Tools for aiding in save compat removal after compatibility breaks."""
from collections.abc import Callable
from typing import TypeVar

View File

@@ -28,23 +28,6 @@ class AutoAtoBehavior(Enum):
Prefer = "Prefer player pilots"
@unique
class FastForwardStopCondition(Enum):
DISABLED = "Fast forward disabled"
FIRST_CONTACT = "First contact"
PLAYER_TAKEOFF = "Player takeoff time"
PLAYER_TAXI = "Player taxi time"
PLAYER_STARTUP = "Player startup time"
MANUAL = "Manual fast forward control"
@unique
class CombatResolutionMethod(Enum):
PAUSE = "Pause simulation"
RESOLVE = "Resolve combat"
SKIP = "Skip combat"
DIFFICULTY_PAGE = "Difficulty"
AI_DIFFICULTY_SECTION = "AI Difficulty"
@@ -190,6 +173,30 @@ class Settings:
"extremely incomplete so does not affect all weapons."
),
)
disable_legacy_aewc: bool = boolean_option(
"Spawn invulnerable, always-available AEW&C aircraft (deprecated)",
page=CAMPAIGN_MANAGEMENT_PAGE,
section=GENERAL_SECTION,
default=True,
invert=True,
detail=(
"If checked, an invulnerable friendly AEW&C aircraft that begins the "
"mission on station will be be spawned. This behavior will be removed in a "
"future release."
),
)
disable_legacy_tanker: bool = boolean_option(
"Spawn invulnerable, always-available tanker aircraft (deprecated)",
page=CAMPAIGN_MANAGEMENT_PAGE,
section=GENERAL_SECTION,
default=True,
invert=True,
detail=(
"If checked, an invulnerable friendly tanker aircraft that begins the "
"mission on station will be be spawned. This behavior will be removed in a "
"future release."
),
)
# Pilots and Squadrons
ai_pilot_levelling: bool = boolean_option(
"Allow AI pilot leveling",
@@ -310,7 +317,7 @@ class Settings:
"Tactical commander",
page=MISSION_GENERATOR_PAGE,
section=COMMANDERS_SECTION,
default=0,
default=1,
min=0,
max=100,
)
@@ -326,7 +333,7 @@ class Settings:
"Observer",
page=MISSION_GENERATOR_PAGE,
section=COMMANDERS_SECTION,
default=0,
default=1,
min=0,
max=100,
)
@@ -344,6 +351,19 @@ class Settings:
"run out of fuel when players would not."
),
)
fast_forward_to_first_contact: bool = boolean_option(
"Fast forward mission to first contact (WIP)",
page=MISSION_GENERATOR_PAGE,
section=GAMEPLAY_SECTION,
default=False,
detail=(
"If enabled, the mission will be generated at the point of first contact. "
"If you enable this option, you will not be able to create new flights "
'after pressing "TAKE OFF". Doing so will create an error the next time '
'you press "TAKE OFF". Save your game first if you want to make '
"modifications."
),
)
reload_pre_sim_checkpoint_on_abort: bool = boolean_option(
"Reset mission to pre-take off conditions on abort",
page=MISSION_GENERATOR_PAGE,
@@ -355,44 +375,37 @@ class Settings:
"your game after aborting take off."
),
)
fast_forward_stop_condition: FastForwardStopCondition = choices_option(
"Fast forward until",
player_mission_interrupts_sim_at: Optional[StartType] = choices_option(
"Player missions interrupt fast forward",
page=MISSION_GENERATOR_PAGE,
section=GAMEPLAY_SECTION,
default=FastForwardStopCondition.DISABLED,
default=None,
choices={
"No fast forward": FastForwardStopCondition.DISABLED,
"Player startup time": FastForwardStopCondition.PLAYER_STARTUP,
"Player taxi time": FastForwardStopCondition.PLAYER_TAXI,
"Player takeoff time": FastForwardStopCondition.PLAYER_TAKEOFF,
"First contact": FastForwardStopCondition.FIRST_CONTACT,
"Manual": FastForwardStopCondition.MANUAL,
"Never": None,
"At startup time": StartType.COLD,
"At taxi time": StartType.WARM,
"At takeoff time": StartType.RUNWAY,
},
detail=(
"Determines when fast forwarding stops: "
"No fast forward: disables fast forward. "
"Player startup time: fast forward until player startup time. "
"Player taxi time: fast forward until player taxi time. "
"Player takeoff time: fast forward until player takeoff time. "
"First contact: fast forward until first contact between blue and red units. "
"Manual: manually control fast forward. Show manual controls with --show-sim-speed-controls."
"Determines what player mission states will interrupt fast-forwarding to "
"first contact, if enabled. If never is selected player missions will not "
"impact simulation and player missions may be generated mid-flight. The "
"other options will cause the mission to be generated as soon as a player "
"mission reaches the set state or at first contact, whichever comes first."
),
)
combat_resolution_method: CombatResolutionMethod = choices_option(
"Resolve combat when fast forwarding by",
auto_resolve_combat: bool = boolean_option(
"Auto-resolve combat during fast-forward (WIP)",
page=MISSION_GENERATOR_PAGE,
section=GAMEPLAY_SECTION,
default=CombatResolutionMethod.PAUSE,
choices={
"Pause": CombatResolutionMethod.PAUSE,
"Resolving combat (WIP)": CombatResolutionMethod.RESOLVE,
"Skipping combat": CombatResolutionMethod.SKIP,
},
default=False,
detail=(
"Determines what happens when combat occurs when fast forwarding. "
"Pause: pause fast forward and generate mission. Fast forwarding may stop before the condition specified in the above setting. "
"Resolving combat (WIP): auto resolve combat. This method is very rudimentary and will result in large losses. "
"Skipping combat: skip combat as if it did not occur."
'Requires a "Player missions interrupt fast forward" setting other than '
'"Never" If enabled, aircraft entering combat during fast forward will have'
"their combat auto-resolved after a period of time. This allows the "
"simulation to advance further into the mission before requiring mission "
"generation, but simulation is currently very rudimentary so may result in "
"huge losses."
),
)
supercarrier: bool = boolean_option(

View File

@@ -10,7 +10,6 @@ from the output.
https://nso.nato.int/nso/nsdd/main/standards/ap-details/1912/EN
https://www.spatialillusions.com/milsymbol/docs/milsymbol-APP6d.html
"""
from __future__ import annotations
from abc import ABC, abstractmethod
@@ -331,15 +330,18 @@ class SymbolIdentificationCode:
class SidcDescribable(ABC):
@property
@abstractmethod
def standard_identity(self) -> StandardIdentity: ...
def standard_identity(self) -> StandardIdentity:
...
@property
@abstractmethod
def sidc_status(self) -> Status: ...
def sidc_status(self) -> Status:
...
@property
@abstractmethod
def symbol_set_and_entity(self) -> tuple[SymbolSet, Entity]: ...
def symbol_set_and_entity(self) -> tuple[SymbolSet, Entity]:
...
def sidc(self) -> SymbolIdentificationCode:
symbol_set, entity = self.symbol_set_and_entity

View File

@@ -10,7 +10,6 @@ from typing_extensions import TYPE_CHECKING
from game.ato.flightstate import (
Uninitialized,
)
from game.settings.settings import FastForwardStopCondition, CombatResolutionMethod
from .combat import CombatInitiator, FrozenCombat
from .gameupdateevents import GameUpdateEvents
from .simulationresults import SimulationResults
@@ -33,7 +32,7 @@ class AircraftSimulation:
def on_game_tick(
self, events: GameUpdateEvents, time: datetime, duration: timedelta
) -> None:
if not self._auto_resolve_combat() and self.combats:
if not self.game.settings.auto_resolve_combat and self.combats:
logging.error(
"Cannot resume simulation because aircraft are in combat and "
"auto-resolve is disabled"
@@ -43,13 +42,7 @@ class AircraftSimulation:
still_active = []
for combat in self.combats:
if combat.on_game_tick(
time,
duration,
self.results,
events,
self.game.settings.combat_resolution_method,
):
if combat.on_game_tick(time, duration, self.results, events):
events.end_combat(combat)
else:
still_active.append(combat)
@@ -68,7 +61,7 @@ class AircraftSimulation:
events.complete_simulation()
return
if not self._auto_resolve_combat() and self.combats:
if not self.game.settings.auto_resolve_combat and self.combats:
events.complete_simulation()
def set_initial_flight_states(self) -> None:
@@ -87,11 +80,3 @@ class AircraftSimulation:
)
for package in packages:
yield from package.flights
def _auto_resolve_combat(self) -> bool:
return (
self.game.settings.fast_forward_stop_condition
!= FastForwardStopCondition.DISABLED
and self.game.settings.combat_resolution_method
!= CombatResolutionMethod.PAUSE
)

View File

@@ -8,7 +8,6 @@ from typing import TYPE_CHECKING
from shapely.ops import unary_union
from game.ato.flightstate import InCombat, InFlight
from game.settings.settings import CombatResolutionMethod
from game.utils import dcs_to_shapely_point
from .joinablecombat import JoinableCombat
from .. import GameUpdateEvents
@@ -68,15 +67,7 @@ class AirCombat(JoinableCombat):
events: GameUpdateEvents,
time: datetime,
elapsed_time: timedelta,
resolution_method: CombatResolutionMethod,
) -> None:
if resolution_method is CombatResolutionMethod.SKIP:
for flight in self.flights:
assert isinstance(flight.state, InCombat)
flight.state.exit_combat(events, time, elapsed_time)
return
blue = []
red = []
for flight in self.flights:

View File

@@ -8,7 +8,6 @@ from typing import TYPE_CHECKING
from .frozencombat import FrozenCombat
from .. import GameUpdateEvents
from ...ato.flightstate import InCombat
from game.settings.settings import CombatResolutionMethod
if TYPE_CHECKING:
from game.ato import Flight
@@ -35,7 +34,6 @@ class AtIp(FrozenCombat):
events: GameUpdateEvents,
time: datetime,
elapsed_time: timedelta,
resolution_method: CombatResolutionMethod,
) -> None:
logging.debug(
f"{self.flight} attack on {self.flight.package.target} auto-resolved with "

View File

@@ -7,7 +7,6 @@ from datetime import datetime, timedelta
from typing import TYPE_CHECKING
from game.ato.flightstate import InCombat
from game.settings.settings import CombatResolutionMethod
from .frozencombat import FrozenCombat
from .. import GameUpdateEvents
@@ -44,14 +43,8 @@ class DefendingSam(FrozenCombat):
events: GameUpdateEvents,
time: datetime,
elapsed_time: timedelta,
resolution_method: CombatResolutionMethod,
) -> None:
assert isinstance(self.flight.state, InCombat)
if resolution_method is CombatResolutionMethod.SKIP:
self.flight.state.exit_combat(events, time, elapsed_time)
return
if random.random() >= 0.5:
logging.debug(f"Air defense combat auto-resolved with {self.flight} lost")
self.flight.kill(results, events)

View File

@@ -7,7 +7,6 @@ from datetime import datetime, timedelta
from typing import TYPE_CHECKING
from game.ato.flightstate import InCombat, InFlight
from game.settings.settings import CombatResolutionMethod
from .. import GameUpdateEvents
if TYPE_CHECKING:
@@ -27,11 +26,10 @@ class FrozenCombat(ABC):
duration: timedelta,
results: SimulationResults,
events: GameUpdateEvents,
resolution_method: CombatResolutionMethod,
) -> bool:
self.elapsed_time += duration
if self.elapsed_time >= self.freeze_duration:
self.resolve(results, events, time, self.elapsed_time, resolution_method)
self.resolve(results, events, time, self.elapsed_time)
return True
return False
@@ -42,17 +40,20 @@ class FrozenCombat(ABC):
events: GameUpdateEvents,
time: datetime,
elapsed_time: timedelta,
resolution_method: CombatResolutionMethod,
) -> None: ...
) -> None:
...
@abstractmethod
def because(self) -> str: ...
def because(self) -> str:
...
@abstractmethod
def describe(self) -> str: ...
def describe(self) -> str:
...
@abstractmethod
def iter_flights(self) -> Iterator[Flight]: ...
def iter_flights(self) -> Iterator[Flight]:
...
def update_flight_states(self) -> None:
for flight in self.iter_flights():

View File

@@ -18,7 +18,8 @@ class JoinableCombat(FrozenCombat, ABC):
self.flights = flights
@abstractmethod
def joinable_by(self, flight: Flight) -> bool: ...
def joinable_by(self, flight: Flight) -> bool:
...
def join(self, flight: Flight) -> None:
assert isinstance(flight.state, InFlight)

View File

@@ -65,7 +65,7 @@ class GameLoop:
self.start()
logging.info("Running sim to first contact")
while not self.completed:
self.tick(suppress_events=False)
self.tick(suppress_events=True)
def pause_and_generate_miz(self, output: Path) -> None:
self.pause()

View File

@@ -472,7 +472,8 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC):
@property
@abstractmethod
def heading(self) -> Heading: ...
def heading(self) -> Heading:
...
def __str__(self) -> str:
return self.name
@@ -593,7 +594,8 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC):
@property
@abstractmethod
def can_deploy_ground_units(self) -> bool: ...
def can_deploy_ground_units(self) -> bool:
...
@property
@abstractmethod
@@ -762,9 +764,6 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC):
def aircraft_retreat_destination(
self, squadron: Squadron
) -> Optional[ControlPoint]:
if not self.runway_is_operational():
return None
closest = ObjectiveDistanceCache.get_closest_airfields(self)
max_retreat_distance = squadron.aircraft.max_mission_range
# Skip the first airbase because that's the airbase we're retreating
@@ -878,7 +877,8 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC):
return None
@abstractmethod
def can_operate(self, aircraft: AircraftType) -> bool: ...
def can_operate(self, aircraft: AircraftType) -> bool:
...
def unclaimed_parking(self) -> int:
return self.total_aircraft_parking - self.allocated_aircraft().total
@@ -889,7 +889,8 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC):
theater: ConflictTheater,
conditions: Conditions,
dynamic_runways: Dict[str, RunwayData],
) -> RunwayData: ...
) -> RunwayData:
...
def stub_runway_data(self) -> RunwayData:
return RunwayData(
@@ -906,11 +907,13 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC):
@property
@abstractmethod
def runway_is_destroyable(self) -> bool: ...
def runway_is_destroyable(self) -> bool:
...
@property
@abstractmethod
def runway_status(self) -> RunwayStatus: ...
def runway_status(self) -> RunwayStatus:
...
@abstractmethod
def describe_runway_status(self) -> str | None:
@@ -1068,11 +1071,13 @@ class ControlPoint(MissionTarget, SidcDescribable, ABC):
@property
@abstractmethod
def category(self) -> str: ...
def category(self) -> str:
...
@property
@abstractmethod
def status(self) -> ControlPointStatus: ...
def status(self) -> ControlPointStatus:
...
class Airfield(ControlPoint):

View File

@@ -107,7 +107,7 @@ class FrontLine(MissionTarget):
yield from [
FlightType.CAS,
FlightType.AEWC,
FlightType.REFUELING,
FlightType.REFUELING
# TODO: FlightType.TROOP_TRANSPORT
# TODO: FlightType.EVAC
]

View File

@@ -8,7 +8,7 @@ from enum import Enum, auto
from typing import Dict, Iterator, List, Optional, Set, Tuple
from .conflicttheater import ConflictTheater
from .controlpoint import ControlPoint, ControlPointType
from .controlpoint import ControlPoint
class NoPathError(RuntimeError):
@@ -47,9 +47,9 @@ class TransitConnection(Enum):
class TransitNetwork:
def __init__(self) -> None:
self.nodes: Dict[ControlPoint, Dict[ControlPoint, TransitConnection]] = (
defaultdict(dict)
)
self.nodes: Dict[
ControlPoint, Dict[ControlPoint, TransitConnection]
] = defaultdict(dict)
def has_destinations(self, control_point: ControlPoint) -> bool:
return bool(self.nodes[control_point])
@@ -160,14 +160,7 @@ class TransitNetworkBuilder:
self.airports: Set[ControlPoint] = {
cp
for cp in self.control_points
if cp.is_friendly(for_player)
and cp.runway_is_operational()
and cp.cptype
not in [
ControlPointType.LHA_GROUP,
ControlPointType.AIRCRAFT_CARRIER_GROUP,
ControlPointType.OFF_MAP,
] # TransitNetwork is for ground units, so do not consider LHAs, CVNs or off map spawns.
if cp.is_friendly(for_player) and cp.runway_is_operational()
}
def build(self) -> TransitNetwork:

View File

@@ -29,7 +29,6 @@ transports and processing the turn's transit actions.
Routing is handled by TransitNetwork.
"""
from __future__ import annotations
import logging
@@ -495,9 +494,9 @@ TransportType = TypeVar("TransportType", bound=MultiGroupTransport)
class TransportMap(Generic[TransportType]):
def __init__(self) -> None:
# Dict of origin -> destination -> transport.
self.transports: dict[ControlPoint, dict[ControlPoint, TransportType]] = (
defaultdict(dict)
)
self.transports: dict[
ControlPoint, dict[ControlPoint, TransportType]
] = defaultdict(dict)
def create_transport(
self, origin: ControlPoint, destination: ControlPoint

View File

@@ -1,5 +1,4 @@
"""Maps generated units back to their Liberation types."""
from __future__ import annotations
import itertools

View File

@@ -1,8 +1,8 @@
from pathlib import Path
MAJOR_VERSION = 12
MINOR_VERSION = 0
MAJOR_VERSION = 11
MINOR_VERSION = 1
MICRO_VERSION = 0
VERSION_NUMBER = ".".join(str(v) for v in (MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION))

View File

@@ -101,7 +101,8 @@ class Weather(ABC):
@property
@abstractmethod
def archetype(self) -> WeatherArchetype: ...
def archetype(self) -> WeatherArchetype:
...
@property
def pressure_adjustment(self) -> float:

View File

@@ -25,7 +25,8 @@ class WeibullWindSpeedParameters:
class WindSpeedGenerator(ABC):
@abstractmethod
def random_wind(self) -> WindConditions: ...
def random_wind(self) -> WindConditions:
...
@staticmethod
def from_data(data: dict[str, Any]) -> WindSpeedGenerator:

View File

@@ -940,63 +940,63 @@ class A_4E_C(PlaneType):
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
1,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
1,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
1,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
1,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M257_IL,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = (
1,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M274_TP_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = (
1,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice = (
1,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_61_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice = (
1,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_WTU_1_B_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice,
)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
1,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_M156_SM,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
1,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_1_HE,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
1,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_5_HEAT,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
1,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
1,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
1,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
1,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
LAU3_WP61 = (1, Weapons.LAU3_WP61)
LAU3_WP1B = (1, Weapons.LAU3_WP1B)
@@ -1069,15 +1069,15 @@ class A_4E_C(PlaneType):
)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
2,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_M156_SM,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
2,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_1_HE,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
2,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_5_HEAT,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
)
_2_x_LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts__M156__Wht_Phos__TER__ = (
2,
@@ -1093,15 +1093,15 @@ class A_4E_C(PlaneType):
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
)
_2_x_LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts__M156__Wht_Phos__TER__ = (
2,
@@ -1117,35 +1117,35 @@ class A_4E_C(PlaneType):
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M257_IL,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M274_TP_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_61_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_WTU_1_B_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice,
)
_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE__TER__ = (
2,
@@ -1181,7 +1181,7 @@ class A_4E_C(PlaneType):
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
2,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_MK_71__HE_FRAG__TER__ = (
2,
@@ -1329,15 +1329,15 @@ class A_4E_C(PlaneType):
Fuel_Tank_150_gallons__EMPTY_ = (3, WeaponsA4EC.Fuel_Tank_150_gallons__EMPTY_)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
3,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_M156_SM,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
3,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_1_HE,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
3,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_5_HEAT,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
)
_2_x_LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts__M156__Wht_Phos__TER_ = (
3,
@@ -1365,15 +1365,15 @@ class A_4E_C(PlaneType):
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
)
_2_x_LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts__M156__Wht_Phos__TER_ = (
3,
@@ -1405,43 +1405,43 @@ class A_4E_C(PlaneType):
LAU3_WP1B = (3, Weapons.LAU3_WP1B)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
3,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
3,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M257_IL,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M274_TP_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_61_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_WTU_1_B_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice,
)
_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE__TER_ = (
3,
@@ -1509,7 +1509,7 @@ class A_4E_C(PlaneType):
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
3,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_MK_71__HE_FRAG__TER_ = (
3,
@@ -1706,15 +1706,15 @@ class A_4E_C(PlaneType):
)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
4,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_M156_SM,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
4,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_1_HE,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
4,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_5_HEAT,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
)
_2_x_LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts__M156__Wht_Phos__TER___ = (
4,
@@ -1730,15 +1730,15 @@ class A_4E_C(PlaneType):
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
)
_2_x_LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts__M156__Wht_Phos__TER___ = (
4,
@@ -1754,35 +1754,35 @@ class A_4E_C(PlaneType):
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M257_IL,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M274_TP_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_61_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_WTU_1_B_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice,
)
_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE__TER___ = (
4,
@@ -1818,7 +1818,7 @@ class A_4E_C(PlaneType):
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
4,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_MK_71__HE_FRAG__TER___ = (
4,
@@ -1984,63 +1984,63 @@ class A_4E_C(PlaneType):
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M257_IL,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M274_TP_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_61_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_WTU_1_B_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice,
)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
5,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_M156_SM,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
5,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_1_HE,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
)
LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
5,
Weapons.LAU_3___19_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_5_HEAT,
Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
5,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
LAU3_WP61 = (5, Weapons.LAU3_WP61)
LAU3_WP1B = (5, Weapons.LAU3_WP1B)

View File

@@ -97,40 +97,32 @@ class VSN_F104C(PlaneType):
4,
Weapons.BL_755_CBU___450kg__147_Frag_Pen_bomblets,
)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
4,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__ = (
4,
Weapons.APU_68___S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_,
Weapons.S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__,
)
B_8M1___20_S_8OFP2 = (4, Weapons.B_8M1___20_S_8OFP2)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange = (
4,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange,
)
Mk_82_Snakeye___500lb_GP_Bomb_HD = (4, Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD)
Mk_83___1000lb_GP_Bomb_LD = (4, Weapons.Mk_83___1000lb_GP_Bomb_LD)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
4,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
4,
Weapons.BRU_33_2_x_LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
4,
Weapons.BRU_33_2_x_LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
4,
Weapons.BRU_33_2_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
AIM_9L_Sidewinder_IR_AAM = (4, Weapons.AIM_9L_Sidewinder_IR_AAM)
AIM_9B_Sidewinder_IR_AAM = (4, Weapons.AIM_9B_Sidewinder_IR_AAM)
@@ -142,7 +134,7 @@ class VSN_F104C(PlaneType):
)
BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
4,
Weapons.BRU_33_2_x_LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_33_with_2_x_Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = (
4,
@@ -158,7 +150,7 @@ class VSN_F104C(PlaneType):
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
4,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_42_with_3_x_Mk_81___250lb_GP_Bombs_LD = (
4,
@@ -197,40 +189,32 @@ class VSN_F104C(PlaneType):
8,
Weapons.BL_755_CBU___450kg__147_Frag_Pen_bomblets,
)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
8,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__ = (
8,
Weapons.APU_68___S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_,
Weapons.S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__,
)
B_8M1___20_S_8OFP2 = (8, Weapons.B_8M1___20_S_8OFP2)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange = (
8,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange,
)
Mk_82_Snakeye___500lb_GP_Bomb_HD = (8, Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD)
Mk_83___1000lb_GP_Bomb_LD = (8, Weapons.Mk_83___1000lb_GP_Bomb_LD)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
8,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
8,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
8,
Weapons.BRU_33_2_x_LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
8,
Weapons.BRU_33_2_x_LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
8,
Weapons.BRU_33_2_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
AIM_9L_Sidewinder_IR_AAM = (8, Weapons.AIM_9L_Sidewinder_IR_AAM)
AIM_9B_Sidewinder_IR_AAM = (8, Weapons.AIM_9B_Sidewinder_IR_AAM)
@@ -242,7 +226,7 @@ class VSN_F104C(PlaneType):
)
BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
8,
Weapons.BRU_33_2_x_LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_33_with_2_x_Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = (
8,
@@ -258,7 +242,7 @@ class VSN_F104C(PlaneType):
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
8,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_42_with_3_x_Mk_81___250lb_GP_Bombs_LD = (
8,
@@ -350,40 +334,32 @@ class VSN_F104G(PlaneType):
4,
Weapons.BL_755_CBU___450kg__147_Frag_Pen_bomblets,
)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
4,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__ = (
4,
Weapons.APU_68___S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_,
Weapons.S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__,
)
B_8M1___20_S_8OFP2 = (4, Weapons.B_8M1___20_S_8OFP2)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange = (
4,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange,
)
Mk_82_Snakeye___500lb_GP_Bomb_HD = (4, Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD)
Mk_83___1000lb_GP_Bomb_LD = (4, Weapons.Mk_83___1000lb_GP_Bomb_LD)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
4,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
4,
Weapons.BRU_33_2_x_LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
4,
Weapons.BRU_33_2_x_LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
4,
Weapons.BRU_33_2_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
AIM_9L_Sidewinder_IR_AAM = (4, Weapons.AIM_9L_Sidewinder_IR_AAM)
AIM_9B_Sidewinder_IR_AAM = (4, Weapons.AIM_9B_Sidewinder_IR_AAM)
@@ -395,7 +371,7 @@ class VSN_F104G(PlaneType):
)
BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
4,
Weapons.BRU_33_2_x_LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_33_with_2_x_Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = (
4,
@@ -411,7 +387,7 @@ class VSN_F104G(PlaneType):
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
4,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_42_with_3_x_Mk_81___250lb_GP_Bombs_LD = (
4,
@@ -459,40 +435,32 @@ class VSN_F104G(PlaneType):
8,
Weapons.BL_755_CBU___450kg__147_Frag_Pen_bomblets,
)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
8,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__ = (
8,
Weapons.APU_68___S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_,
Weapons.S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__,
)
B_8M1___20_S_8OFP2 = (8, Weapons.B_8M1___20_S_8OFP2)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange = (
8,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange,
)
Mk_82_Snakeye___500lb_GP_Bomb_HD = (8, Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD)
Mk_83___1000lb_GP_Bomb_LD = (8, Weapons.Mk_83___1000lb_GP_Bomb_LD)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
8,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
8,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
8,
Weapons.BRU_33_2_x_LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
8,
Weapons.BRU_33_2_x_LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
8,
Weapons.BRU_33_2_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
AIM_9L_Sidewinder_IR_AAM = (8, Weapons.AIM_9L_Sidewinder_IR_AAM)
AIM_9B_Sidewinder_IR_AAM = (8, Weapons.AIM_9B_Sidewinder_IR_AAM)
@@ -504,7 +472,7 @@ class VSN_F104G(PlaneType):
)
BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
8,
Weapons.BRU_33_2_x_LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_33_with_2_x_Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = (
8,
@@ -520,7 +488,7 @@ class VSN_F104G(PlaneType):
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
8,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_42_with_3_x_Mk_81___250lb_GP_Bombs_LD = (
8,
@@ -609,10 +577,6 @@ class VSN_F104S(PlaneType):
AIM_9M_Sidewinder_IR_AAM = (3, Weapons.AIM_9M_Sidewinder_IR_AAM)
AIM_9P_Sidewinder_IR_AAM = (3, Weapons.AIM_9P_Sidewinder_IR_AAM)
AIM_9P5_Sidewinder_IR_AAM = (3, Weapons.AIM_9P5_Sidewinder_IR_AAM)
AIM_7E_2_Sparrow_Semi_Active_Radar = (
3,
Weapons.AIM_7E_2_Sparrow_Semi_Active_Radar,
)
AIM_7F_Sparrow_Semi_Active_Radar = (3, Weapons.AIM_7F_Sparrow_Semi_Active_Radar)
class Pylon4:
@@ -658,10 +622,6 @@ class VSN_F104S(PlaneType):
AIM_9M_Sidewinder_IR_AAM = (9, Weapons.AIM_9M_Sidewinder_IR_AAM)
AIM_9P_Sidewinder_IR_AAM = (9, Weapons.AIM_9P_Sidewinder_IR_AAM)
AIM_9P5_Sidewinder_IR_AAM = (9, Weapons.AIM_9P5_Sidewinder_IR_AAM)
AIM_7E_2_Sparrow_Semi_Active_Radar = (
9,
Weapons.AIM_7E_2_Sparrow_Semi_Active_Radar,
)
AIM_7F_Sparrow_Semi_Active_Radar = (9, Weapons.AIM_7F_Sparrow_Semi_Active_Radar)
class Pylon10:
@@ -757,19 +717,11 @@ class VSN_F104S_AG(PlaneType):
Weapons.BL_755_CBU___450kg__147_Frag_Pen_bomblets,
)
CBU_97___10_x_SFW_Cluster_Bomb = (3, Weapons.CBU_97___10_x_SFW_Cluster_Bomb)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
3,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__ = (
3,
Weapons.APU_68___S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_,
Weapons.S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__,
)
B_8M1___20_S_8OFP2 = (3, Weapons.B_8M1___20_S_8OFP2)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange = (
3,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange,
)
AIM_9L_Sidewinder_IR_AAM = (3, Weapons.AIM_9L_Sidewinder_IR_AAM)
AIM_9B_Sidewinder_IR_AAM = (3, Weapons.AIM_9B_Sidewinder_IR_AAM)
AGM_88C_HARM___High_Speed_Anti_Radiation_Missile_ = (
@@ -802,40 +754,32 @@ class VSN_F104S_AG(PlaneType):
Weapons.BL_755_CBU___450kg__147_Frag_Pen_bomblets,
)
CBU_97___10_x_SFW_Cluster_Bomb = (4, Weapons.CBU_97___10_x_SFW_Cluster_Bomb)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
4,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__ = (
4,
Weapons.APU_68___S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_,
Weapons.S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__,
)
B_8M1___20_S_8OFP2 = (4, Weapons.B_8M1___20_S_8OFP2)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange = (
4,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange,
)
Mk_82_Snakeye___500lb_GP_Bomb_HD = (4, Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD)
Mk_83___1000lb_GP_Bomb_LD = (4, Weapons.Mk_83___1000lb_GP_Bomb_LD)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
4,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
4,
Weapons.BRU_33_2_x_LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
4,
Weapons.BRU_33_2_x_LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
4,
Weapons.BRU_33_2_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
AIM_9M_Sidewinder_IR_AAM = (4, Weapons.AIM_9M_Sidewinder_IR_AAM)
AIM_9L_Sidewinder_IR_AAM = (4, Weapons.AIM_9L_Sidewinder_IR_AAM)
@@ -848,7 +792,7 @@ class VSN_F104S_AG(PlaneType):
)
BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
4,
Weapons.BRU_33_2_x_LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_33_with_2_x_Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = (
4,
@@ -864,7 +808,7 @@ class VSN_F104S_AG(PlaneType):
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
4,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_42_with_3_x_Mk_81___250lb_GP_Bombs_LD = (
4,
@@ -923,40 +867,32 @@ class VSN_F104S_AG(PlaneType):
Weapons.BL_755_CBU___450kg__147_Frag_Pen_bomblets,
)
CBU_97___10_x_SFW_Cluster_Bomb = (8, Weapons.CBU_97___10_x_SFW_Cluster_Bomb)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
8,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__ = (
8,
Weapons.APU_68___S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_,
Weapons.S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__,
)
B_8M1___20_S_8OFP2 = (8, Weapons.B_8M1___20_S_8OFP2)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange = (
8,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange,
)
Mk_82_Snakeye___500lb_GP_Bomb_HD = (8, Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD)
Mk_83___1000lb_GP_Bomb_LD = (8, Weapons.Mk_83___1000lb_GP_Bomb_LD)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
8,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
8,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
8,
Weapons.BRU_33_2_x_LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
8,
Weapons.BRU_33_2_x_LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.BRU_33_with_2_x_LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
8,
Weapons.BRU_33_2_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
AIM_9B_Sidewinder_IR_AAM = (8, Weapons.AIM_9B_Sidewinder_IR_AAM)
AIM_9L_Sidewinder_IR_AAM = (8, Weapons.AIM_9L_Sidewinder_IR_AAM)
@@ -968,7 +904,7 @@ class VSN_F104S_AG(PlaneType):
)
BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
8,
Weapons.BRU_33_2_x_LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_33_with_2_x_Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = (
8,
@@ -984,7 +920,7 @@ class VSN_F104S_AG(PlaneType):
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
8,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_42_with_3_x_Mk_81___250lb_GP_Bombs_LD = (
8,
@@ -1024,19 +960,11 @@ class VSN_F104S_AG(PlaneType):
Weapons.BL_755_CBU___450kg__147_Frag_Pen_bomblets,
)
CBU_97___10_x_SFW_Cluster_Bomb = (9, Weapons.CBU_97___10_x_SFW_Cluster_Bomb)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
9,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__ = (
9,
Weapons.APU_68___S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_,
Weapons.S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk__,
)
B_8M1___20_S_8OFP2 = (9, Weapons.B_8M1___20_S_8OFP2)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange = (
9,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8TsM_SM_Orange,
)
AIM_9P_Sidewinder_IR_AAM = (9, Weapons.AIM_9P_Sidewinder_IR_AAM)
AIM_9P5_Sidewinder_IR_AAM = (9, Weapons.AIM_9P5_Sidewinder_IR_AAM)
AIM_9L_Sidewinder_IR_AAM = (9, Weapons.AIM_9L_Sidewinder_IR_AAM)

View File

@@ -8,7 +8,7 @@ from game.modsupport import planemod
from pydcs_extensions.weapon_injector import inject_weapons
class WeaponsF4BC:
class WeaponsF4:
F4B_Gunpod_w_SAPHEI_T = {
"clsid": "{VSN_F4B_Equalizer}",
"name": "F4B Gunpod w/SAPHEI-T",
@@ -79,19 +79,9 @@ class WeaponsF4BC:
"name": "BRU 42A MK82*3 LAU105 AIM9J*2",
"weight": 1500,
}
LAU_118a_and_AGM_45A_Shrike___Passive_radar_homing_Anti_Radiation_Missile = {
"clsid": "{F4C_LAU118_AGM45A}",
"name": "LAU-118a and AGM-45A Shrike - Passive radar homing Anti-Radiation-Missile",
"weight": 177,
}
SUU_23A_M61_Gunpod_HE_AP_HE_INV_ = {
"clsid": "{VSN_F4B_Equalizer}",
"name": "SUU-23A M61 Gunpod HE/AP/HE-INV.",
"weight": 744.362,
}
inject_weapons(WeaponsF4BC)
inject_weapons(WeaponsF4)
@planemod
@@ -109,32 +99,9 @@ class VSN_F4B(PlaneType):
chaff_charge_size = 1
flare_charge_size = 1
category = "Interceptor" # {78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F}
radio_frequency = 264
radio_frequency = 127.5
panel_radio = {
1: {
"channels": {
1: 264,
2: 265,
4: 254,
8: 258,
16: 267,
17: 251,
9: 262,
18: 253,
5: 250,
10: 259,
11: 268,
3: 256,
6: 270,
12: 269,
13: 260,
7: 257,
14: 263,
15: 261,
},
},
}
livery_name = "VSN_F4B" # from type
class Pylon1:
Smoke_Generator___red_ = (1, Weapons.Smoke_Generator___red_)
@@ -145,34 +112,31 @@ class VSN_F4B(PlaneType):
Smoke_Generator___orange_ = (1, Weapons.Smoke_Generator___orange_)
class Pylon2:
GBU_10___2000lb_Laser_Guided_Bomb = (
2,
Weapons.GBU_10___2000lb_Laser_Guided_Bomb,
)
GBU_12___500lb_Laser_Guided_Bomb = (2, Weapons.GBU_12___500lb_Laser_Guided_Bomb)
BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets = (
2,
Weapons.BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets,
)
TER_9A_with_3_x_Mk_82_Snakeye___500lb_GP_Bomb_HD = (
2,
Weapons.TER_9A_with_3_x_Mk_82_Snakeye___500lb_GP_Bomb_HD,
)
BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD = (
2,
Weapons.BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD,
)
Mk_84___2000lb_GP_Bomb_LD = (2, Weapons.Mk_84___2000lb_GP_Bomb_LD)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
2,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
2,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
_3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
2,
Weapons.BRU_42_3_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons._3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
2,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
Smokewinder___red = (2, Weapons.Smokewinder___red)
Smokewinder___green = (2, Weapons.Smokewinder___green)
@@ -181,20 +145,29 @@ class VSN_F4B(PlaneType):
Smokewinder___yellow = (2, Weapons.Smokewinder___yellow)
BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
2,
Weapons.BRU_33_2_x_LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
2,
Weapons.BRU_33_2_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_41A_with_6_x_Mk_82___500lb_GP_Bomb_LD = (
2,
Weapons.BRU_41A_with_6_x_Mk_82___500lb_GP_Bomb_LD,
)
BRU_33_with_2_x_GBU_12___500lb_Laser_Guided_Bomb = (
2,
Weapons.BRU_33_with_2_x_GBU_12___500lb_Laser_Guided_Bomb,
)
BIN_200 = (2, Weapons.BIN_200)
VSN_F4EL_PTB = (2, WeaponsF4BC.VSN_F4EL_PTB)
VSN_F4EL_PTB = (2, Weapons.VSN_F4EL_PTB)
class Pylon3:
GBU_10___2000lb_Laser_Guided_Bomb = (
3,
Weapons.GBU_10___2000lb_Laser_Guided_Bomb,
)
GBU_12___500lb_Laser_Guided_Bomb = (3, Weapons.GBU_12___500lb_Laser_Guided_Bomb)
BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets = (
3,
Weapons.BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets,
@@ -206,19 +179,19 @@ class VSN_F4B(PlaneType):
Mk_84___2000lb_GP_Bomb_LD = (3, Weapons.Mk_84___2000lb_GP_Bomb_LD)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
3,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
_3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
3,
Weapons.BRU_42_3_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons._3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
3,
Weapons.BRU_33_2_x_LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
3,
Weapons.BRU_33_2_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_105_2_AIM_9L = (3, Weapons.LAU_105_2_AIM_9L)
LAU_105_with_2_x_AIM_9P_Sidewinder_IR_AAM = (
@@ -230,8 +203,8 @@ class VSN_F4B(PlaneType):
3,
Weapons.LAU_7_with_2_x_AIM_9B_Sidewinder_IR_AAM,
)
LAU_105_2_AIM_9J = (3, WeaponsF4BC.LAU_105_2_AIM_9J)
LAU_105_2_AIM_9JULI = (3, WeaponsF4BC.LAU_105_2_AIM_9JULI)
LAU_105_2_AIM_9J = (3, Weapons.LAU_105_2_AIM_9J)
LAU_105_2_AIM_9JULI = (3, Weapons.LAU_105_2_AIM_9JULI)
AIM_7F_Sparrow_Semi_Active_Radar = (3, Weapons.AIM_7F_Sparrow_Semi_Active_Radar)
AIM_7E_2_Sparrow_Semi_Active_Radar = (
3,
@@ -251,19 +224,13 @@ class VSN_F4B(PlaneType):
Weapons.BRU_33_with_2_x_Mk_83___1000lb_GP_Bomb_LD,
)
BIN_200 = (3, Weapons.BIN_200)
F4B_LAU105_AIM9J_2_BRU42A_M117_3 = (
3,
WeaponsF4BC.F4B_LAU105_AIM9J_2_BRU42A_M117_3,
)
F4B_LAU105_AIM9J_2_BRU42A_MK82_3 = (
3,
WeaponsF4BC.F4B_LAU105_AIM9J_2_BRU42A_MK82_3,
)
F4B_LAU105_AIM9J_2_BRU42A_M117_3 = (3, Weapons.F4B_LAU105_AIM9J_2_BRU42A_M117_3)
F4B_LAU105_AIM9J_2_BRU42A_MK82_3 = (3, Weapons.F4B_LAU105_AIM9J_2_BRU42A_MK82_3)
F4B_LAU105_AIM9J_2_TER9A_MK82SE_3 = (
3,
WeaponsF4BC.F4B_LAU105_AIM9J_2_TER9A_MK82SE_3,
Weapons.F4B_LAU105_AIM9J_2_TER9A_MK82SE_3,
)
F4B_LAU105_AIM9J_2_MER_MK20_3 = (3, WeaponsF4BC.F4B_LAU105_AIM9J_2_MER_MK20_3)
F4B_LAU105_AIM9J_2_MER_MK20_3 = (3, Weapons.F4B_LAU105_AIM9J_2_MER_MK20_3)
class Pylon4:
AIM_7F_Sparrow_Semi_Active_Radar = (4, Weapons.AIM_7F_Sparrow_Semi_Active_Radar)
@@ -278,7 +245,6 @@ class VSN_F4B(PlaneType):
5,
Weapons.AIM_7E_2_Sparrow_Semi_Active_Radar,
)
ALQ_131___ECM_Pod = (5, Weapons.ALQ_131___ECM_Pod)
class Pylon6:
Smokewinder___red = (6, Weapons.Smokewinder___red)
@@ -292,18 +258,16 @@ class VSN_F4B(PlaneType):
)
_3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
6,
Weapons.BRU_42_3_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons._3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD = (
6,
Weapons.BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD,
)
SUU_23A_M61_Gunpod_HE_AP_HE_INV_ = (
6,
WeaponsF4BC.SUU_23A_M61_Gunpod_HE_AP_HE_INV_,
)
VSN_F4EC_PTB = (6, WeaponsF4BC.VSN_F4EC_PTB)
VSN_F4B_C2_PTB = (6, WeaponsF4BC.VSN_F4B_C2_PTB)
ALQ_131___ECM_Pod = (6, Weapons.ALQ_131___ECM_Pod)
F4B_Gunpod_w_SAPHEI_T = (6, Weapons.F4B_Gunpod_w_SAPHEI_T)
VSN_F4EC_PTB = (6, Weapons.VSN_F4EC_PTB)
VSN_F4B_C2_PTB = (6, Weapons.VSN_F4B_C2_PTB)
class Pylon7:
AIM_7F_Sparrow_Semi_Active_Radar = (7, Weapons.AIM_7F_Sparrow_Semi_Active_Radar)
@@ -320,6 +284,11 @@ class VSN_F4B(PlaneType):
)
class Pylon9:
GBU_10___2000lb_Laser_Guided_Bomb = (
9,
Weapons.GBU_10___2000lb_Laser_Guided_Bomb,
)
GBU_12___500lb_Laser_Guided_Bomb = (9, Weapons.GBU_12___500lb_Laser_Guided_Bomb)
BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets = (
9,
Weapons.BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets,
@@ -331,19 +300,19 @@ class VSN_F4B(PlaneType):
Mk_84___2000lb_GP_Bomb_LD = (9, Weapons.Mk_84___2000lb_GP_Bomb_LD)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
9,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
_3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
9,
Weapons.BRU_42_3_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons._3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
9,
Weapons.BRU_33_2_x_LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
9,
Weapons.BRU_33_2_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_105_2_AIM_9L = (9, Weapons.LAU_105_2_AIM_9L)
LAU_105_with_2_x_AIM_9P_Sidewinder_IR_AAM = (
@@ -355,8 +324,8 @@ class VSN_F4B(PlaneType):
9,
Weapons.LAU_7_with_2_x_AIM_9B_Sidewinder_IR_AAM,
)
LAU_105_2_AIM_9J = (9, WeaponsF4BC.LAU_105_2_AIM_9J)
LAU_105_2_AIM_9JULI = (9, WeaponsF4BC.LAU_105_2_AIM_9JULI)
LAU_105_2_AIM_9J = (9, Weapons.LAU_105_2_AIM_9J)
LAU_105_2_AIM_9JULI = (9, Weapons.LAU_105_2_AIM_9JULI)
AIM_7F_Sparrow_Semi_Active_Radar = (9, Weapons.AIM_7F_Sparrow_Semi_Active_Radar)
AIM_7E_2_Sparrow_Semi_Active_Radar = (
9,
@@ -376,49 +345,43 @@ class VSN_F4B(PlaneType):
Weapons.BRU_33_with_2_x_Mk_83___1000lb_GP_Bomb_LD,
)
BIN_200 = (9, Weapons.BIN_200)
F4B_LAU105_AIM9J_2_BRU42A_M117_3 = (
9,
WeaponsF4BC.F4B_LAU105_AIM9J_2_BRU42A_M117_3,
)
F4B_LAU105_AIM9J_2_BRU42A_MK82_3 = (
9,
WeaponsF4BC.F4B_LAU105_AIM9J_2_BRU42A_MK82_3,
)
F4B_LAU105_AIM9J_2_BRU42A_M117_3 = (9, Weapons.F4B_LAU105_AIM9J_2_BRU42A_M117_3)
F4B_LAU105_AIM9J_2_BRU42A_MK82_3 = (9, Weapons.F4B_LAU105_AIM9J_2_BRU42A_MK82_3)
F4B_LAU105_AIM9J_2_TER9A_MK82SE_3 = (
9,
WeaponsF4BC.F4B_LAU105_AIM9J_2_TER9A_MK82SE_3,
Weapons.F4B_LAU105_AIM9J_2_TER9A_MK82SE_3,
)
F4B_LAU105_AIM9J_2_MER_MK20_3 = (9, WeaponsF4BC.F4B_LAU105_AIM9J_2_MER_MK20_3)
F4B_LAU105_AIM9J_2_MER_MK20_3 = (9, Weapons.F4B_LAU105_AIM9J_2_MER_MK20_3)
class Pylon10:
GBU_10___2000lb_Laser_Guided_Bomb = (
10,
Weapons.GBU_10___2000lb_Laser_Guided_Bomb,
)
GBU_12___500lb_Laser_Guided_Bomb = (
10,
Weapons.GBU_12___500lb_Laser_Guided_Bomb,
)
BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets = (
10,
Weapons.BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets,
)
Mk_84___2000lb_GP_Bomb_LD = (10, Weapons.Mk_84___2000lb_GP_Bomb_LD)
TER_9A_with_3_x_Mk_82_Snakeye___500lb_GP_Bomb_HD = (
10,
Weapons.TER_9A_with_3_x_Mk_82_Snakeye___500lb_GP_Bomb_HD,
)
BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD = (
10,
Weapons.BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD,
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
10,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
10,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
_3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
10,
Weapons.BRU_42_3_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons._3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
10,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
Smokewinder___red = (10, Weapons.Smokewinder___red)
Smokewinder___green = (10, Weapons.Smokewinder___green)
@@ -427,26 +390,27 @@ class VSN_F4B(PlaneType):
Smokewinder___yellow = (10, Weapons.Smokewinder___yellow)
BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
10,
Weapons.BRU_33_2_x_LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
10,
Weapons.BRU_33_2_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_41A_with_6_x_Mk_82___500lb_GP_Bomb_LD = (
10,
Weapons.BRU_41A_with_6_x_Mk_82___500lb_GP_Bomb_LD,
)
BRU_33_with_2_x_GBU_12___500lb_Laser_Guided_Bomb = (
10,
Weapons.BRU_33_with_2_x_GBU_12___500lb_Laser_Guided_Bomb,
)
BIN_200 = (10, Weapons.BIN_200)
VSN_F4ER_PTB = (10, WeaponsF4BC.VSN_F4ER_PTB)
# ERRR <CLEAN>
# ERRR <CLEAN>
VSN_F4ER_PTB = (10, Weapons.VSN_F4ER_PTB)
class Pylon11:
# all added manually - did not pull using database export
BRU42A_M117_3_LAU105_AIM9J_2 = (11, WeaponsF4BC.BRU_42A_M117_3_LAU105_AIM9J_2)
BRU42A_MK82_3_LAU105_AIM9J_2 = (11, WeaponsF4BC.BRU_42A_MK82_3_LAU105_AIM9J_2)
BRU42A_M117_3_LAU105_AIM9J_2 = (11, Weapons.BRU_42A_M117_3_LAU105_AIM9J_2)
BRU42A_MK82_3_LAU105_AIM9J_2 = (11, Weapons.BRU_42A_MK82_3_LAU105_AIM9J_2)
TER_9A_with_3_x_Mk_82_Snakeye___500lb_GP_Bomb_HD = (
11,
Weapons.TER_9A_with_3_x_Mk_82_Snakeye___500lb_GP_Bomb_HD,
@@ -458,8 +422,8 @@ class VSN_F4B(PlaneType):
class Pylon12:
# all added manually - did not pull using database export
BRU42A_M117_3_LAU105_AIM9J_2 = (12, WeaponsF4BC.BRU_42A_M117_3_LAU105_AIM9J_2)
BRU42A_MK82_3_LAU105_AIM9J_2 = (12, WeaponsF4BC.BRU_42A_MK82_3_LAU105_AIM9J_2)
BRU42A_M117_3_LAU105_AIM9J_2 = (12, Weapons.BRU_42A_M117_3_LAU105_AIM9J_2)
BRU42A_MK82_3_LAU105_AIM9J_2 = (12, Weapons.BRU_42A_MK82_3_LAU105_AIM9J_2)
TER_9A_with_3_x_Mk_82_Snakeye___500lb_GP_Bomb_HD = (
12,
Weapons.TER_9A_with_3_x_Mk_82_Snakeye___500lb_GP_Bomb_HD,
@@ -481,7 +445,6 @@ class VSN_F4B(PlaneType):
task.CAS,
task.AFAC,
task.RunwayAttack,
task.PinpointStrike,
]
task_default = task.CAP
@@ -501,32 +464,9 @@ class VSN_F4C(PlaneType):
chaff_charge_size = 1
flare_charge_size = 1
category = "Interceptor" # {78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F}
radio_frequency = 264
radio_frequency = 127.5
panel_radio = {
1: {
"channels": {
1: 264,
2: 265,
4: 254,
8: 258,
16: 267,
17: 251,
9: 262,
18: 253,
5: 250,
10: 259,
11: 268,
3: 256,
6: 270,
12: 269,
13: 260,
7: 257,
14: 263,
15: 261,
},
},
}
livery_name = "VSN_F4C" # from type
class Pylon1:
Smoke_Generator___red_ = (1, Weapons.Smoke_Generator___red_)
@@ -537,34 +477,31 @@ class VSN_F4C(PlaneType):
Smoke_Generator___orange_ = (1, Weapons.Smoke_Generator___orange_)
class Pylon2:
GBU_10___2000lb_Laser_Guided_Bomb = (
2,
Weapons.GBU_10___2000lb_Laser_Guided_Bomb,
)
GBU_12___500lb_Laser_Guided_Bomb = (2, Weapons.GBU_12___500lb_Laser_Guided_Bomb)
BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets = (
2,
Weapons.BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets,
)
Mk_84___2000lb_GP_Bomb_LD = (2, Weapons.Mk_84___2000lb_GP_Bomb_LD)
TER_9A_with_3_x_Mk_82_Snakeye___500lb_GP_Bomb_HD = (
2,
Weapons.TER_9A_with_3_x_Mk_82_Snakeye___500lb_GP_Bomb_HD,
)
BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD = (
2,
Weapons.BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD,
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
2,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
2,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
_3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
2,
Weapons.BRU_42_3_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons._3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
2,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
Smokewinder___red = (2, Weapons.Smokewinder___red)
Smokewinder___green = (2, Weapons.Smokewinder___green)
@@ -573,20 +510,29 @@ class VSN_F4C(PlaneType):
Smokewinder___yellow = (2, Weapons.Smokewinder___yellow)
BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
2,
Weapons.BRU_33_2_x_LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
2,
Weapons.BRU_33_2_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_41A_with_6_x_Mk_82___500lb_GP_Bomb_LD = (
2,
Weapons.BRU_41A_with_6_x_Mk_82___500lb_GP_Bomb_LD,
)
BRU_33_with_2_x_GBU_12___500lb_Laser_Guided_Bomb = (
2,
Weapons.BRU_33_with_2_x_GBU_12___500lb_Laser_Guided_Bomb,
)
BIN_200 = (2, Weapons.BIN_200)
VSN_F4EL_PTB = (2, WeaponsF4BC.VSN_F4EL_PTB)
VSN_F4EL_PTB = (2, Weapons.VSN_F4EL_PTB)
class Pylon3:
GBU_10___2000lb_Laser_Guided_Bomb = (
3,
Weapons.GBU_10___2000lb_Laser_Guided_Bomb,
)
GBU_12___500lb_Laser_Guided_Bomb = (3, Weapons.GBU_12___500lb_Laser_Guided_Bomb)
BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets = (
3,
Weapons.BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets,
@@ -596,25 +542,23 @@ class VSN_F4C(PlaneType):
Weapons.BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD,
)
Mk_84___2000lb_GP_Bomb_LD = (3, Weapons.Mk_84___2000lb_GP_Bomb_LD)
LAU_118A___AGM_45B_Shrike_ARM = (
3,
Weapons.LAU_118A___AGM_45B_Shrike_ARM,
)
AGM_45B_Shrike_ARM = (3, Weapons.AGM_45B_Shrike_ARM)
AGM_45A_Shrike_ARM = (3, Weapons.AGM_45A_Shrike_ARM)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
3,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
_3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
3,
Weapons.BRU_42_3_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons._3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
3,
Weapons.BRU_33_2_x_LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
3,
Weapons.BRU_33_2_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_105_2_AIM_9L = (3, Weapons.LAU_105_2_AIM_9L)
LAU_105_with_2_x_AIM_9P_Sidewinder_IR_AAM = (
@@ -626,8 +570,8 @@ class VSN_F4C(PlaneType):
3,
Weapons.LAU_7_with_2_x_AIM_9B_Sidewinder_IR_AAM,
)
LAU_105_2_AIM_9J = (3, WeaponsF4BC.LAU_105_2_AIM_9J)
LAU_105_2_AIM_9JULI = (3, WeaponsF4BC.LAU_105_2_AIM_9JULI)
LAU_105_2_AIM_9J = (3, Weapons.LAU_105_2_AIM_9J)
LAU_105_2_AIM_9JULI = (3, Weapons.LAU_105_2_AIM_9JULI)
Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = (
3,
Weapons.Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets,
@@ -642,10 +586,6 @@ class VSN_F4C(PlaneType):
Weapons.BRU_33_with_2_x_Mk_83___1000lb_GP_Bomb_LD,
)
BIN_200 = (3, Weapons.BIN_200)
LAU_118a_and_AGM_45A_Shrike___Passive_radar_homing_Anti_Radiation_Missile = (
3,
WeaponsF4BC.LAU_118a_and_AGM_45A_Shrike___Passive_radar_homing_Anti_Radiation_Missile,
)
class Pylon4:
AIM_7F_Sparrow_Semi_Active_Radar = (4, Weapons.AIM_7F_Sparrow_Semi_Active_Radar)
@@ -660,7 +600,6 @@ class VSN_F4C(PlaneType):
5,
Weapons.AIM_7E_2_Sparrow_Semi_Active_Radar,
)
ALQ_131___ECM_Pod = (5, Weapons.ALQ_131___ECM_Pod)
class Pylon6:
Smokewinder___red = (6, Weapons.Smokewinder___red)
@@ -674,18 +613,16 @@ class VSN_F4C(PlaneType):
)
_3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
6,
Weapons.BRU_42_3_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons._3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD = (
6,
Weapons.BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD,
)
SUU_23A_M61_Gunpod_HE_AP_HE_INV_ = (
6,
WeaponsF4BC.SUU_23A_M61_Gunpod_HE_AP_HE_INV_,
)
VSN_F4EC_PTB = (6, WeaponsF4BC.VSN_F4EC_PTB)
VSN_F4B_C2_PTB = (6, WeaponsF4BC.VSN_F4B_C2_PTB)
ALQ_131___ECM_Pod = (6, Weapons.ALQ_131___ECM_Pod)
F4B_Gunpod_w_SAPHEI_T = (6, Weapons.F4B_Gunpod_w_SAPHEI_T)
VSN_F4EC_PTB = (6, Weapons.VSN_F4EC_PTB)
VSN_F4B_C2_PTB = (6, Weapons.VSN_F4B_C2_PTB)
class Pylon7:
AIM_7F_Sparrow_Semi_Active_Radar = (7, Weapons.AIM_7F_Sparrow_Semi_Active_Radar)
@@ -702,6 +639,11 @@ class VSN_F4C(PlaneType):
)
class Pylon9:
GBU_10___2000lb_Laser_Guided_Bomb = (
9,
Weapons.GBU_10___2000lb_Laser_Guided_Bomb,
)
GBU_12___500lb_Laser_Guided_Bomb = (9, Weapons.GBU_12___500lb_Laser_Guided_Bomb)
BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets = (
9,
Weapons.BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets,
@@ -711,25 +653,23 @@ class VSN_F4C(PlaneType):
Weapons.BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD,
)
Mk_84___2000lb_GP_Bomb_LD = (9, Weapons.Mk_84___2000lb_GP_Bomb_LD)
LAU_118A___AGM_45B_Shrike_ARM = (
9,
Weapons.LAU_118A___AGM_45B_Shrike_ARM,
)
AGM_45B_Shrike_ARM = (9, Weapons.AGM_45B_Shrike_ARM)
AGM_45A_Shrike_ARM = (9, Weapons.AGM_45A_Shrike_ARM)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
9,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
_3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
9,
Weapons.BRU_42_3_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons._3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
9,
Weapons.BRU_33_2_x_LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
9,
Weapons.BRU_33_2_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_105_2_AIM_9L = (9, Weapons.LAU_105_2_AIM_9L)
LAU_105_with_2_x_AIM_9P_Sidewinder_IR_AAM = (
@@ -741,8 +681,8 @@ class VSN_F4C(PlaneType):
9,
Weapons.LAU_7_with_2_x_AIM_9B_Sidewinder_IR_AAM,
)
LAU_105_2_AIM_9J = (9, WeaponsF4BC.LAU_105_2_AIM_9J)
LAU_105_2_AIM_9JULI = (9, WeaponsF4BC.LAU_105_2_AIM_9JULI)
LAU_105_2_AIM_9J = (9, Weapons.LAU_105_2_AIM_9J)
LAU_105_2_AIM_9JULI = (9, Weapons.LAU_105_2_AIM_9JULI)
Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = (
9,
Weapons.Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets,
@@ -757,40 +697,36 @@ class VSN_F4C(PlaneType):
Weapons.BRU_33_with_2_x_Mk_83___1000lb_GP_Bomb_LD,
)
BIN_200 = (9, Weapons.BIN_200)
LAU_118a_and_AGM_45A_Shrike___Passive_radar_homing_Anti_Radiation_Missile = (
9,
WeaponsF4BC.LAU_118a_and_AGM_45A_Shrike___Passive_radar_homing_Anti_Radiation_Missile,
)
class Pylon10:
GBU_10___2000lb_Laser_Guided_Bomb = (
10,
Weapons.GBU_10___2000lb_Laser_Guided_Bomb,
)
GBU_12___500lb_Laser_Guided_Bomb = (
10,
Weapons.GBU_12___500lb_Laser_Guided_Bomb,
)
BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets = (
10,
Weapons.BRU_42_with_3_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets,
)
Mk_84___2000lb_GP_Bomb_LD = (10, Weapons.Mk_84___2000lb_GP_Bomb_LD)
TER_9A_with_3_x_Mk_82_Snakeye___500lb_GP_Bomb_HD = (
10,
Weapons.TER_9A_with_3_x_Mk_82_Snakeye___500lb_GP_Bomb_HD,
)
BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD = (
10,
Weapons.BRU_42_with_3_x_Mk_82___500lb_GP_Bombs_LD,
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
10,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
10,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
_3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
10,
Weapons.BRU_42_3_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons._3_x_LAU_61_pods___57_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
10,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
Smokewinder___red = (10, Weapons.Smokewinder___red)
Smokewinder___green = (10, Weapons.Smokewinder___green)
@@ -799,21 +735,22 @@ class VSN_F4C(PlaneType):
Smokewinder___yellow = (10, Weapons.Smokewinder___yellow)
BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
10,
Weapons.BRU_33_2_x_LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.BRU_33_with_2_x_LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
10,
Weapons.BRU_33_2_x_LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_41A_with_6_x_Mk_82___500lb_GP_Bomb_LD = (
10,
Weapons.BRU_41A_with_6_x_Mk_82___500lb_GP_Bomb_LD,
)
BRU_33_with_2_x_GBU_12___500lb_Laser_Guided_Bomb = (
10,
Weapons.BRU_33_with_2_x_GBU_12___500lb_Laser_Guided_Bomb,
)
BIN_200 = (10, Weapons.BIN_200)
VSN_F4ER_PTB = (10, WeaponsF4BC.VSN_F4ER_PTB)
# ERRR <CLEAN>
# ERRR <CLEAN>
VSN_F4ER_PTB = (10, Weapons.VSN_F4ER_PTB)
pylons: Set[int] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}
@@ -827,7 +764,5 @@ class VSN_F4C(PlaneType):
task.CAS,
task.AFAC,
task.RunwayAttack,
task.SEAD,
task.PinpointStrike,
]
task_default = task.CAP

File diff suppressed because it is too large Load Diff

View File

@@ -736,7 +736,7 @@ class Hercules(PlaneType):
class Pylon2:
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M257_IL,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
)
Smokewinder___red = (2, Weapons.Smokewinder___red)
Smokewinder___green = (2, Weapons.Smokewinder___green)
@@ -753,7 +753,7 @@ class Hercules(PlaneType):
class Pylon3:
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M257_IL,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
)
Smokewinder___red = (3, Weapons.Smokewinder___red)
Smokewinder___green = (3, Weapons.Smokewinder___green)
@@ -770,7 +770,7 @@ class Hercules(PlaneType):
class Pylon4:
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
4,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M257_IL,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
)
Smokewinder___red = (4, Weapons.Smokewinder___red)
Smokewinder___green = (4, Weapons.Smokewinder___green)
@@ -787,7 +787,7 @@ class Hercules(PlaneType):
class Pylon5:
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M257_IL,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
)
Smokewinder___red = (5, Weapons.Smokewinder___red)
Smokewinder___green = (5, Weapons.Smokewinder___green)

View File

@@ -57,7 +57,7 @@ class Bronco_OV_10A(PlaneType):
1,
Weapons.LAU_7_with_AIM_9B_Sidewinder_IR_AAM,
)
LAU_33A = (1, WeaponsOV10A.LAU_33A)
LAU_33A = (1, Weapons.LAU_33A)
# ERRR {MK-81}
@@ -75,67 +75,67 @@ class Bronco_OV_10A(PlaneType):
M260_HYDRA_WP = (2, Weapons.M260_HYDRA_WP)
LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
2,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE_,
Weapons.LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
2,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
LAU_61R_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
2,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_61R_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
2,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
2,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M257_IL,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M274_TP_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_61_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice = (
2,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_WTU_1_B_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice,
)
# ERRR {MK-81}
@@ -154,77 +154,77 @@ class Bronco_OV_10A(PlaneType):
M260_HYDRA_WP = (3, Weapons.M260_HYDRA_WP)
LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
3,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE_,
Weapons.LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
3,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
LAU_61R_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
3,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_61R_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
3,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
3,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M257_IL,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M274_TP_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_61_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice = (
3,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_WTU_1_B_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice,
)
class Pylon4:
Fuel_Tank_150_gallons_ = (4, WeaponsOV10A.Fuel_Tank_150_gallons_)
Fuel_Tank_150_gallons_ = (4, Weapons.Fuel_Tank_150_gallons_)
# ERRR {MK-81}
Mk_82___500lb_GP_Bomb_LD = (4, Weapons.Mk_82___500lb_GP_Bomb_LD)
Mk_82_Snakeye___500lb_GP_Bomb_HD = (4, Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD)
Mk_83___1000lb_GP_Bomb_LD = (4, Weapons.Mk_83___1000lb_GP_Bomb_LD)
M117___750lb_GP_Bomb_LD = (4, Weapons.M117___750lb_GP_Bomb_LD)
Mk4_mod_0 = (4, WeaponsOV10A.Mk4_mod_0)
Mk4_mod_0 = (4, Weapons.Mk4_mod_0)
# ERRR {MK-81}
@@ -242,67 +242,67 @@ class Bronco_OV_10A(PlaneType):
M260_HYDRA_WP = (5, Weapons.M260_HYDRA_WP)
LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
5,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE_,
Weapons.LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
5,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
LAU_61R_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
5,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_61R_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
5,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
5,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M257_IL,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M274_TP_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_61_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice = (
5,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_WTU_1_B_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice,
)
# ERRR {MK-81}
@@ -321,67 +321,67 @@ class Bronco_OV_10A(PlaneType):
M260_HYDRA_WP = (6, Weapons.M260_HYDRA_WP)
LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
6,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE_,
Weapons.LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = (
6,
Weapons.LAU_10___4_x_UnGd_Rkts__127_mm_Zuni_Mk__24_Mod__1_HE,
Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG,
)
LAU_61R_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
6,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_61R_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
6,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE_,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
6,
Weapons.LAU_61___19_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = (
6,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = (
6,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE,
)
LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = (
6,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Mk_4_FFAR_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE = (
6,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M151_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos = (
6,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M156_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M156__Wht_Phos,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = (
6,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M257_IL,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk = (
6,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_M274_TP_SM,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M274__Practice_Smk,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice = (
6,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_1_HE,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk1__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = (
6,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_5_HEAT,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice = (
6,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_Mk_61_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_Mk61__Practice,
)
LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice = (
6,
Weapons.LAU_68___7_x_UnGd_Rkts__70_mm_Hydra_70_WTU_1_B_TP,
Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_WTU_1_B__Practice,
)
class Pylon7:
@@ -393,13 +393,13 @@ class Bronco_OV_10A(PlaneType):
7,
Weapons.LAU_7_with_AIM_9B_Sidewinder_IR_AAM,
)
LAU_33A = (7, WeaponsOV10A.LAU_33A)
LAU_33A = (7, Weapons.LAU_33A)
class Pylon8:
OV10_Paratrooper = (8, WeaponsOV10A.OV10_Paratrooper)
OV10_Paratrooper = (8, Weapons.OV10_Paratrooper)
class Pylon9:
OV10_SMOKE = (9, WeaponsOV10A.OV10_SMOKE)
OV10_SMOKE = (9, Weapons.OV10_SMOKE)
pylons: Set[int] = {1, 2, 3, 4, 5, 6, 7, 8, 9}

View File

@@ -14,23 +14,11 @@ class Su57Weapons:
RVV_BD = {"clsid": "{RVV-BD}", "name": "RVV-BD", "weight": 600}
RVV_L = {"clsid": "{RVV-L}", "name": "RVV-L", "weight": 748}
RVV_M = {"clsid": "{RVV-M}", "name": "RVV-M", "weight": 190}
R_37M_Active_Rdr = {"clsid": "{RVV-BD}", "name": "R-37M Active Rdr", "weight": 600}
Su_57_Fuel_Tank = {
"clsid": "{SU_57Tank}",
"name": "Su-57 Fuel Tank",
"weight": 1561.421,
}
R_77PD_Active_rdr = {
"clsid": "{RVV-AE}",
"name": "R-77PD Active rdr",
"weight": 250,
}
K_77M_Active_Rdr = {"clsid": "{RVV-M}", "name": "K-77M Active Rdr", "weight": 190}
KS_172_Passive_Rdr = {
"clsid": "{RVV-L}",
"name": "KS-172 Passive Rdr",
"weight": 748,
}
inject_weapons(Su57Weapons)
@@ -56,9 +44,8 @@ class Su_57(PlaneType):
class Pylon1:
R_73__AA_11_Archer____Infra_Red = (1, Weapons.R_73__AA_11_Archer____Infra_Red)
R_77PD_Active_rdr = (1, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (1, Su57Weapons.K_77M_Active_Rdr)
L_081_Fantasmagoria_ELINT_pod = (1, Weapons.L_081_Fantasmagoria_ELINT_pod)
RVV_AE = (1, Su57Weapons.RVV_AE)
RVV_M = (1, Su57Weapons.RVV_M)
Smoke_Generator___red = (1, Weapons.Smoke_Generator___red)
Smoke_Generator___green = (1, Weapons.Smoke_Generator___green)
Smoke_Generator___blue = (1, Weapons.Smoke_Generator___blue)
@@ -109,17 +96,13 @@ class Su_57(PlaneType):
2,
Weapons.MBD3_U6_68_with_6_x_FAB_100___100kg_GP_Bombs_LD,
)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
2,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
B_13L_pod___5_x_S_13_OF__122mm_UnGd_Rkts__Blast_Frag = (
2,
Weapons.B_13L___5_x_UnGd_Rkts__122_mm_S_13OF_Blast_Fragmentation,
Weapons.B_13L_pod___5_x_S_13_OF__122mm_UnGd_Rkts__Blast_Frag,
)
S_25_OFM___340mm_UnGd_Rkt__480kg_Penetrator = (
2,
Weapons.O_25___1_x_UnGd_Rkts__340_mm_S_25_OFM_Hardened_Target_Penetrator,
Weapons.S_25_OFM___340mm_UnGd_Rkt__480kg_Penetrator,
)
BetAB_500___500kg_Concrete_Piercing_Bomb_LD = (
2,
@@ -160,10 +143,10 @@ class Su_57(PlaneType):
2,
Weapons.MBD3_U6_68_with_6_x_FAB_250___250kg_GP_Bombs_LD,
)
R_37M_Active_Rdr = (2, Su57Weapons.R_37M_Active_Rdr)
R_77PD_Active_rdr = (2, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (2, Su57Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (2, Su57Weapons.KS_172_Passive_Rdr)
RVV_BD = (2, Su57Weapons.RVV_BD)
RVV_AE = (2, Su57Weapons.RVV_AE)
RVV_M = (2, Su57Weapons.RVV_M)
RVV_L = (2, Su57Weapons.RVV_L)
Fuel_tank_800L_Wing = (2, Weapons.Fuel_tank_800L_Wing)
RN_28___260_kg__nuclear_bomb__free_fall = (
2,
@@ -230,17 +213,13 @@ class Su_57(PlaneType):
4,
Weapons.MBD3_U6_68_with_6_x_FAB_100___100kg_GP_Bombs_LD,
)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
4,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
B_13L_pod___5_x_S_13_OF__122mm_UnGd_Rkts__Blast_Frag = (
4,
Weapons.B_13L___5_x_UnGd_Rkts__122_mm_S_13OF_Blast_Fragmentation,
Weapons.B_13L_pod___5_x_S_13_OF__122mm_UnGd_Rkts__Blast_Frag,
)
S_25_OFM___340mm_UnGd_Rkt__480kg_Penetrator = (
4,
Weapons.O_25___1_x_UnGd_Rkts__340_mm_S_25_OFM_Hardened_Target_Penetrator,
Weapons.S_25_OFM___340mm_UnGd_Rkt__480kg_Penetrator,
)
BetAB_500___500kg_Concrete_Piercing_Bomb_LD = (
4,
@@ -281,10 +260,10 @@ class Su_57(PlaneType):
4,
Weapons.MBD3_U6_68_with_6_x_FAB_250___250kg_GP_Bombs_LD,
)
R_37M_Active_Rdr = (4, Su57Weapons.R_37M_Active_Rdr)
R_77PD_Active_rdr = (4, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (4, Su57Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (4, Su57Weapons.KS_172_Passive_Rdr)
RVV_BD = (4, Su57Weapons.RVV_BD)
RVV_AE = (4, Su57Weapons.RVV_AE)
RVV_M = (4, Su57Weapons.RVV_M)
RVV_L = (4, Su57Weapons.RVV_L)
RN_28___260_kg__nuclear_bomb__free_fall = (
4,
Weapons.RN_28___260_kg__nuclear_bomb__free_fall,
@@ -294,26 +273,26 @@ class Su_57(PlaneType):
class Pylon5:
R_77__AA_12_Adder____Active_Rdr = (5, Weapons.R_77__AA_12_Adder____Active_Rdr)
R_77PD_Active_rdr = (5, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (5, Su57Weapons.K_77M_Active_Rdr)
RVV_AE = (5, Su57Weapons.RVV_AE)
RVV_M = (5, Su57Weapons.RVV_M)
Kh_59MK2 = (5, Su57Weapons.Kh_59MK2)
class Pylon6:
R_77__AA_12_Adder____Active_Rdr = (6, Weapons.R_77__AA_12_Adder____Active_Rdr)
R_77PD_Active_rdr = (6, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (6, Su57Weapons.K_77M_Active_Rdr)
RVV_AE = (6, Su57Weapons.RVV_AE)
RVV_M = (6, Su57Weapons.RVV_M)
Kh_59MK2 = (6, Su57Weapons.Kh_59MK2)
class Pylon7:
R_77__AA_12_Adder____Active_Rdr = (7, Weapons.R_77__AA_12_Adder____Active_Rdr)
R_77PD_Active_rdr = (7, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (7, Su57Weapons.K_77M_Active_Rdr)
RVV_AE = (7, Su57Weapons.RVV_AE)
RVV_M = (7, Su57Weapons.RVV_M)
Kh_59MK2 = (7, Su57Weapons.Kh_59MK2)
class Pylon8:
R_77__AA_12_Adder____Active_Rdr = (8, Weapons.R_77__AA_12_Adder____Active_Rdr)
R_77PD_Active_rdr = (8, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (8, Su57Weapons.K_77M_Active_Rdr)
RVV_AE = (8, Su57Weapons.RVV_AE)
RVV_M = (8, Su57Weapons.RVV_M)
Kh_59MK2 = (8, Su57Weapons.Kh_59MK2)
class Pylon9:
@@ -359,17 +338,13 @@ class Su_57(PlaneType):
9,
Weapons.MBD3_U6_68_with_6_x_FAB_100___100kg_GP_Bombs_LD,
)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
9,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
B_13L_pod___5_x_S_13_OF__122mm_UnGd_Rkts__Blast_Frag = (
9,
Weapons.B_13L___5_x_UnGd_Rkts__122_mm_S_13OF_Blast_Fragmentation,
Weapons.B_13L_pod___5_x_S_13_OF__122mm_UnGd_Rkts__Blast_Frag,
)
S_25_OFM___340mm_UnGd_Rkt__480kg_Penetrator = (
9,
Weapons.O_25___1_x_UnGd_Rkts__340_mm_S_25_OFM_Hardened_Target_Penetrator,
Weapons.S_25_OFM___340mm_UnGd_Rkt__480kg_Penetrator,
)
BetAB_500___500kg_Concrete_Piercing_Bomb_LD = (
9,
@@ -410,10 +385,10 @@ class Su_57(PlaneType):
9,
Weapons.MBD3_U6_68_with_6_x_FAB_250___250kg_GP_Bombs_LD,
)
R_37M_Active_Rdr = (9, Su57Weapons.R_37M_Active_Rdr)
R_77PD_Active_rdr = (9, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (9, Su57Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (9, Su57Weapons.KS_172_Passive_Rdr)
RVV_BD = (9, Su57Weapons.RVV_BD)
RVV_AE = (9, Su57Weapons.RVV_AE)
RVV_M = (9, Su57Weapons.RVV_M)
RVV_L = (9, Su57Weapons.RVV_L)
RN_28___260_kg__nuclear_bomb__free_fall = (
9,
Weapons.RN_28___260_kg__nuclear_bomb__free_fall,
@@ -473,17 +448,13 @@ class Su_57(PlaneType):
11,
Weapons.MBD3_U6_68_with_6_x_FAB_100___100kg_GP_Bombs_LD,
)
B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag = (
11,
Weapons.B_8M1___20_x_UnGd_Rkts__80_mm_S_8KOM_HEAT_Frag,
)
B_13L_pod___5_x_S_13_OF__122mm_UnGd_Rkts__Blast_Frag = (
11,
Weapons.B_13L___5_x_UnGd_Rkts__122_mm_S_13OF_Blast_Fragmentation,
Weapons.B_13L_pod___5_x_S_13_OF__122mm_UnGd_Rkts__Blast_Frag,
)
S_25_OFM___340mm_UnGd_Rkt__480kg_Penetrator = (
11,
Weapons.O_25___1_x_UnGd_Rkts__340_mm_S_25_OFM_Hardened_Target_Penetrator,
Weapons.S_25_OFM___340mm_UnGd_Rkt__480kg_Penetrator,
)
BetAB_500___500kg_Concrete_Piercing_Bomb_LD = (
11,
@@ -528,10 +499,10 @@ class Su_57(PlaneType):
Weapons.MBD3_U6_68_with_6_x_FAB_250___250kg_GP_Bombs_LD,
)
# ERRR {R-33}
R_37M_Active_Rdr = (11, Su57Weapons.R_37M_Active_Rdr)
R_77PD_Active_rdr = (11, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (11, Su57Weapons.K_77M_Active_Rdr)
KS_172_Passive_Rdr = (11, Su57Weapons.KS_172_Passive_Rdr)
RVV_BD = (11, Su57Weapons.RVV_BD)
RVV_AE = (11, Su57Weapons.RVV_AE)
RVV_M = (11, Su57Weapons.RVV_M)
RVV_L = (11, Su57Weapons.RVV_L)
Fuel_tank_800L_Wing = (11, Weapons.Fuel_tank_800L_Wing)
Su_57_Fuel_Tank = (11, Su57Weapons.Su_57_Fuel_Tank)
RN_28___260_kg__nuclear_bomb__free_fall = (
@@ -548,8 +519,8 @@ class Su_57(PlaneType):
class Pylon12:
R_73__AA_11_Archer____Infra_Red = (12, Weapons.R_73__AA_11_Archer____Infra_Red)
R_77PD_Active_rdr = (12, Su57Weapons.R_77PD_Active_rdr)
K_77M_Active_Rdr = (12, Su57Weapons.K_77M_Active_Rdr)
RVV_AE = (12, Su57Weapons.RVV_AE)
RVV_M = (12, Su57Weapons.RVV_M)
Smoke_Generator___red = (12, Weapons.Smoke_Generator___red)
Smoke_Generator___green = (12, Weapons.Smoke_Generator___green)
Smoke_Generator___blue = (12, Weapons.Smoke_Generator___blue)

View File

@@ -1,5 +1,4 @@
"""Application-wide dialog management."""
from typing import Optional
from game.ato.flight import Flight

View File

@@ -1,5 +1,4 @@
"""Qt data models for game objects."""
from __future__ import annotations
import datetime
@@ -177,9 +176,6 @@ class PackageModel(QAbstractListModel):
"""Removes the given flight from the package."""
with self.game_model.sim_controller.paused_sim():
index = self.package.flights.index(flight)
self.game_model.game.blue.callsign_generator.release_callsign(
flight.callsign
)
self.beginRemoveRows(QModelIndex(), index, index)
self.package.remove_flight(flight)
self.endRemoveRows()
@@ -305,10 +301,6 @@ class AtoModel(QAbstractListModel):
self.package_models.release(package)
index = self.ato.packages.index(package)
self.beginRemoveRows(QModelIndex(), index, index)
for flight in package.flights:
self.game_model.game.blue.callsign_generator.release_callsign(
flight.callsign
)
self.ato.remove_package(package)
self.endRemoveRows()
# noinspection PyUnresolvedReferences

View File

@@ -1,5 +1,4 @@
"""Spin box for selecting the number of aircraft in a flight."""
from PySide6.QtWidgets import QSpinBox

View File

@@ -1,5 +1,4 @@
"""A layout containing a widget with an associated label."""
from typing import Optional
from PySide6.QtCore import Qt

View File

@@ -16,7 +16,6 @@ from game import Game, persistence
from game.ato.package import Package
from game.ato.traveltime import TotEstimator
from game.profiling import logged_duration
from game.settings.settings import FastForwardStopCondition
from game.utils import meters
from qt_ui.models import GameModel
from qt_ui.simcontroller import SimController
@@ -249,6 +248,50 @@ class QTopPanel(QFrame):
mbox.exec_()
return True
def check_valid_autoresolve_settings(self) -> bool:
if not self.game.settings.fast_forward_to_first_contact:
return True
if not self.game.settings.auto_resolve_combat:
return True
has_clients = self.ato_has_clients()
if (
has_clients
and self.game.settings.player_mission_interrupts_sim_at is not None
):
return True
if has_clients:
message = textwrap.dedent(
"""\
You have enabled settings to fast forward and to auto-resolve combat,
but have not selected any interrupt condition. Fast forward will never
stop with your current settings. To use auto- resolve, you must choose a
"Player missions interrupt fast forward" setting other than "Never".
"""
)
else:
message = textwrap.dedent(
"""\
You have enabled settings to fast forward and to auto-resolve combat,
but have no players. Fast forward will never stop with your current
settings. Auto-resolve and fast forward cannot be used without player
flights and a "Player missions interrupt fast forward" setting other
than "Never".
"""
)
mbox = QMessageBox(
QMessageBox.Icon.Critical,
"Incompatible fast-forward settings",
message,
parent=self,
)
mbox.setEscapeButton(mbox.addButton(QMessageBox.StandardButton.Close))
mbox.exec()
return False
def launch_mission(self):
"""Finishes planning and waits for mission completion."""
if not self.ato_has_clients() and not self.confirm_no_client_launch():
@@ -264,10 +307,10 @@ class QTopPanel(QFrame):
if not self.confirm_negative_start_time(negative_starts):
return
if self.game.settings.fast_forward_stop_condition not in [
FastForwardStopCondition.DISABLED,
FastForwardStopCondition.MANUAL,
]:
if not self.check_valid_autoresolve_settings():
return
if self.game.settings.fast_forward_to_first_contact:
with logged_duration("Simulating to first contact"):
self.sim_controller.run_to_first_contact()
self.sim_controller.generate_miz(

View File

@@ -1,5 +1,4 @@
"""Widgets for displaying air tasking orders."""
import logging
from typing import Optional

View File

@@ -1,5 +1,4 @@
"""Widgets for displaying client slots."""
from PySide6.QtWidgets import QLabel
from qt_ui.models import AtoModel

View File

@@ -1,5 +1,4 @@
"""Combo box for selecting aircraft types."""
from PySide6.QtWidgets import QComboBox
from game.dcs.aircrafttype import AircraftType

View File

@@ -1,5 +1,4 @@
"""Combo box for selecting a departure airfield."""
from typing import Iterable, Optional
from PySide6.QtWidgets import QComboBox

View File

@@ -1,5 +1,4 @@
"""Dialog window for editing flights."""
from PySide6.QtWidgets import (
QDialog,
QVBoxLayout,

View File

@@ -1,5 +1,4 @@
"""Dialogs for creating and editing ATO packages."""
import logging
from typing import Optional

View File

@@ -202,8 +202,6 @@ class QFlightCreator(QDialog):
self.game.laser_code_registry.alloc_laser_code()
)
flight.callsign = self.game.blue.callsign_generator.alloc_callsign(flight)
# noinspection PyUnresolvedReferences
self.created.emit(flight)
self.accept()

View File

@@ -1,5 +1,4 @@
"""Combo box for selecting squadrons."""
from typing import Optional
from PySide6.QtWidgets import QComboBox

View File

@@ -26,9 +26,7 @@ class QPylonEditor(QComboBox):
self.addItem("None", None)
if self.game.settings.restrict_weapons_by_date:
weapons = pylon.available_on(
self.game.date, flight.squadron.coalition.faction
)
weapons = pylon.available_on(self.game.date)
else:
weapons = pylon.allowed
allowed = sorted(weapons, key=operator.attrgetter("name"))
@@ -70,11 +68,7 @@ class QPylonEditor(QComboBox):
def matching_weapon_name(self, loadout: Loadout) -> str:
if self.game.settings.restrict_weapons_by_date:
loadout = loadout.degrade_for_date(
self.flight.unit_type,
self.game.date,
self.flight.squadron.coalition.faction,
)
loadout = loadout.degrade_for_date(self.flight.unit_type, self.game.date)
weapon = self.weapon_from_loadout(loadout)
if weapon is None:
return "None"

View File

@@ -1 +1,2 @@
class MissingPropertyDataError(RuntimeError): ...
class MissingPropertyDataError(RuntimeError):
...

Some files were not shown because too many files have changed in this diff Show More