mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
Factions are properly loaded, now need to refactor whole code.
This commit is contained in:
parent
59010f6949
commit
b744238fb8
@ -149,6 +149,7 @@ from dcs.vehicles import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
import pydcs_extensions.frenchpack.frenchpack as frenchpack
|
import pydcs_extensions.frenchpack.frenchpack as frenchpack
|
||||||
|
from game.factions import faction_loader
|
||||||
from game.factions.australia_2005 import Australia_2005
|
from game.factions.australia_2005 import Australia_2005
|
||||||
from game.factions.bluefor_coldwar import BLUEFOR_COLDWAR
|
from game.factions.bluefor_coldwar import BLUEFOR_COLDWAR
|
||||||
from game.factions.bluefor_coldwar_a4 import BLUEFOR_COLDWAR_A4
|
from game.factions.bluefor_coldwar_a4 import BLUEFOR_COLDWAR_A4
|
||||||
@ -156,6 +157,7 @@ from game.factions.bluefor_coldwar_mods import BLUEFOR_COLDWAR_MODS
|
|||||||
from game.factions.bluefor_modern import BLUEFOR_MODERN
|
from game.factions.bluefor_modern import BLUEFOR_MODERN
|
||||||
from game.factions.canada_2005 import Canada_2005
|
from game.factions.canada_2005 import Canada_2005
|
||||||
from game.factions.china_2010 import China_2010
|
from game.factions.china_2010 import China_2010
|
||||||
|
from game.factions.faction import Faction
|
||||||
from game.factions.france_1995 import France_1995
|
from game.factions.france_1995 import France_1995
|
||||||
from game.factions.france_2005 import France_2005
|
from game.factions.france_2005 import France_2005
|
||||||
from game.factions.france_modded import France_2005_Modded
|
from game.factions.france_modded import France_2005_Modded
|
||||||
@ -961,7 +963,9 @@ CARRIER_TAKEOFF_BAN: List[Type[FlyingType]] = [
|
|||||||
Units separated by country.
|
Units separated by country.
|
||||||
country : DCS Country name
|
country : DCS Country name
|
||||||
"""
|
"""
|
||||||
FACTIONS: Dict[str, Dict[str, Any]] = {
|
FACTIONS : [Faction] = faction_loader.load_factions()
|
||||||
|
|
||||||
|
FACTIONS3: Dict[str, Dict[str, Any]] = {
|
||||||
|
|
||||||
"Bluefor Modern": BLUEFOR_MODERN,
|
"Bluefor Modern": BLUEFOR_MODERN,
|
||||||
"Bluefor Cold War 1970s": BLUEFOR_COLDWAR,
|
"Bluefor Cold War 1970s": BLUEFOR_COLDWAR,
|
||||||
|
|||||||
@ -2,11 +2,12 @@ import logging
|
|||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
|
|
||||||
|
import dcs
|
||||||
from dcs.planes import PlaneType, plane_map
|
from dcs.planes import PlaneType, plane_map
|
||||||
from dcs.unittype import VehicleType, UnitType
|
from dcs.unittype import VehicleType, UnitType
|
||||||
from dcs.vehicles import vehicle_map, Armor, Unarmed, Infantry, Fortification, Artillery, AirDefence
|
from dcs.vehicles import vehicle_map, Armor, Unarmed, Infantry, Fortification, Artillery, AirDefence
|
||||||
|
|
||||||
from game.data.doctrine import Doctrine
|
from game.data.doctrine import Doctrine, MODERN_DOCTRINE, COLDWAR_DOCTRINE, WWII_DOCTRINE
|
||||||
|
|
||||||
|
|
||||||
@dataclass
|
@dataclass
|
||||||
@ -36,6 +37,9 @@ class Faction:
|
|||||||
# Infantry units used
|
# Infantry units used
|
||||||
infantry_units: [VehicleType]
|
infantry_units: [VehicleType]
|
||||||
|
|
||||||
|
# Logistics units used
|
||||||
|
logistics_units: [VehicleType]
|
||||||
|
|
||||||
# List of units that can be deployed as SHORAD
|
# List of units that can be deployed as SHORAD
|
||||||
shorad_units: [VehicleType]
|
shorad_units: [VehicleType]
|
||||||
|
|
||||||
@ -70,7 +74,26 @@ class Faction:
|
|||||||
doctrine: Doctrine
|
doctrine: Doctrine
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
pass
|
self.country = ""
|
||||||
|
self.name = ""
|
||||||
|
self.aircrafts = []
|
||||||
|
self.awacs = []
|
||||||
|
self.tankers = []
|
||||||
|
self.frontline_units = []
|
||||||
|
self.artillery_units = []
|
||||||
|
self.infantry_units = []
|
||||||
|
self.logistics_units = []
|
||||||
|
self.shorad_units = []
|
||||||
|
self.sams = []
|
||||||
|
self.requirements = {}
|
||||||
|
self.carrier_names = []
|
||||||
|
self.lha_names = []
|
||||||
|
self.navy_generators = []
|
||||||
|
self.destroyers = []
|
||||||
|
self.cruisers = []
|
||||||
|
self.has_jtac = False
|
||||||
|
self.jtac_unit = ""
|
||||||
|
self.doctrine = None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_json(cls, json):
|
def from_json(cls, json):
|
||||||
@ -80,42 +103,63 @@ class Faction:
|
|||||||
faction.country = json.get("country", "USA")
|
faction.country = json.get("country", "USA")
|
||||||
faction.name = json.get("name", "???")
|
faction.name = json.get("name", "???")
|
||||||
|
|
||||||
faction.aircrafts = [f for f in [aircraft_loader(aircraft) for aircraft in json.get("aircrafts", [])] is not None]
|
faction.aircrafts = [f for f in [aircraft_loader(aircraft) for aircraft in json.get("aircrafts", [])] if f is not None]
|
||||||
faction.awacs = [f for f in [aircraft_loader(aircraft) for aircraft in json.get("awacs", [])] is not None]
|
faction.awacs = [f for f in [aircraft_loader(aircraft) for aircraft in json.get("awacs", [])] if f is not None]
|
||||||
faction.tankers = [f for f in [aircraft_loader(aircraft) for aircraft in json.get("tankers", [])] is not None]
|
faction.tankers = [f for f in [aircraft_loader(aircraft) for aircraft in json.get("tankers", [])] if f is not None]
|
||||||
|
|
||||||
|
faction.frontline_units = [f for f in [vehicle_loader(vehicle) for vehicle in json.get("frontline_units", [])] if f is not None]
|
||||||
|
faction.artillery_units = [f for f in [vehicle_loader(vehicle) for vehicle in json.get("artillery_units", [])] if f is not None]
|
||||||
|
faction.infantry_units = [f for f in [vehicle_loader(vehicle) for vehicle in json.get("infantry_units", [])] if f is not None]
|
||||||
|
faction.logistics_units = [f for f in [vehicle_loader(vehicle) for vehicle in json.get("logistics_units", [])] if f is not None]
|
||||||
|
faction.shorad_units = [f for f in [vehicle_loader(vehicle) for vehicle in json.get("shorad_units", [])] if f is not None]
|
||||||
|
|
||||||
|
faction.sams = json.get("sams", [])
|
||||||
|
faction.name = json.get("requirements", {})
|
||||||
|
|
||||||
|
faction.carrier_names = json.get("carrier_names", [])
|
||||||
|
faction.lha_names = json.get("lha_names", [])
|
||||||
|
faction.navy_generators = json.get("navy_generators", [])
|
||||||
|
faction.destroyers = [f for f in [ship_loader(vehicle) for vehicle in json.get("destroyers", [])] if f is not None]
|
||||||
|
faction.cruisers = [f for f in [ship_loader(vehicle) for vehicle in json.get("cruisers", [])] if f is not None]
|
||||||
|
faction.has_jtac = json.get("has_jtac", False)
|
||||||
|
faction.jtac_unit = json.get("jtac_unit", "")
|
||||||
|
|
||||||
|
# Load doctrine
|
||||||
|
doctrine = json.get("doctrine", "modern")
|
||||||
|
if doctrine == "modern":
|
||||||
|
faction.doctrine = MODERN_DOCTRINE
|
||||||
|
if doctrine == "coldwar":
|
||||||
|
faction.doctrine = COLDWAR_DOCTRINE
|
||||||
|
else:
|
||||||
|
faction.doctrine = WWII_DOCTRINE
|
||||||
|
|
||||||
|
return faction
|
||||||
|
|
||||||
|
@property
|
||||||
|
def units(self):
|
||||||
|
return self.infantry_units + self.aircrafts + self.awacs + self.artillery_units + self.frontline_units + self.tankers + self.logistics_units
|
||||||
|
|
||||||
|
|
||||||
def aircraft_loader(aircraft: str) -> Optional[PlaneType]:
|
def unit_loader(unit: str, class_repository:[]) -> Optional[PlaneType]:
|
||||||
"""
|
"""
|
||||||
Find aircraft by name
|
Find unit by name
|
||||||
:param aircraft: Aircraft name as string
|
:param unit: Unit name as string
|
||||||
:return: The aircraft as a PyDCS type
|
:return: The unit as a PyDCS type
|
||||||
"""
|
"""
|
||||||
if aircraft in plane_map.keys():
|
if unit in plane_map.keys():
|
||||||
return plane_map[aircraft]
|
return plane_map[unit]
|
||||||
else:
|
else:
|
||||||
for mother_class in [PlaneType, Unarmed, Infantry, Armor, AirDefence, Artillery, Fortification]:
|
for mother_class in class_repository:
|
||||||
if getattr(mother_class, vehicle) is not None:
|
if getattr(mother_class, unit, None) is not None:
|
||||||
return getattr(mother_class, vehicle)
|
return getattr(mother_class, unit)
|
||||||
logging.info("FACTION ERROR : Unable to find " + aircraft + " in pydcs")
|
logging.info("FACTION ERROR : Unable to find " + unit + " in pydcs")
|
||||||
|
print("FACTION ERROR : Unable to find " + unit + " in pydcs")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def vehicle_loader(vehicle: str) -> Optional[VehicleType]:
|
|
||||||
"""
|
|
||||||
Find vehicle by name
|
|
||||||
:param vehicle: Vehicle name as string
|
|
||||||
:return: The vehicle as a PyDCS type
|
|
||||||
"""
|
|
||||||
if vehicle in plane_map.keys():
|
|
||||||
return plane_map[vehicle]
|
|
||||||
else:
|
|
||||||
for mother_class in [Armor, Unarmed, Infantry, Armor, AirDefence, Artillery, Fortification]:
|
|
||||||
if getattr(mother_class, vehicle) is not None:
|
|
||||||
return getattr(mother_class, vehicle)
|
|
||||||
logging.info("FACTION ERROR : Unable to find " + vehicle + " in pydcs")
|
|
||||||
return None
|
|
||||||
|
|
||||||
vehicle_map
|
aircraft_loader = lambda x: unit_loader(x, [dcs.planes, dcs.helicopters])
|
||||||
|
vehicle_loader = lambda x: unit_loader(x, [Infantry, Unarmed, Armor, AirDefence, Artillery])
|
||||||
|
ship_loader = lambda x: unit_loader(x, [dcs.ships])
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -2,6 +2,8 @@ import json
|
|||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
from game.factions.faction import Faction
|
||||||
|
|
||||||
FACTION_DIRECTORY = "./resources/factions/"
|
FACTION_DIRECTORY = "./resources/factions/"
|
||||||
|
|
||||||
def load_factions() -> {}:
|
def load_factions() -> {}:
|
||||||
@ -11,16 +13,19 @@ def load_factions() -> {}:
|
|||||||
factions = {}
|
factions = {}
|
||||||
|
|
||||||
for f in files:
|
for f in files:
|
||||||
|
print(f)
|
||||||
path = os.path.join(FACTION_DIRECTORY, f)
|
path = os.path.join(FACTION_DIRECTORY, f)
|
||||||
logging.info("Loading faction" + path)
|
logging.info("Loading faction" + path)
|
||||||
try:
|
#try:
|
||||||
with open(path, "r") as fdata:
|
with open(path, "r") as fdata:
|
||||||
data = json.load(fdata)
|
data = json.load(fdata)
|
||||||
factions[data["name"]] = data
|
factions[data["name"]] = Faction.from_json(data)
|
||||||
logging.info("Loaded faction : " + path)
|
logging.info("Loaded faction : " + path)
|
||||||
except:
|
#except Exception as e:
|
||||||
logging.error("Unable to load faction : " + path)
|
# print(e)
|
||||||
|
# logging.error("Unable to load faction : " + path)
|
||||||
|
|
||||||
|
print(factions)
|
||||||
return factions
|
return factions
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -200,8 +200,8 @@ class FactionSelection(QtWidgets.QWizardPage):
|
|||||||
red_faction = db.FACTIONS[self.redFactionSelect.currentText()]
|
red_faction = db.FACTIONS[self.redFactionSelect.currentText()]
|
||||||
blue_faction = db.FACTIONS[self.blueFactionSelect.currentText()]
|
blue_faction = db.FACTIONS[self.blueFactionSelect.currentText()]
|
||||||
|
|
||||||
red_units = red_faction["units"]
|
red_units = red_faction.aircrafts
|
||||||
blue_units = blue_faction["units"]
|
blue_units = blue_faction.aircrafts
|
||||||
|
|
||||||
blue_txt = ""
|
blue_txt = ""
|
||||||
for u in blue_units:
|
for u in blue_units:
|
||||||
@ -218,16 +218,16 @@ class FactionSelection(QtWidgets.QWizardPage):
|
|||||||
self.redSideRecap.setText(red_txt)
|
self.redSideRecap.setText(red_txt)
|
||||||
|
|
||||||
has_mod = False
|
has_mod = False
|
||||||
if "requirements" in red_faction.keys():
|
if len(red_faction.requirements.keys()) > 0:
|
||||||
has_mod = True
|
has_mod = True
|
||||||
for mod in red_faction["requirements"].keys():
|
for mod in red_faction.requirements.keys():
|
||||||
self.requiredMods.setText(self.requiredMods.text() + "\n<li>" + mod + ": <a href=\""+red_faction["requirements"][mod]+"\">" + red_faction["requirements"][mod] + "</a></li>")
|
self.requiredMods.setText(self.requiredMods.text() + "\n<li>" + mod + ": <a href=\""+red_faction.requirements[mod]+"\">" + red_faction.requirements[mod] + "</a></li>")
|
||||||
|
|
||||||
if "requirements" in blue_faction.keys():
|
if len(blue_faction.requirements.keys()) > 0:
|
||||||
has_mod = True
|
has_mod = True
|
||||||
for mod in blue_faction["requirements"].keys():
|
for mod in blue_faction.requirements.keys():
|
||||||
if not "requirements" in red_faction.keys() or mod not in red_faction["requirements"].keys():
|
if not "requirements" in red_faction.keys() or mod not in red_faction.requirements.keys():
|
||||||
self.requiredMods.setText(self.requiredMods.text() + "\n<li>" + mod + ": <a href=\""+blue_faction["requirements"][mod]+"\">" + blue_faction["requirements"][mod] + "</a></li>")
|
self.requiredMods.setText(self.requiredMods.text() + "\n<li>" + mod + ": <a href=\""+blue_faction.requirements[mod]+"\">" + blue_faction.requirements[mod] + "</a></li>")
|
||||||
|
|
||||||
if has_mod:
|
if has_mod:
|
||||||
self.requiredMods.setText(self.requiredMods.text() + "</ul>\n\n")
|
self.requiredMods.setText(self.requiredMods.text() + "</ul>\n\n")
|
||||||
|
|||||||
81
resources/factions/russia_2010.json
Normal file
81
resources/factions/russia_2010.json
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
{
|
||||||
|
"country": "Russia",
|
||||||
|
"name": "Russia 2010",
|
||||||
|
"aircrafts": [
|
||||||
|
"MiG_29S",
|
||||||
|
"MiG_31",
|
||||||
|
"Su_24M",
|
||||||
|
"Su_25",
|
||||||
|
"Su_25T",
|
||||||
|
"Su_27",
|
||||||
|
"Su_30",
|
||||||
|
"Su_33",
|
||||||
|
"Su_34",
|
||||||
|
"L_39ZA",
|
||||||
|
"Mi_8MT",
|
||||||
|
"Mi_24V",
|
||||||
|
"Mi_28N",
|
||||||
|
"Ka_50"
|
||||||
|
],
|
||||||
|
"awacs": [
|
||||||
|
"A_50"
|
||||||
|
],
|
||||||
|
"tankers": [
|
||||||
|
"IL_78M"
|
||||||
|
],
|
||||||
|
"frontline_units": [
|
||||||
|
"IFV_BMP_1",
|
||||||
|
"IFV_BMP_2",
|
||||||
|
"IFV_BMP_3",
|
||||||
|
"APC_BTR_80",
|
||||||
|
"MBT_T_90",
|
||||||
|
"MBT_T_80U",
|
||||||
|
"MBT_T_72B"
|
||||||
|
],
|
||||||
|
"artillery_units": [
|
||||||
|
"MLRS_9K57_Uragan_BM_27",
|
||||||
|
"SPH_2S19_Msta"
|
||||||
|
],
|
||||||
|
"logistics_units": [
|
||||||
|
"Transport_Ural_375",
|
||||||
|
"Transport_UAZ_469"
|
||||||
|
],
|
||||||
|
"infantry_units": [
|
||||||
|
"Paratrooper_AKS",
|
||||||
|
"Infantry_Soldier_Rus",
|
||||||
|
"Paratrooper_RPG_16"
|
||||||
|
],
|
||||||
|
"shorad_units": [
|
||||||
|
"SAM_SA_19_Tunguska_2S6",
|
||||||
|
"SAM_SA_13_Strela_10M3_9A35M3"
|
||||||
|
],
|
||||||
|
"sams": [
|
||||||
|
"SA11Generator",
|
||||||
|
"SA10Generator",
|
||||||
|
"SA6Generator",
|
||||||
|
"SA19Generator"
|
||||||
|
],
|
||||||
|
"aircraft_carrier": [
|
||||||
|
"CV_1143_5_Admiral_Kuznetsov"
|
||||||
|
],
|
||||||
|
"helicopter_carrier": [
|
||||||
|
],
|
||||||
|
"lhanames": [
|
||||||
|
],
|
||||||
|
"destroyer": [
|
||||||
|
"FF_1135M_Rezky"
|
||||||
|
],
|
||||||
|
"cruiser": [
|
||||||
|
"FSG_1241_1MP_Molniya"
|
||||||
|
],
|
||||||
|
"requirements": {},
|
||||||
|
"carrier_names": [
|
||||||
|
"Admiral Kuznetov"
|
||||||
|
],
|
||||||
|
"navy_generators": [
|
||||||
|
"RussianNavyGroupGenerator",
|
||||||
|
"KiloSubGroupGenerator"
|
||||||
|
],
|
||||||
|
"has_jtac": true,
|
||||||
|
"jtac_unit": "MQ_9_Reaper"
|
||||||
|
}
|
||||||
@ -9,7 +9,7 @@
|
|||||||
"F_16C_50",
|
"F_16C_50",
|
||||||
"A_10C",
|
"A_10C",
|
||||||
"A_10C_2",
|
"A_10C_2",
|
||||||
"AV8BN",
|
"AV8BNA",
|
||||||
"UH_1H",
|
"UH_1H",
|
||||||
"AH_64D"
|
"AH_64D"
|
||||||
],
|
],
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user