diff --git a/Moose Development/Moose/Ops/Intelligence.lua b/Moose Development/Moose/Ops/Intelligence.lua index 9a3b32925..13fd0eb8f 100644 --- a/Moose Development/Moose/Ops/Intelligence.lua +++ b/Moose Development/Moose/Ops/Intelligence.lua @@ -19,7 +19,7 @@ -- @field #number coalition Coalition side number, e.g. coalition.side.RED. -- @field #table filterCategory Category filters. -- @field Core.Set#SET_ZONE acceptzoneset Set of accept zones. If defined, only contacts in these zones are considered. --- @field Core.Set#SET_ZONE rejectzoneset Set of reject zones. Contacts in these zones are not considered. +-- @field Core.Set#SET_ZONE rejectzoneset Set of reject zones. Contacts in these zones are not considered, even if they are in accept zones. -- @field #table Contacts Table of detected items. -- @field #table ContactsLost Table of lost detected items. -- @field #table ContactsUnknown Table of new detected items. diff --git a/Moose Development/Moose/Ops/Squadron.lua b/Moose Development/Moose/Ops/Squadron.lua index de9ba5c0a..75b37371c 100644 --- a/Moose Development/Moose/Ops/Squadron.lua +++ b/Moose Development/Moose/Ops/Squadron.lua @@ -74,15 +74,15 @@ SQUADRON = { --- SQUADRON class version. -- @field #string version -SQUADRON.version="0.0.3" +SQUADRON.version="0.0.5" ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- TODO list ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- DONE: Engage radius. --- TODO: Modex. --- TODO: Call signs. +-- DONE: Modex. +-- DONE: Call signs. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- Constructor @@ -463,7 +463,7 @@ function SQUADRON:CanMission(Mission) local asset=_asset --#AIRWING.SquadronAsset -- Set range is valid. - if TargetDistance<=self.engageRange then + if TargetDistance<=self.engageRange or (Mission.engageMaxDistance and TargetDistance<=Mission.engageMaxDistance) then -- Check if asset is currently on a mission (STARTED or QUEUED). if self.airwing:IsAssetOnMission(asset) then diff --git a/Moose Development/Moose/Ops/WingCommander.lua b/Moose Development/Moose/Ops/WingCommander.lua index 7162e4794..ce1046fa9 100644 --- a/Moose Development/Moose/Ops/WingCommander.lua +++ b/Moose Development/Moose/Ops/WingCommander.lua @@ -18,6 +18,9 @@ -- @field #string lid Class id string for output to DCS log file. -- @field #table airwings Table of airwings. -- @field #table missionqueue Mission queue. +-- @field Core.Set#SET_ZONE borderzoneset Set of zones defining the border of our territory. +-- @field Core.Set#SET_ZONE yellowzoneset Set of zones defining the extended border. Defcon is set to YELLOW if enemy activity is detected. +-- @field Core.Set#SET_ZONE engagezoneset Set of zones defining the extended border. Defcon is set to YELLOW if enemy activity is detected. -- @extends Ops.Intelligence#INTEL --- Be surprised! @@ -37,6 +40,9 @@ WINGCOMMANDER = { lid = nil, airwings = {}, missionqueue = {}, + borderzoneset = nil, + yellowzoneset = nil, + engagezoneset = nil, } --- Contact details. @@ -44,6 +50,17 @@ WINGCOMMANDER = { -- @field Ops.Auftrag#AUFTRAG mission The assigned mission. -- @extends Ops.Intelligence#INTEL.DetectedItem +--- Defence condition. +-- @type WINGCOMMANDER.DefCon +-- @field #string GREEN No enemy activities detected. +-- @field #string YELLOW Enemy near our border. +-- @field #string RED Enemy within our border. +WINGCOMMANDER.DefCon = { + GREEN="Green", + YELLOW="Yellow", + RED="Red", +} + --- WINGCOMMANDER class version. -- @field #string version WINGCOMMANDER.version="0.0.3" @@ -77,6 +94,8 @@ function WINGCOMMANDER:New(AgentSet, Coalition) -- Set some string id for output to DCS.log file. --self.lid=string.format("WINGCOMMANDER | ") + self:SetBorderZones() + -- Add FSM transitions. -- From State --> Event --> To State self:AddTransition("*", "MissionAssign", "*") -- Mission was assigned to an AIRWING. @@ -173,6 +192,30 @@ function WINGCOMMANDER:RemoveMission(Mission) return self end +--- Set accept zones. Only contacts detected in this/these zone(s) are considered. +-- @param #WINGCOMMANDER self +-- @param Core.Set#SET_ZONE BorderZoneSet Set of zones, defining our borders. +-- @return #WINGCOMMANDER self +function WINGCOMMANDER:SetBorderZones(BorderZoneSet) + self.borderzoneset=BorderZoneSet or SET_ZONE:New() + + for _,zone in pairs(self.borderzoneset.Set) do + self:AddAcceptZone(zone) + end + return self +end + +--- Set accept zones. Only contacts detected in this zone are considered. +-- @param #WINGCOMMANDER self +-- @param Core.Zone#ZONEBorderZone Add a zone to the accept zone set. +-- @return #WINGCOMMANDER self +function WINGCOMMANDER:AddBorderZone(BorderZone) + self.borderzoneset:AddZone(BorderZone) + + self:AddAcceptZone(BorderZone) + return self +end + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -- Start & Status ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- @@ -346,10 +389,10 @@ function WINGCOMMANDER:GetAirwingForMission(Mission) if coord then -- Distance from airwing to target. - local dist=coord:Get2DDistance(airwing:GetCoordinate()) + local dist=UTILS.MetersToNM(coord:Get2DDistance(airwing:GetCoordinate())) -- Add airwing to table of airwings that can. - table.insert(airwings, {airwing=airwing, dist=dist, targetcoord=coord}) + table.insert(airwings, {airwing=airwing, dist=dist, targetcoord=coord, nassets=#assets}) end @@ -360,9 +403,19 @@ function WINGCOMMANDER:GetAirwingForMission(Mission) -- Can anyone? if #airwings>0 then - -- Sort table wrt distace + --- Something like: + -- * Closest airwing that can should be first prio. + -- * However, there should be a certain "quantization". if wing is 50 or 60 NM way should not really matter. In that case, the airwing with more resources should get the job. + local function score(a) + local d=math.round(a.dist/10) + end + + -- Sort table wrt distance and number of assets. + -- Distances within 10 NM are equal and the airwing with more assets is preferred. local function sortdist(a,b) - return a.dist 5.5 ==> 6 + local bd=math.round(b.dist/10) -- dist 63 NM ==> 6.3 ==> 6 + return adb.nassets) end table.sort(airwings, sortdist) diff --git a/Moose Development/Moose/Utilities/Enums.lua b/Moose Development/Moose/Utilities/Enums.lua index e1a88ba97..53b7de569 100644 --- a/Moose Development/Moose/Utilities/Enums.lua +++ b/Moose Development/Moose/Utilities/Enums.lua @@ -80,7 +80,7 @@ ENUMS.WeaponFlag={ -- @field #string PINPOINTSTRIKE Pinpoint strike. -- @field #string RECONNAISSANCE Reconnaissance mission. -- @field #string REFUELLING Refuelling mission. --- @field #string RUNWAYATTAC Attack the runway of an airdrome. +-- @field #string RUNWAYATTACK Attack the runway of an airdrome. -- @field #string SEAD Suppression of Enemy Air Defenses. -- @field #string TRANSPORT Troop transport. ENUMS.MissionTask={