Factions are properly loaded, now need to refactor whole code.

This commit is contained in:
Khopa 2020-10-22 01:32:33 +02:00
parent 59010f6949
commit b744238fb8
6 changed files with 182 additions and 48 deletions

View File

@ -149,6 +149,7 @@ from dcs.vehicles import (
)
import pydcs_extensions.frenchpack.frenchpack as frenchpack
from game.factions import faction_loader
from game.factions.australia_2005 import Australia_2005
from game.factions.bluefor_coldwar import BLUEFOR_COLDWAR
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.canada_2005 import Canada_2005
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_2005 import France_2005
from game.factions.france_modded import France_2005_Modded
@ -961,7 +963,9 @@ CARRIER_TAKEOFF_BAN: List[Type[FlyingType]] = [
Units separated by country.
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 Cold War 1970s": BLUEFOR_COLDWAR,

View File

@ -2,11 +2,12 @@ import logging
from dataclasses import dataclass
from typing import Optional
import dcs
from dcs.planes import PlaneType, plane_map
from dcs.unittype import VehicleType, UnitType
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
@ -36,6 +37,9 @@ class Faction:
# Infantry units used
infantry_units: [VehicleType]
# Logistics units used
logistics_units: [VehicleType]
# List of units that can be deployed as SHORAD
shorad_units: [VehicleType]
@ -70,7 +74,26 @@ class Faction:
doctrine: Doctrine
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
def from_json(cls, json):
@ -80,42 +103,63 @@ class Faction:
faction.country = json.get("country", "USA")
faction.name = json.get("name", "???")
faction.aircrafts = [f for f in [aircraft_loader(aircraft) for aircraft in json.get("aircrafts", [])] is not None]
faction.awacs = [f for f in [aircraft_loader(aircraft) for aircraft in json.get("awacs", [])] is not None]
faction.tankers = [f for f in [aircraft_loader(aircraft) for aircraft in json.get("tankers", [])] 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", [])] if f 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]
def aircraft_loader(aircraft: str) -> Optional[PlaneType]:
"""
Find aircraft by name
:param aircraft: Aircraft name as string
:return: The aircraft as a PyDCS type
"""
if aircraft in plane_map.keys():
return plane_map[aircraft]
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:
for mother_class in [PlaneType, 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 " + aircraft + " in pydcs")
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 unit_loader(unit: str, class_repository:[]) -> Optional[PlaneType]:
"""
Find unit by name
:param unit: Unit name as string
:return: The unit as a PyDCS type
"""
if unit in plane_map.keys():
return plane_map[unit]
else:
for mother_class in class_repository:
if getattr(mother_class, unit, None) is not None:
return getattr(mother_class, unit)
logging.info("FACTION ERROR : Unable to find " + unit + " in pydcs")
print("FACTION ERROR : Unable to find " + unit + " in pydcs")
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])

View File

@ -2,6 +2,8 @@ import json
import os
import logging
from game.factions.faction import Faction
FACTION_DIRECTORY = "./resources/factions/"
def load_factions() -> {}:
@ -11,16 +13,19 @@ def load_factions() -> {}:
factions = {}
for f in files:
print(f)
path = os.path.join(FACTION_DIRECTORY, f)
logging.info("Loading faction" + path)
try:
#try:
with open(path, "r") as fdata:
data = json.load(fdata)
factions[data["name"]] = data
factions[data["name"]] = Faction.from_json(data)
logging.info("Loaded faction : " + path)
except:
logging.error("Unable to load faction : " + path)
#except Exception as e:
# print(e)
# logging.error("Unable to load faction : " + path)
print(factions)
return factions

View File

@ -200,8 +200,8 @@ class FactionSelection(QtWidgets.QWizardPage):
red_faction = db.FACTIONS[self.redFactionSelect.currentText()]
blue_faction = db.FACTIONS[self.blueFactionSelect.currentText()]
red_units = red_faction["units"]
blue_units = blue_faction["units"]
red_units = red_faction.aircrafts
blue_units = blue_faction.aircrafts
blue_txt = ""
for u in blue_units:
@ -218,16 +218,16 @@ class FactionSelection(QtWidgets.QWizardPage):
self.redSideRecap.setText(red_txt)
has_mod = False
if "requirements" in red_faction.keys():
if len(red_faction.requirements.keys()) > 0:
has_mod = True
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>")
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>")
if "requirements" in blue_faction.keys():
if len(blue_faction.requirements.keys()) > 0:
has_mod = True
for mod in blue_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>")
for mod in blue_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>")
if has_mod:
self.requiredMods.setText(self.requiredMods.text() + "</ul>\n\n")

View 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"
}

View File

@ -9,7 +9,7 @@
"F_16C_50",
"A_10C",
"A_10C_2",
"AV8BN",
"AV8BNA",
"UH_1H",
"AH_64D"
],