From 8e9129b3b62ca9cfd0b5e275a50613246bc87978 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Wed, 26 Apr 2017 21:31:23 +0200 Subject: [PATCH] Fixed issue #480 --- .../Moose/Tasking/CommandCenter.lua | 16 ++- .../Moose/Tasking/Task_A2G_Dispatcher.lua | 97 ++++++++----------- 2 files changed, 57 insertions(+), 56 deletions(-) diff --git a/Moose Development/Moose/Tasking/CommandCenter.lua b/Moose Development/Moose/Tasking/CommandCenter.lua index f599dc87f..7b05761b1 100644 --- a/Moose Development/Moose/Tasking/CommandCenter.lua +++ b/Moose Development/Moose/Tasking/CommandCenter.lua @@ -9,6 +9,7 @@ -- @extends Core.Base#BASE REPORT = { ClassName = "REPORT", + Title = "", } --- Create a new REPORT. @@ -20,13 +21,24 @@ function REPORT:New( Title ) local self = BASE:Inherit( self, BASE:New() ) -- #REPORT self.Report = {} + + Title = Title or "" if Title then - self.Report[#self.Report+1] = Title + self.Title = Title end return self end +--- Has the REPORT Text? +-- @param #REPORT self +-- @return #boolean +function REPORT:HasText() --R2.1 + + return #self.Report > 0 +end + + --- Set indent of a REPORT. -- @param #REPORT self -- @param #number Indent @@ -61,7 +73,7 @@ end -- @return #string The report text. function REPORT:Text( Delimiter ) Delimiter = Delimiter or "\n" - local ReportText = table.concat( self.Report, Delimiter ) or "" + local ReportText = ( self.Title ~= "" and self.Title .. Delimiter or self.Title ) .. table.concat( self.Report, Delimiter ) or "" return ReportText end diff --git a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua index 91b49f7e1..28842bcab 100644 --- a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua +++ b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua @@ -55,6 +55,7 @@ do -- TASK_A2G_DISPATCHER ClassName = "TASK_A2G_DISPATCHER", Mission = nil, Detection = nil, + Tasks = {}, } @@ -181,14 +182,16 @@ do -- TASK_A2G_DISPATCHER -- @param #TASK_A2G_DISPATCHER self -- @param Tasking.Mission#MISSION Mission -- @param Tasking.Task#TASK Task - -- @param Functional.Detection#DETECTION_AREAS.DetectedItem DetectedItem + -- @param #boolean DetectedItemID + -- @param #boolean DetectedItemChange -- @return Tasking.Task#TASK - function TASK_A2G_DISPATCHER:EvaluateRemoveTask( Mission, Task, DetectedItem ) + function TASK_A2G_DISPATCHER:EvaluateRemoveTask( Mission, Task, DetectedItemID, DetectedItemChanged ) if Task then - if Task:IsStatePlanned() and DetectedItem.Changed == true then + if Task:IsStatePlanned() and DetectedItemChanged == true then self:E( "Removing Tasking: " .. Task:GetTaskName() ) - Task = Mission:RemoveTask( Task ) + Mission:RemoveTask( Task ) + self.Tasks[DetectedItemID] = nil end end @@ -222,74 +225,60 @@ do -- TASK_A2G_DISPATCHER self:E( { "Targets in DetectedItem", DetectedItem.ItemID, DetectedSet:Count(), tostring( DetectedItem ) } ) DetectedSet:Flush() - local ItemID = DetectedItem.ID + local DetectedItemID = DetectedItem.ID + local DetectedItemChanged = DetectedItem.Changed - -- Evaluate SEAD Tasking - local SEADTask = Mission:GetTask( string.format( "SEAD.%03d", ItemID ) ) - SEADTask = self:EvaluateRemoveTask( Mission, SEADTask, DetectedItem ) - if not SEADTask then + local Task = self.Tasks[DetectedItemID] + Task = self:EvaluateRemoveTask( Mission, Task, DetectedItemID, DetectedItemChanged ) -- Task will be removed if it is planned and changed. + + -- Evaluate SEAD + if not Task then local TargetSetUnit = self:EvaluateSEAD( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed... if TargetSetUnit then - local Task = TASK_SEAD:New( Mission, self.SetGroup, string.format( "SEAD.%03d", ItemID ), TargetSetUnit ) + Task = TASK_SEAD:New( Mission, self.SetGroup, string.format( "SEAD.%03d", DetectedItemID ), TargetSetUnit ) + end + + -- Evaluate CAS + if not Task then + local TargetSetUnit = self:EvaluateCAS( DetectedItem ) -- Returns a SetUnit if there are targets to be CASed... + if TargetSetUnit then + Task = TASK_CAS:New( Mission, self.SetGroup, string.format( "CAS.%03d", DetectedItemID ), TargetSetUnit ) + end + + -- Evaluate BAI + if not Task then + local TargetSetUnit = self:EvaluateBAI( DetectedItem, self.Mission:GetCommandCenter():GetPositionable():GetCoalition() ) -- Returns a SetUnit if there are targets to be BAIed... + if TargetSetUnit then + Task = TASK_BAI:New( Mission, self.SetGroup, string.format( "BAI.%03d", DetectedItemID ), TargetSetUnit ) + end + end + end + + if Task then + self.Tasks[DetectedItemID] = Task Task:SetTargetZone( DetectedZone ) Task:SetDispatcher( self ) Task:SetInfo( "Detection", Detection:DetectedItemReportSummary( DetectedItemID ) ) Task:SetInfo( "Changes", Detection:GetChangeText( DetectedItem ) ) - SEADTask = Mission:AddTask( Task ) - TaskReport:Add( Task:GetName() ) + Mission:AddTask( Task ) + else + self:E("This should not happen") end - end - - -- Evaluate CAS Tasking - local CASTask = Mission:GetTask( string.format( "CAS.%03d", ItemID ) ) - CASTask = self:EvaluateRemoveTask( Mission, CASTask, DetectedItem ) - if not CASTask then - local TargetSetUnit = self:EvaluateCAS( DetectedItem ) -- Returns a SetUnit if there are targets to be SEADed... - if TargetSetUnit then - local Task = TASK_CAS:New( Mission, self.SetGroup, string.format( "CAS.%03d", ItemID ), TargetSetUnit ) - Task:SetTargetZone( DetectedZone ) - Task:SetDispatcher( self ) - Task:SetInfo( "Detection", Detection:DetectedItemReportSummary( DetectedItemID ) ) - Task:SetInfo( "Changes", Detection:GetChangeText( DetectedItem ) ) - CASTask = Mission:AddTask( Task ) - TaskReport:Add( Task:GetName() ) - end - end - - -- Evaluate BAI Tasking - local BAITask = Mission:GetTask( string.format( "BAI.%03d", ItemID ) ) - BAITask = self:EvaluateRemoveTask( Mission, BAITask, DetectedItem ) - if not BAITask then - local TargetSetUnit = self:EvaluateBAI( DetectedItem, self.Mission:GetCommandCenter():GetPositionable():GetCoalition() ) -- Returns a SetUnit if there are targets to be SEADed... - if TargetSetUnit then - local Task = TASK_BAI:New( Mission, self.SetGroup, string.format( "BAI.%03d", ItemID ), TargetSetUnit ) - Task:SetTargetZone( DetectedZone ) - Task:SetDispatcher( self ) - Task:SetInfo( "Detection", Detection:DetectedItemReportSummary( DetectedItemID ) ) - Task:SetInfo( "Changes", Detection:GetChangeText( DetectedItem ) ) - BAITask = Mission:AddTask( Task ) - TaskReport:Add( Task:GetName() ) - end - end + + end + + TaskReport:Add( Task:GetName() ) -- OK, so the tasking has been done, now delete the changes reported for the area. Detection:AcceptChanges( DetectedItem ) - end -- TODO set menus using the HQ coordinator Mission:GetCommandCenter():SetMenu() for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do - Mission:GetCommandCenter():MessageToGroup( string.format( "New task(s) %s for mission *%s*. Subscribe to a task using the Mission *Overlord* radio menu.", TaskReport:Text(", "), Mission:GetName() ), TaskGroup ) if not TaskGroup:GetState( TaskGroup, "Assigned" ) then - -- Mission:GetCommandCenter():MessageToGroup( - -- string.format( "HQ Reporting - Planned tasks for mission '%s':\n\n%s\n", - -- self.Mission:GetName(), - -- string.format( "%s\n\n%s\n\n%s\n\n%s", ReportSEAD:Text(), ReportCAS:Text(), ReportBAI:Text(), ReportChanges:Text() - -- ) - -- ), TaskGroup - -- ) + Mission:GetCommandCenter():MessageToGroup( string.format( "Mission *%s* has tasks %s. Subscribe to a task using the Mission *Overlord* radio menu.", Mission:GetName(), TaskReport:Text(", ") ), TaskGroup ) end end