first working version of the skynetiads plugin

This commit is contained in:
David Pierron 2020-10-22 18:39:54 +02:00
parent fd969020af
commit e024da277b
18 changed files with 10042 additions and 35 deletions

View File

@ -0,0 +1,21 @@
import random
from dcs.vehicles import AirDefence
from game import db
from gen.sam.group_generator import GroupGenerator
class GenericSamGroupGenerator(GroupGenerator):
"""
This is the base for all SAM group generators
"""
def getGroupNamePrefix(self, faction):
if not faction:
return ""
# prefix the SAM site for use with the Skynet IADS plugin
prefix = "BLUE SAM "
if db.FACTIONS[faction]["side"] == "red":
prefix = "RED SAM "
return prefix

View File

@ -8,16 +8,23 @@ from dcs.unit import Vehicle
class GroupGenerator(): class GroupGenerator():
def __init__(self, game, ground_object): def __init__(self, game, ground_object, faction = None):
self.game = game self.game = game
self.go = ground_object self.go = ground_object
self.position = ground_object.position self.position = ground_object.position
self.heading = random.randint(0, 359) self.heading = random.randint(0, 359)
self.vg = unitgroup.VehicleGroup(self.game.next_group_id(), self.go.group_identifier) groupNamePrefix = self.getGroupNamePrefix(faction)
self.vg = unitgroup.VehicleGroup(self.game.next_group_id(), groupNamePrefix + self.go.group_identifier)
wp = self.vg.add_waypoint(self.position, PointAction.OffRoad, 0) wp = self.vg.add_waypoint(self.position, PointAction.OffRoad, 0)
wp.ETA_locked = True wp.ETA_locked = True
def getGroupNamePrefix(self, faction):
if not faction:
return ""
return ""
def generate(self): def generate(self):
raise NotImplementedError raise NotImplementedError

View File

@ -117,7 +117,6 @@ def get_faction_possible_sams_generator(faction: str) -> List[UnitType]:
""" """
return [SAM_MAP[u] for u in get_faction_possible_sams_units(faction)] return [SAM_MAP[u] for u in get_faction_possible_sams_units(faction)]
def generate_anti_air_group(game, parent_cp, ground_object, faction:str): def generate_anti_air_group(game, parent_cp, ground_object, faction:str):
""" """
This generate a SAM group This generate a SAM group
@ -129,7 +128,7 @@ def generate_anti_air_group(game, parent_cp, ground_object, faction:str):
possible_sams = get_faction_possible_sams_units(faction) possible_sams = get_faction_possible_sams_units(faction)
if len(possible_sams) > 0: if len(possible_sams) > 0:
sam = random.choice(possible_sams) sam = random.choice(possible_sams)
generator = SAM_MAP[sam](game, ground_object) generator = SAM_MAP[sam](game, ground_object, faction)
generator.generate() generator.generate()
return generator.get_generated_group() return generator.get_generated_group()
return None return None
@ -149,5 +148,3 @@ def generate_shorad_group(game, parent_cp, ground_object, faction:str):

View File

@ -2,10 +2,10 @@ import random
from dcs.vehicles import AirDefence from dcs.vehicles import AirDefence
from gen.sam.group_generator import GroupGenerator from gen.sam.genericsam_group_generator import GenericSamGroupGenerator
class HawkGenerator(GroupGenerator): class HawkGenerator(GenericSamGroupGenerator):
""" """
This generate an HAWK group This generate an HAWK group
""" """
@ -14,8 +14,8 @@ class HawkGenerator(GroupGenerator):
price = 115 price = 115
def generate(self): def generate(self):
self.add_unit(AirDefence.SAM_Hawk_PCP, "PCP", self.position.x, self.position.y, self.heading)
self.add_unit(AirDefence.SAM_Hawk_SR_AN_MPQ_50, "SR", self.position.x + 20, self.position.y, self.heading) self.add_unit(AirDefence.SAM_Hawk_SR_AN_MPQ_50, "SR", self.position.x + 20, self.position.y, self.heading)
self.add_unit(AirDefence.SAM_Hawk_PCP, "PCP", self.position.x, self.position.y, self.heading)
self.add_unit(AirDefence.SAM_Hawk_TR_AN_MPQ_46, "TR", self.position.x + 40, self.position.y, self.heading) self.add_unit(AirDefence.SAM_Hawk_TR_AN_MPQ_46, "TR", self.position.x + 40, self.position.y, self.heading)
# Triple A for close range defense # Triple A for close range defense

View File

@ -2,10 +2,10 @@ import random
from dcs.vehicles import AirDefence from dcs.vehicles import AirDefence
from gen.sam.group_generator import GroupGenerator from gen.sam.genericsam_group_generator import GenericSamGroupGenerator
class HQ7Generator(GroupGenerator): class HQ7Generator(GenericSamGroupGenerator):
""" """
This generate an HQ7 group This generate an HQ7 group
""" """

View File

@ -2,10 +2,10 @@ import random
from dcs.vehicles import AirDefence from dcs.vehicles import AirDefence
from gen.sam.group_generator import GroupGenerator from gen.sam.genericsam_group_generator import GenericSamGroupGenerator
class PatriotGenerator(GroupGenerator): class PatriotGenerator(GenericSamGroupGenerator):
""" """
This generate a Patriot group This generate a Patriot group
""" """
@ -15,11 +15,11 @@ class PatriotGenerator(GroupGenerator):
def generate(self): def generate(self):
# Command Post # Command Post
self.add_unit(AirDefence.SAM_Patriot_STR_AN_MPQ_53, "ICC", self.position.x + 30, self.position.y + 30, self.heading)
self.add_unit(AirDefence.SAM_Patriot_AMG_AN_MRC_137, "MRC", self.position.x, self.position.y, self.heading) self.add_unit(AirDefence.SAM_Patriot_AMG_AN_MRC_137, "MRC", self.position.x, self.position.y, self.heading)
self.add_unit(AirDefence.SAM_Patriot_ECS_AN_MSQ_104, "MSQ", self.position.x + 30, self.position.y, self.heading) self.add_unit(AirDefence.SAM_Patriot_ECS_AN_MSQ_104, "MSQ", self.position.x + 30, self.position.y, self.heading)
self.add_unit(AirDefence.SAM_Patriot_ICC, "ICC", self.position.x + 60, self.position.y, self.heading) self.add_unit(AirDefence.SAM_Patriot_ICC, "ICC", self.position.x + 60, self.position.y, self.heading)
self.add_unit(AirDefence.SAM_Patriot_EPP_III, "EPP", self.position.x, self.position.y + 30, self.heading) self.add_unit(AirDefence.SAM_Patriot_EPP_III, "EPP", self.position.x, self.position.y + 30, self.heading)
self.add_unit(AirDefence.SAM_Patriot_STR_AN_MPQ_53, "ICC", self.position.x + 30, self.position.y + 30, self.heading)
num_launchers = random.randint(3, 4) num_launchers = random.randint(3, 4)
positions = self.get_circular_position(num_launchers, launcher_distance=120, coverage=360) positions = self.get_circular_position(num_launchers, launcher_distance=120, coverage=360)

View File

@ -2,10 +2,10 @@ import random
from dcs.vehicles import AirDefence from dcs.vehicles import AirDefence
from gen.sam.group_generator import GroupGenerator from gen.sam.genericsam_group_generator import GenericSamGroupGenerator
class RapierGenerator(GroupGenerator): class RapierGenerator(GenericSamGroupGenerator):
""" """
This generate a Rapier Group This generate a Rapier Group
""" """

View File

@ -1,9 +1,9 @@
from dcs.vehicles import AirDefence, Unarmed from dcs.vehicles import AirDefence, Unarmed
from gen.sam.group_generator import GroupGenerator from gen.sam.genericsam_group_generator import GenericSamGroupGenerator
class RolandGenerator(GroupGenerator): class RolandGenerator(GenericSamGroupGenerator):
""" """
This generate a Roland group This generate a Roland group
""" """
@ -12,7 +12,7 @@ class RolandGenerator(GroupGenerator):
price = 40 price = 40
def generate(self): def generate(self):
self.add_unit(AirDefence.SAM_Roland_ADS, "ADS", self.position.x, self.position.y, self.heading)
self.add_unit(AirDefence.SAM_Roland_EWR, "EWR", self.position.x + 40, self.position.y, self.heading) self.add_unit(AirDefence.SAM_Roland_EWR, "EWR", self.position.x + 40, self.position.y, self.heading)
self.add_unit(AirDefence.SAM_Roland_ADS, "ADS", self.position.x, self.position.y, self.heading)
self.add_unit(Unarmed.Transport_M818, "TRUCK", self.position.x + 80, self.position.y, self.heading) self.add_unit(Unarmed.Transport_M818, "TRUCK", self.position.x + 80, self.position.y, self.heading)

View File

@ -2,10 +2,10 @@ import random
from dcs.vehicles import AirDefence from dcs.vehicles import AirDefence
from gen.sam.group_generator import GroupGenerator from gen.sam.genericsam_group_generator import GenericSamGroupGenerator
class SA10Generator(GroupGenerator): class SA10Generator(GenericSamGroupGenerator):
""" """
This generate a SA-10 group This generate a SA-10 group
""" """
@ -14,15 +14,15 @@ class SA10Generator(GroupGenerator):
price = 450 price = 450
def generate(self): def generate(self):
# Command Post
self.add_unit(AirDefence.SAM_SA_10_S_300PS_CP_54K6, "CP", self.position.x, self.position.y, self.heading)
# Search Radar # Search Radar
self.add_unit(AirDefence.SAM_SA_10_S_300PS_SR_5N66M, "SR1", self.position.x, self.position.y + 40, self.heading) self.add_unit(AirDefence.SAM_SA_10_S_300PS_SR_5N66M, "SR1", self.position.x, self.position.y + 40, self.heading)
# Search radar for missiles (optionnal) # Search radar for missiles (optionnal)
self.add_unit(AirDefence.SAM_SA_10_S_300PS_SR_64H6E, "SR2", self.position.x - 40, self.position.y, self.heading) self.add_unit(AirDefence.SAM_SA_10_S_300PS_SR_64H6E, "SR2", self.position.x - 40, self.position.y, self.heading)
# Command Post
self.add_unit(AirDefence.SAM_SA_10_S_300PS_CP_54K6, "CP", self.position.x, self.position.y, self.heading)
# 2 Tracking radars # 2 Tracking radars
self.add_unit(AirDefence.SAM_SA_10_S_300PS_TR_30N6, "TR1", self.position.x - 40, self.position.y - 40, self.heading) self.add_unit(AirDefence.SAM_SA_10_S_300PS_TR_30N6, "TR1", self.position.x - 40, self.position.y - 40, self.heading)

View File

@ -2,10 +2,10 @@ import random
from dcs.vehicles import AirDefence from dcs.vehicles import AirDefence
from gen.sam.group_generator import GroupGenerator from gen.sam.genericsam_group_generator import GenericSamGroupGenerator
class SA11Generator(GroupGenerator): class SA11Generator(GenericSamGroupGenerator):
""" """
This generate a SA-11 group This generate a SA-11 group
""" """
@ -14,8 +14,8 @@ class SA11Generator(GroupGenerator):
price = 180 price = 180
def generate(self): def generate(self):
self.add_unit(AirDefence.SAM_SA_11_Buk_CC_9S470M1, "CC", self.position.x, self.position.y, self.heading)
self.add_unit(AirDefence.SAM_SA_11_Buk_SR_9S18M1, "SR", self.position.x+20, self.position.y, self.heading) self.add_unit(AirDefence.SAM_SA_11_Buk_SR_9S18M1, "SR", self.position.x+20, self.position.y, self.heading)
self.add_unit(AirDefence.SAM_SA_11_Buk_CC_9S470M1, "CC", self.position.x, self.position.y, self.heading)
num_launchers = random.randint(2, 4) num_launchers = random.randint(2, 4)
positions = self.get_circular_position(num_launchers, launcher_distance=140, coverage=180) positions = self.get_circular_position(num_launchers, launcher_distance=140, coverage=180)

View File

@ -2,10 +2,10 @@ import random
from dcs.vehicles import AirDefence from dcs.vehicles import AirDefence
from gen.sam.group_generator import GroupGenerator from gen.sam.genericsam_group_generator import GenericSamGroupGenerator
class SA2Generator(GroupGenerator): class SA2Generator(GenericSamGroupGenerator):
""" """
This generate a SA-2 group This generate a SA-2 group
""" """

View File

@ -2,10 +2,10 @@ import random
from dcs.vehicles import AirDefence from dcs.vehicles import AirDefence
from gen.sam.group_generator import GroupGenerator from gen.sam.genericsam_group_generator import GenericSamGroupGenerator
class SA3Generator(GroupGenerator): class SA3Generator(GenericSamGroupGenerator):
""" """
This generate a SA-3 group This generate a SA-3 group
""" """

View File

@ -2,10 +2,10 @@ import random
from dcs.vehicles import AirDefence from dcs.vehicles import AirDefence
from gen.sam.group_generator import GroupGenerator from gen.sam.genericsam_group_generator import GenericSamGroupGenerator
class SA6Generator(GroupGenerator): class SA6Generator(GenericSamGroupGenerator):
""" """
This generate a SA-6 group This generate a SA-6 group
""" """

View File

@ -1,5 +1,6 @@
[ [
"veaf", "veaf",
"skynetiads",
"jtacautolase", "jtacautolase",
"base" "base"
] ]

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,63 @@
{
"mnemonic": "skynetiads",
"nameInUI": "Skynet IADS",
"defaultValue": false,
"specificOptions": [
{
"nameInUI": "create IADS for RED coalition",
"mnemonic": "createRedIADS",
"defaultValue": true
},
{
"nameInUI": "create IADS for BLUE coalition",
"mnemonic": "createBlueIADS",
"defaultValue": true
},
{
"nameInUI": "Long-range SAM act as EWR for RED coalition",
"mnemonic": "actAsEwrRED",
"defaultValue": true
},
{
"nameInUI": "Long-range SAM act as EWR for BLUE coalition",
"mnemonic": "actAsEwrBLUE",
"defaultValue": true
},
{
"nameInUI": "Include RED IADS in radio menu",
"mnemonic": "includeRedInRadio",
"defaultValue": true
},
{
"nameInUI": "Include BLUE IADS in radio menu",
"mnemonic": "includeBlueInRadio",
"defaultValue": true
},
{
"nameInUI": "Generate debug information for RED IADS",
"mnemonic": "debugRED",
"defaultValue": false
},
{
"nameInUI": "Generate debug information for BLUE IADS",
"mnemonic": "debugBLUE",
"defaultValue": false
}
],
"scriptsWorkOrders": [
{
"file": "mist_4_3_74.lua",
"mnemonic": "mist"
},
{
"file": "skynet-iads-compiled.lua",
"mnemonic": "skynetiads-script"
}
],
"configurationWorkOrders": [
{
"file": "skynetiads-config.lua",
"mnemonic": "skynetiads-config"
}
]
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,130 @@
-------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Mission configuration file for the Skynet-IADS framework
-- see https://github.com/walder/Skynet-IADS
--
-- This configuration is tailored for a mission generated by DCS Liberation
-- see https://github.com/Khopa/dcs_liberation
-------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Skynet-IADS plugin - configuration
env.info("DCSLiberation|Skynet-IADS plugin - configuration")
if dcsLiberation and SkynetIADS then
-- specific options
local createRedIADS = false
local createBlueIADS = false
local actAsEwrRED = false
local actAsEwrBLUE = false
local includeRedInRadio = false
local includeBlueInRadio = false
local debugRED = false
local debugBLUE = false
-- retrieve specific options values
if dcsLiberation.plugins then
if dcsLiberation.plugins.skynetiads then
createRedIADS = dcsLiberation.plugins.skynetiads.createRedIADS
createBlueIADS = dcsLiberation.plugins.skynetiads.createBlueIADS
actAsEwrRED = dcsLiberation.plugins.skynetiads.actAsEwrRED
actAsEwrBLUE = dcsLiberation.plugins.skynetiads.actAsEwrBLUE
includeRedInRadio = dcsLiberation.plugins.skynetiads.includeRedInRadio
includeBlueInRadio = dcsLiberation.plugins.skynetiads.includeBlueInRadio
debugRED = dcsLiberation.plugins.skynetiads.debugRED
debugBLUE = dcsLiberation.plugins.skynetiads.debugBLUE
end
end
env.info(string.format("DCSLiberation|Skynet-IADS plugin - createRedIADS=%s",tostring(createRedIADS)))
env.info(string.format("DCSLiberation|Skynet-IADS plugin - createBlueIADS=%s",tostring(createBlueIADS)))
env.info(string.format("DCSLiberation|Skynet-IADS plugin - actAsEwrRED=%s",tostring(actAsEwrRED)))
env.info(string.format("DCSLiberation|Skynet-IADS plugin - actAsEwrBLUE=%s",tostring(actAsEwrBLUE)))
env.info(string.format("DCSLiberation|Skynet-IADS plugin - includeRedInRadio=%s",tostring(includeRedInRadio)))
env.info(string.format("DCSLiberation|Skynet-IADS plugin - includeBlueInRadio=%s",tostring(includeBlueInRadio)))
env.info(string.format("DCSLiberation|Skynet-IADS plugin - debugRED=%s",tostring(debugRED)))
env.info(string.format("DCSLiberation|Skynet-IADS plugin - debugBLUE=%s",tostring(debugBLUE)))
-- actual configuration code
local function initializeIADS(iads, coalition, actAsEwr, inRadio, debug)
local coalitionPrefix = "BLUE"
if coalition == 1 then
coalitionPrefix = "RED"
end
if debug then
env.info("adding debug information")
local iadsDebug = iads:getDebugSettings()
iadsDebug.IADSStatus = true
iadsDebug.samWentDark = true
iadsDebug.contacts = true
iadsDebug.radarWentLive = true
iadsDebug.noWorkingCommmandCenter = false
iadsDebug.ewRadarNoConnection = false
iadsDebug.samNoConnection = false
iadsDebug.jammerProbability = true
iadsDebug.addedEWRadar = false
iadsDebug.hasNoPower = false
iadsDebug.harmDefence = true
iadsDebug.samSiteStatusEnvOutput = true
iadsDebug.earlyWarningRadarStatusEnvOutput = true
end
--add EW units to the IADS:
iads:addEarlyWarningRadarsByPrefix(coalitionPrefix .. " EW")
--add SAM groups to the IADS:
iads:addSAMSitesByPrefix(coalitionPrefix .. " SAM")
-- specific configurations, for each SAM type
if actAsEwr then
iads:getSAMSitesByNatoName('SA-10'):setActAsEW(true)
iads:getSAMSitesByNatoName('SA-6'):setActAsEW(true)
iads:getSAMSitesByNatoName('Patriot'):setActAsEW(true)
end
-- add the AWACS
if dcsLiberation.AWACs then
for _, data in pairs(dcsLiberation.AWACs) do
env.info(string.format("DCSLiberation|Skynet-IADS plugin - processing AWACS %s", data.dcsGroupName))
local group = Group.getByName(data.dcsGroupName)
if group then
if group:getCoalition() == coalition then
local unit = group:getUnit(1)
if unit then
local unitName = unit:getName()
env.info(string.format("DCSLiberation|Skynet-IADS plugin - adding AWACS %s", unitName))
iads:addEarlyWarningRadar(unitName)
end
end
end
end
end
if inRadio then
--activate the radio menu to toggle IADS Status output
env.info("DCSLiberation|Skynet-IADS plugin - adding in radio menu")
iads:addRadioMenu()
end
--activate the IADS
iads:activate()
end
------------------------------------------------------------------------------------------------------------------------------------------------------------
-- create the IADS networks
-------------------------------------------------------------------------------------------------------------------------------------------------------------
if createRedIADS then
env.info("DCSLiberation|Skynet-IADS plugin - creating red IADS")
redIADS = SkynetIADS:create("IADS")
initializeIADS(redIADS, 1, actAsEwrRED, includeRedInRadio, debugRED) -- RED
end
if createBlueIADS then
env.info("DCSLiberation|Skynet-IADS plugin - creating blue IADS")
blueIADS = SkynetIADS:create("IADS")
initializeIADS(blueIADS, 2, actAsEwrBLUE, includeBlueInRadio, debugBLUE) -- BLUE
end
end