mirror of
https://github.com/dcs-liberation/dcs_liberation.git
synced 2025-11-10 14:22:26 +00:00
Issue 3204 (#3458)
This issue addresses Issue #3204 by allowing factions to set a different weapon introduction date.
This commit is contained in:
@@ -10,6 +10,8 @@ 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:
|
||||
@@ -52,6 +54,7 @@ class Loadout:
|
||||
weapon: Weapon,
|
||||
pylon: Pylon,
|
||||
date: datetime.date,
|
||||
faction: Faction,
|
||||
skip_types: Optional[Iterable[WeaponType]] = None,
|
||||
) -> Optional[Weapon]:
|
||||
if skip_types is None:
|
||||
@@ -59,14 +62,16 @@ class Loadout:
|
||||
for fallback in weapon.fallbacks:
|
||||
if not pylon.can_equip(fallback):
|
||||
continue
|
||||
if not fallback.available_on(date):
|
||||
if not fallback.available_on(date, faction):
|
||||
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) -> Loadout:
|
||||
def degrade_for_date(
|
||||
self, unit_type: AircraftType, date: datetime.date, faction: Faction
|
||||
) -> Loadout:
|
||||
if self.date is not None and self.date <= date:
|
||||
return Loadout(self.name, self.pylons, self.date, self.is_custom)
|
||||
|
||||
@@ -75,9 +80,9 @@ class Loadout:
|
||||
if weapon is None:
|
||||
del new_pylons[pylon_number]
|
||||
continue
|
||||
if not weapon.available_on(date):
|
||||
if not weapon.available_on(date, faction):
|
||||
pylon = Pylon.for_aircraft(unit_type, pylon_number)
|
||||
fallback = self._fallback_for(weapon, pylon, date)
|
||||
fallback = self._fallback_for(weapon, pylon, date, faction)
|
||||
if fallback is None:
|
||||
del new_pylons[pylon_number]
|
||||
else:
|
||||
@@ -89,11 +94,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)
|
||||
loadout.replace_lgbs_if_no_tgp(unit_type, date, faction)
|
||||
return loadout
|
||||
|
||||
def replace_lgbs_if_no_tgp(
|
||||
self, unit_type: AircraftType, date: datetime.date
|
||||
self, unit_type: AircraftType, date: datetime.date, faction: Faction
|
||||
) -> None:
|
||||
if self.has_weapon_of_type(WeaponType.TGP):
|
||||
return
|
||||
@@ -106,7 +111,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, skip_types={WeaponType.LGB}
|
||||
weapon, pylon, date, faction, skip_types={WeaponType.LGB}
|
||||
)
|
||||
if fallback is None:
|
||||
del new_pylons[pylon_number]
|
||||
|
||||
@@ -14,6 +14,8 @@ 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]
|
||||
@@ -77,8 +79,12 @@ class Weapon:
|
||||
WeaponGroup.load_all()
|
||||
cls._loaded = True
|
||||
|
||||
def available_on(self, date: datetime.date) -> bool:
|
||||
def available_on(self, date: datetime.date, faction: Faction) -> 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)
|
||||
@@ -243,9 +249,9 @@ class Pylon:
|
||||
def make_pydcs_assignment(self, weapon: Weapon) -> PydcsWeaponAssignment:
|
||||
return self.number, weapon.pydcs_data
|
||||
|
||||
def available_on(self, date: datetime.date) -> Iterator[Weapon]:
|
||||
def available_on(self, date: datetime.date, faction: Faction) -> Iterator[Weapon]:
|
||||
for weapon in self.allowed:
|
||||
if weapon.available_on(date):
|
||||
if weapon.available_on(date, faction):
|
||||
yield weapon
|
||||
|
||||
@classmethod
|
||||
|
||||
@@ -3,6 +3,7 @@ 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
|
||||
|
||||
@@ -118,6 +119,10 @@ 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)
|
||||
|
||||
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):
|
||||
@@ -262,6 +267,10 @@ class Faction:
|
||||
|
||||
faction.unrestricted_satnav = json.get("unrestricted_satnav", False)
|
||||
|
||||
faction.weapons_introduction_year_overrides = json.get(
|
||||
"weapons_introduction_year_overrides", {}
|
||||
)
|
||||
|
||||
return faction
|
||||
|
||||
@property
|
||||
|
||||
@@ -245,7 +245,11 @@ 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)
|
||||
loadout = loadout.degrade_for_date(
|
||||
self.flight.unit_type,
|
||||
self.game.date,
|
||||
self.flight.squadron.coalition.faction,
|
||||
)
|
||||
|
||||
for pylon_number, weapon in loadout.pylons.items():
|
||||
if weapon is None:
|
||||
|
||||
Reference in New Issue
Block a user