From 755343d02ef6fc983eaaafdcae736f6835ced03b Mon Sep 17 00:00:00 2001 From: FlightControl Date: Wed, 26 Apr 2017 11:33:48 +0200 Subject: [PATCH 01/39] Fixeds for tasking - Fixed the hanging report (I think) - Fixed the routing messages appearing every time again - Fixed the Task menu --- Moose Development/Moose/Core/Fsm.lua | 7 +- .../Moose/Core/ScheduleDispatcher.lua | 6 +- .../Moose/Tasking/CommandCenter.lua | 2 +- Moose Development/Moose/Tasking/Mission.lua | 86 +++++----- Moose Development/Moose/Tasking/Task.lua | 4 +- .../Moose/Tasking/Task_A2G_Dispatcher.lua | 155 +++++++++--------- Moose Development/Moose/Wrapper/Group.lua | 1 - Moose Mission Setup/Moose.lua | 2 +- 8 files changed, 138 insertions(+), 125 deletions(-) diff --git a/Moose Development/Moose/Core/Fsm.lua b/Moose Development/Moose/Core/Fsm.lua index 972071634..8af98362f 100644 --- a/Moose Development/Moose/Core/Fsm.lua +++ b/Moose Development/Moose/Core/Fsm.lua @@ -1003,8 +1003,11 @@ do -- FSM_PROCESS -- @param #FSM_PROCESS self -- @return #FSM_PROCESS function FSM_PROCESS:Remove() - self:T( { self:GetClassNameAndID() } ) - + self:F( { self:GetClassNameAndID() } ) + + self:F( "Clearing Schedules" ) + self.CallScheduler:Clear() + -- Copy Processes for ProcessID, Process in pairs( self:GetProcesses() ) do self:E( { Process} ) diff --git a/Moose Development/Moose/Core/ScheduleDispatcher.lua b/Moose Development/Moose/Core/ScheduleDispatcher.lua index a7962e677..9db739ae1 100644 --- a/Moose Development/Moose/Core/ScheduleDispatcher.lua +++ b/Moose Development/Moose/Core/ScheduleDispatcher.lua @@ -191,7 +191,7 @@ function SCHEDULEDISPATCHER:Start( Scheduler, CallID ) ) end else - for CallID, Schedule in pairs( self.Schedule[Scheduler] ) do + for CallID, Schedule in pairs( self.Schedule[Scheduler] or {} ) do self:Start( Scheduler, CallID ) -- Recursive end end @@ -209,7 +209,7 @@ function SCHEDULEDISPATCHER:Stop( Scheduler, CallID ) Schedule[CallID].ScheduleID = nil end else - for CallID, Schedule in pairs( self.Schedule[Scheduler] ) do + for CallID, Schedule in pairs( self.Schedule[Scheduler] or {} ) do self:Stop( Scheduler, CallID ) -- Recursive end end @@ -218,7 +218,7 @@ end function SCHEDULEDISPATCHER:Clear( Scheduler ) self:F2( { Scheduler = Scheduler } ) - for CallID, Schedule in pairs( self.Schedule[Scheduler] ) do + for CallID, Schedule in pairs( self.Schedule[Scheduler] or {} ) do self:Stop( Scheduler, CallID ) -- Recursive end end diff --git a/Moose Development/Moose/Tasking/CommandCenter.lua b/Moose Development/Moose/Tasking/CommandCenter.lua index f24527cbb..f599dc87f 100644 --- a/Moose Development/Moose/Tasking/CommandCenter.lua +++ b/Moose Development/Moose/Tasking/CommandCenter.lua @@ -161,7 +161,7 @@ function COMMANDCENTER:New( CommandCenterPositionable, CommandCenterName ) local PlayerUnit = EventData.IniUnit for MissionID, Mission in pairs( self:GetMissions() ) do local Mission = Mission -- Tasking.Mission#MISSION - if Mission:IsOngoing() then + if Mission:IsENGAGED() then Mission:AbortUnit( PlayerUnit ) end end diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index 177376bfd..f0bfb9c52 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -26,35 +26,35 @@ function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefi local self = BASE:Inherit( self, FSM:New() ) -- Core.Fsm#FSM - self:SetStartState( "Idle" ) + self:SetStartState( "IDLE" ) - self:AddTransition( "Idle", "Start", "Ongoing" ) + self:AddTransition( "IDLE", "Start", "ENGAGED" ) - --- OnLeave Transition Handler for State Idle. - -- @function [parent=#MISSION] OnLeaveIdle + --- OnLeave Transition Handler for State IDLE. + -- @function [parent=#MISSION] OnLeaveIDLE -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. -- @return #boolean Return false to cancel Transition. - --- OnEnter Transition Handler for State Idle. - -- @function [parent=#MISSION] OnEnterIdle + --- OnEnter Transition Handler for State IDLE. + -- @function [parent=#MISSION] OnEnterIDLE -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. - --- OnLeave Transition Handler for State Ongoing. - -- @function [parent=#MISSION] OnLeaveOngoing + --- OnLeave Transition Handler for State ENGAGED. + -- @function [parent=#MISSION] OnLeaveENGAGED -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. -- @return #boolean Return false to cancel Transition. - --- OnEnter Transition Handler for State Ongoing. - -- @function [parent=#MISSION] OnEnterOngoing + --- OnEnter Transition Handler for State ENGAGED. + -- @function [parent=#MISSION] OnEnterENGAGED -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. @@ -84,18 +84,18 @@ function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefi -- @param #MISSION self -- @param #number Delay The delay in seconds. - self:AddTransition( "Ongoing", "Stop", "Idle" ) + self:AddTransition( "ENGAGED", "Stop", "IDLE" ) - --- OnLeave Transition Handler for State Idle. - -- @function [parent=#MISSION] OnLeaveIdle + --- OnLeave Transition Handler for State IDLE. + -- @function [parent=#MISSION] OnLeaveIDLE -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. -- @return #boolean Return false to cancel Transition. - --- OnEnter Transition Handler for State Idle. - -- @function [parent=#MISSION] OnEnterIdle + --- OnEnter Transition Handler for State IDLE. + -- @function [parent=#MISSION] OnEnterIDLE -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. @@ -125,18 +125,18 @@ function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefi -- @param #MISSION self -- @param #number Delay The delay in seconds. - self:AddTransition( "Ongoing", "Complete", "Completed" ) + self:AddTransition( "ENGAGED", "Complete", "COMPLETED" ) - --- OnLeave Transition Handler for State Completed. - -- @function [parent=#MISSION] OnLeaveCompleted + --- OnLeave Transition Handler for State COMPLETED. + -- @function [parent=#MISSION] OnLeaveCOMPLETED -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. -- @return #boolean Return false to cancel Transition. - --- OnEnter Transition Handler for State Completed. - -- @function [parent=#MISSION] OnEnterCompleted + --- OnEnter Transition Handler for State COMPLETED. + -- @function [parent=#MISSION] OnEnterCOMPLETED -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. @@ -166,18 +166,18 @@ function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefi -- @param #MISSION self -- @param #number Delay The delay in seconds. - self:AddTransition( "*", "Fail", "Failed" ) + self:AddTransition( "*", "Fail", "FAILED" ) - --- OnLeave Transition Handler for State Failed. - -- @function [parent=#MISSION] OnLeaveFailed + --- OnLeave Transition Handler for State FAILED. + -- @function [parent=#MISSION] OnLeaveFAILED -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. -- @return #boolean Return false to cancel Transition. - --- OnEnter Transition Handler for State Failed. - -- @function [parent=#MISSION] OnEnterFailed + --- OnEnter Transition Handler for State FAILED. + -- @function [parent=#MISSION] OnEnterFAILED -- @param #MISSION self -- @param #string From The From State string. -- @param #string Event The Event string. @@ -235,7 +235,7 @@ function MISSION:onbeforeComplete( From, Event, To ) for TaskID, Task in pairs( self:GetTasks() ) do local Task = Task -- Tasking.Task#TASK - if not Task:IsStateSuccess() and not Task:IsStateFailed() and not Task:IsStateAborted() and not Task:IsStateCancelled() then + if not Task:IsStateSuccess() and not Task:IsStateFAILED() and not Task:IsStateAborted() and not Task:IsStateCancelled() then return false -- Mission cannot be completed. Other Tasks are still active. end end @@ -247,7 +247,7 @@ end -- @param #string From -- @param #string Event -- @param #string To -function MISSION:onenterCompleted( From, Event, To ) +function MISSION:onenterCOMPLETED( From, Event, To ) self:GetCommandCenter():MessageToCoalition( "Mission " .. self:GetName() .. " has been completed! Good job guys!" ) end @@ -489,39 +489,39 @@ function MISSION:GetNextTaskID( Task ) return self.Tasks[TaskName].n end ---- Is the @{Mission} **Completed**. +--- Is the @{Mission} **COMPLETED**. -- @param #MISSION self -- @return #boolean -function MISSION:IsCompleted() - return self:Is( "Completed" ) +function MISSION:IsCOMPLETED() + return self:Is( "COMPLETED" ) end ---- Is the @{Mission} **Idle**. +--- Is the @{Mission} **IDLE**. -- @param #MISSION self -- @return #boolean -function MISSION:IsIdle() - return self:Is( "Idle" ) +function MISSION:IsIDLE() + return self:Is( "IDLE" ) end ---- Is the @{Mission} **Ongoing**. +--- Is the @{Mission} **ENGAGED**. -- @param #MISSION self -- @return #boolean -function MISSION:IsOngoing() - return self:Is( "Ongoing" ) +function MISSION:IsENGAGED() + return self:Is( "ENGAGED" ) end ---- Is the @{Mission} **Failed**. +--- Is the @{Mission} **FAILED**. -- @param #MISSION self -- @return #boolean -function MISSION:IsFailed() - return self:Is( "Failed" ) +function MISSION:IsFAILED() + return self:Is( "FAILED" ) end ---- Is the @{Mission} **Hold**. +--- Is the @{Mission} **HOLD**. -- @param #MISSION self -- @return #boolean -function MISSION:IsHold() - return self:Is( "Hold" ) +function MISSION:IsHOLD() + return self:Is( "HOLD" ) end --- Validates if the Mission has a Group @@ -548,7 +548,7 @@ function MISSION:GetTasksRemaining() local TasksRemaining = 0 for TaskID, Task in pairs( self:GetTasks() ) do local Task = Task -- Tasking.Task#TASK - if Task:IsStateSuccess() or Task:IsStateFailed() then + if Task:IsStateSuccess() or Task:IsStateFAILED() then else TasksRemaining = TasksRemaining + 1 end diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index e9519290e..dea1b7ee0 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -558,7 +558,7 @@ function TASK:SetMenu( MenuTime ) --R2.1 Mission Reports and Task Reports added. TaskGroup.MenuReports = MENU_GROUP:New( TaskGroup, "Reports", MissionMenu ) MENU_GROUP_COMMAND:New( TaskGroup, "Report Tasks", TaskGroup.MenuReports, Mission.MenuReportSummary, Mission, TaskGroup ) MENU_GROUP_COMMAND:New( TaskGroup, "Report Planned Tasks", TaskGroup.MenuReports, Mission.MenuReportOverview, Mission, TaskGroup, "Planned" ) - MENU_GROUP_COMMAND:New( TaskGroup, "Report Ongoing Tasks", TaskGroup.MenuReports, Mission.MenuReportOverview, Mission, TaskGroup, "Ongoing" ) + MENU_GROUP_COMMAND:New( TaskGroup, "Report Assigned Tasks", TaskGroup.MenuReports, Mission.MenuReportOverview, Mission, TaskGroup, "Assigned" ) MENU_GROUP_COMMAND:New( TaskGroup, "Report Successful Tasks", TaskGroup.MenuReports, Mission.MenuReportOverview, Mission, TaskGroup, "Success" ) MENU_GROUP_COMMAND:New( TaskGroup, "Report Failed Tasks", TaskGroup.MenuReports, Mission.MenuReportOverview, Mission, TaskGroup, "Failed" ) MENU_GROUP_COMMAND:New( TaskGroup, "Report Held Tasks", TaskGroup.MenuReports, Mission.MenuReportOverview, Mission, TaskGroup, "Hold" ) @@ -796,7 +796,9 @@ function TASK:RemoveStateMachine( TaskUnit ) self:E( self.Fsm ) for TaskUnitT, Fsm in pairs( self.Fsm ) do + local Fsm = Fsm -- Core.Fsm#FSM_PROCESS self:E( TaskUnitT ) + Fsm:Remove() end self.Fsm[TaskUnit] = nil diff --git a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua index db260cfb0..91b49f7e1 100644 --- a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua +++ b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua @@ -208,82 +208,91 @@ do -- TASK_A2G_DISPATCHER local ChangeMsg = {} local Mission = self.Mission - - --- First we need to the detected targets. - for DetectedItemID, DetectedItem in pairs( Detection:GetDetectedItems() ) do - local DetectedItem = DetectedItem -- Functional.Detection#DETECTION_BASE.DetectedItem - local DetectedSet = DetectedItem.Set -- Functional.Detection#DETECTION_BASE.DetectedSet - local DetectedZone = DetectedItem.Zone - self:E( { "Targets in DetectedItem", DetectedItem.ItemID, DetectedSet:Count(), tostring( DetectedItem ) } ) - DetectedSet:Flush() - - local ItemID = DetectedItem.ID - - -- Evaluate SEAD Tasking - local SEADTask = Mission:GetTask( string.format( "SEAD.%03d", ItemID ) ) - SEADTask = self:EvaluateRemoveTask( Mission, SEADTask, DetectedItem ) - if not SEADTask 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:SetTargetZone( DetectedZone ) - Task:SetDispatcher( self ) - Task:SetInfo( "Detection", Detection:DetectedItemReportSummary( DetectedItemID ) ) - Task:SetInfo( "Changes", Detection:GetChangeText( DetectedItem ) ) - SEADTask = Mission:AddTask( Task ) - 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 ) - 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 ) - end - end - - -- OK, so the tasking has been done, now delete the changes reported for the area. - Detection:AcceptChanges( DetectedItem ) - - end + if Mission:IsIDLE() or Mission:IsENGAGED() then - -- TODO set menus using the HQ coordinator - Mission:GetCommandCenter():SetMenu() - - for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do - Mission:GetCommandCenter():MessageToGroup( string.format( "There are %d tasks remaining for mission *%s*. Subscribe to a task using the menu.", Mission:GetTasksRemaining(), 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 --- ) + local TaskReport = REPORT:New() + + --- First we need to the detected targets. + for DetectedItemID, DetectedItem in pairs( Detection:GetDetectedItems() ) do + + local DetectedItem = DetectedItem -- Functional.Detection#DETECTION_BASE.DetectedItem + local DetectedSet = DetectedItem.Set -- Functional.Detection#DETECTION_BASE.DetectedSet + local DetectedZone = DetectedItem.Zone + self:E( { "Targets in DetectedItem", DetectedItem.ItemID, DetectedSet:Count(), tostring( DetectedItem ) } ) + DetectedSet:Flush() + + local ItemID = DetectedItem.ID + + -- Evaluate SEAD Tasking + local SEADTask = Mission:GetTask( string.format( "SEAD.%03d", ItemID ) ) + SEADTask = self:EvaluateRemoveTask( Mission, SEADTask, DetectedItem ) + if not SEADTask 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: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() ) + 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 + + -- 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 + -- ) + end + end + end return true diff --git a/Moose Development/Moose/Wrapper/Group.lua b/Moose Development/Moose/Wrapper/Group.lua index 3964388f1..02bbd7722 100644 --- a/Moose Development/Moose/Wrapper/Group.lua +++ b/Moose Development/Moose/Wrapper/Group.lua @@ -156,7 +156,6 @@ end -- @param #GROUP self -- @return Dcs.DCSWrapper.Group#Group The DCS Group. function GROUP:GetDCSObject() - self:F(self.GroupName) local DCSGroup = Group.getByName( self.GroupName ) if DCSGroup then diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index bd6df9c23..c384faa86 100644 --- a/Moose Mission Setup/Moose.lua +++ b/Moose Mission Setup/Moose.lua @@ -1,5 +1,5 @@ env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20170424_1257' ) +env.info( 'Moose Generation Timestamp: 20170426_1017' ) local base = _G From 8e9129b3b62ca9cfd0b5e275a50613246bc87978 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Wed, 26 Apr 2017 21:31:23 +0200 Subject: [PATCH 02/39] 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 From 858670ab807ac6492dc2169e6bba3aec783e7f65 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Wed, 26 Apr 2017 22:34:17 +0200 Subject: [PATCH 03/39] Improvements --- Moose Development/Moose/Core/Menu.lua | 9 +++++++-- Moose Development/Moose/Tasking/Task.lua | 9 +++++---- Moose Development/Moose/Tasking/Task_A2G.lua | 8 ++++++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Moose Development/Moose/Core/Menu.lua b/Moose Development/Moose/Core/Menu.lua index 8e361f41f..7a6049091 100644 --- a/Moose Development/Moose/Core/Menu.lua +++ b/Moose Development/Moose/Core/Menu.lua @@ -780,7 +780,9 @@ do self = MenuGroup._Menus[Path] else self = BASE:Inherit( self, MENU_BASE:New( MenuText, ParentMenu ) ) - MenuGroup._Menus[Path] = self + if MenuGroup:IsAlive() then + MenuGroup._Menus[Path] = self + end self.MenuGroup = MenuGroup self.Path = Path @@ -883,7 +885,10 @@ do self:T( { "Re-using Group Command Menu:", MenuGroup:GetName(), MenuText } ) else self = BASE:Inherit( self, MENU_COMMAND_BASE:New( MenuText, ParentMenu, CommandMenuFunction, arg ) ) - MenuGroup._Menus[Path] = self + + if MenuGroup:IsAlive() then + MenuGroup._Menus[Path] = self + end self.Path = Path self.MenuGroup = MenuGroup diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index dea1b7ee0..70d97867d 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -283,7 +283,6 @@ function TASK:AbortUnit( PlayerUnit ) if #PlayerGroup:GetUnits() == 1 then self:UnAssignFromGroup( PlayerGroup ) PlayerGroup:SetState( PlayerGroup, "Assigned", nil ) - self:RemoveMenuForGroup( PlayerGroup ) end self:Abort() self:PlayerAborted( PlayerUnit ) @@ -322,7 +321,6 @@ function TASK:CrashUnit( PlayerUnit ) self:E( { TaskGroup = PlayerGroup:GetName(), GetUnits = PlayerGroup:GetUnits() } ) if #PlayerGroup:GetUnits() == 1 then PlayerGroup:SetState( PlayerGroup, "Assigned", nil ) - self:RemoveMenuForGroup( PlayerGroup ) end self:PlayerCrashed( PlayerUnit ) end @@ -357,17 +355,18 @@ end -- @param Wrapper.Group#GROUP TaskGroup -- @return #TASK function TASK:AssignToGroup( TaskGroup ) - self:F2( TaskGroup:GetName() ) + self:F( TaskGroup:GetName() ) local TaskGroupName = TaskGroup:GetName() TaskGroup:SetState( TaskGroup, "Assigned", self ) + self:E("Task is assigned to " .. TaskGroup:GetName() ) + local Mission = self:GetMission() local MissionMenu = Mission:GetMenu( TaskGroup ) MissionMenu:RemoveSubMenus() - --self:RemoveMenuForGroup( TaskGroup ) self:SetAssignedMenuForGroup( TaskGroup ) local TaskUnits = TaskGroup:GetUnits() @@ -482,6 +481,8 @@ function TASK:UnAssignFromGroup( TaskGroup ) TaskGroup:SetState( TaskGroup, "Assigned", nil ) + self:E("Task is unassigned from " .. TaskGroup:GetName() ) + self:RemoveAssignedMenuForGroup( TaskGroup ) local TaskUnits = TaskGroup:GetUnits() diff --git a/Moose Development/Moose/Tasking/Task_A2G.lua b/Moose Development/Moose/Tasking/Task_A2G.lua index 6814847bd..17162ca7f 100644 --- a/Moose Development/Moose/Tasking/Task_A2G.lua +++ b/Moose Development/Moose/Tasking/Task_A2G.lua @@ -93,8 +93,6 @@ do -- TASK_A2G self.TargetSetUnit = TargetSetUnit self.TaskType = TaskType - Mission:AddTask( self ) - local Fsm = self:GetUnitProcess() @@ -374,6 +372,8 @@ do -- TASK_SEAD local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "SEAD" ) ) -- #TASK_SEAD self:F() + Mission:AddTask( self ) + return self end @@ -403,6 +403,8 @@ do -- TASK_BAI local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "BAI" ) ) -- #TASK_BAI self:F() + Mission:AddTask( self ) + return self end @@ -432,6 +434,8 @@ do -- TASK_CAS local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "CAS" ) ) -- #TASK_CAS self:F() + Mission:AddTask( self ) + return self end From c5587304f7d2cc811d29b5418c28eaa97a94263d Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 27 Apr 2017 10:12:48 +0200 Subject: [PATCH 04/39] Trace every event. Some stuff is fishy on MP --- Moose Development/Moose/Core/Event.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index 8bbaeade6..8c2dbb2f4 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -748,6 +748,8 @@ function EVENT:onEvent( Event ) local EventMeta = _EVENTMETA[Event.id] + + self:E( { EventMeta.Text, Event } ) if self and self.Events and self.Events[Event.id] then @@ -863,7 +865,7 @@ function EVENT:onEvent( Event ) local PriorityBegin = PriorityOrder == -1 and 5 or 1 local PriorityEnd = PriorityOrder == -1 and 1 or 5 - if Event.IniObjectCategory ~= 3 then + if Event.IniObjectCategory ~= Object.Category.STATIC then self:E( { EventMeta.Text, Event, Event.IniDCSUnitName, Event.TgtDCSUnitName, PriorityOrder } ) end From 5a2594853c61dac6025702bb517ad05f242a9580 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 27 Apr 2017 10:22:29 +0200 Subject: [PATCH 05/39] Remove static event trace of tires --- Moose Development/Moose/Core/Event.lua | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index 8c2dbb2f4..f16df7b81 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -876,8 +876,10 @@ function EVENT:onEvent( Event ) -- Okay, we got the event from DCS. Now loop the SORTED self.EventSorted[] table for the received Event.id, and for each EventData registered, check if a function needs to be called. for EventClass, EventData in pairs( self.Events[Event.id][EventPriority] ) do - self:E( { "Evaluating: ", EventClass:GetClassNameAndID() } ) - + if Event.IniObjectCategory ~= Object.Category.STATIC then + self:E( { "Evaluating: ", EventClass:GetClassNameAndID() } ) + end + Event.IniGroup = GROUP:FindByName( Event.IniDCSGroupName ) Event.TgtGroup = GROUP:FindByName( Event.TgtDCSGroupName ) From 26033a4172ca153cf4491d360a5c328bc98875c2 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 27 Apr 2017 12:11:09 +0200 Subject: [PATCH 06/39] Check players --- Moose Development/Moose/Core/Database.lua | 34 +++++++++++++++++++++-- Moose Development/Moose/Core/Event.lua | 17 ++++++++++-- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/Moose Development/Moose/Core/Database.lua b/Moose Development/Moose/Core/Database.lua index eebce2873..2ce9d7928 100644 --- a/Moose Development/Moose/Core/Database.lua +++ b/Moose Development/Moose/Core/Database.lua @@ -51,6 +51,7 @@ DATABASE = { ClientsByID = {}, }, UNITS = {}, + UNITS_Index = {}, STATICS = {}, GROUPS = {}, PLAYERS = {}, @@ -99,7 +100,7 @@ function DATABASE:New() self:HandleEvent( EVENTS.DeleteCargo ) -- Follow alive players and clients - self:HandleEvent( EVENTS.PlayerEnterUnit, self._EventOnPlayerEnterUnit ) +-- self:HandleEvent( EVENTS.PlayerEnterUnit, self._EventOnPlayerEnterUnit ) self:HandleEvent( EVENTS.PlayerLeaveUnit, self._EventOnPlayerLeaveUnit ) self:_RegisterTemplates() @@ -108,6 +109,33 @@ function DATABASE:New() self:_RegisterStatics() self:_RegisterPlayers() self:_RegisterAirbases() + + self.UNITS_Position = 0 + + --- @param Wrapper.Unit#UNIT PlayerUnit + local function CheckPlayers( self ) + + local UNITS_Count = #self.UNITS_Index + if UNITS_Count > 0 then + self.UNITS_Position = ( ( self.UNITS_Position <= UNITS_Count ) and self.UNITS_Position + 1 ) or 1 + local PlayerUnit = self.UNITS[self.UNITS_Index[self.UNITS_Position]] + if PlayerUnit then + local UnitName = PlayerUnit:GetName() + local PlayerName = PlayerUnit:GetPlayerName() + self:E( { UNITS_Count, self.UNITS_Position, UnitName, PlayerName } ) + if PlayerName and PlayerName ~= "" then + if not self.PLAYERS[PlayerName] or self.PLAYERS[PlayerName] ~= PlayerUnit then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self:AddPlayer( UnitName, PlayerName ) + _EVENTDISPATCHER:CreateEventPlayerEnterUnit( PlayerUnit ) + end + end + end + end + end + + self:E( "Scheduling" ) + local PlayerCheckSchedule = SCHEDULER:New( nil, CheckPlayers, { self }, 2, 0.05 ) return self end @@ -130,6 +158,8 @@ function DATABASE:AddUnit( DCSUnitName ) if not self.UNITS[DCSUnitName] then local UnitRegister = UNIT:Register( DCSUnitName ) self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) + + table.insert( self.UNITS_Index, DCSUnitName ) end return self.UNITS[DCSUnitName] @@ -140,7 +170,7 @@ end -- @param #DATABASE self function DATABASE:DeleteUnit( DCSUnitName ) - --self.UNITS[DCSUnitName] = nil + self.UNITS[DCSUnitName] = nil end --- Adds a Static based on the Static Name in the DATABASE. diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index f16df7b81..f37e590df 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -730,6 +730,21 @@ do -- Event Creation world.onEvent( Event ) end + --- Creation of a S_EVENT_PLAYER_ENTER_UNIT Event. + -- @param #EVENT self + -- @param Wrapper.Unit#UNIT PlayerUnit. + function EVENT:CreateEventPlayerEnterUnit( PlayerUnit ) + self:F( { PlayerUnit } ) + + local Event = { + id = EVENTS.PlayerEnterUnit, + time = timer.getTime(), + initiator = PlayerUnit:GetDCSObject() + } + + world.onEvent( Event ) + end + end --- @param #EVENT self @@ -749,8 +764,6 @@ function EVENT:onEvent( Event ) local EventMeta = _EVENTMETA[Event.id] - self:E( { EventMeta.Text, Event } ) - if self and self.Events and self.Events[Event.id] then if Event.initiator then From c7d60277344291731af43905631a3cf64570b38d Mon Sep 17 00:00:00 2001 From: FlightControl Date: Wed, 3 May 2017 12:05:15 +0200 Subject: [PATCH 07/39] Optimizations for detection -- Detected range will now correctly update between detections. -- Detected known or unknown type will now be correctly reported. -- Detected distance is now correctly estimated or known. -- Removed visual detection, because it just is not working correctly. -- Cleaned up the code. -- Added new fields in DetectedObject structure. -- Added parameters for IsTargetDetected API --- .../Moose/Functional/Detection.lua | 121 +++++++++++++----- .../Moose/Wrapper/Controllable.lua | 2 +- 2 files changed, 93 insertions(+), 30 deletions(-) diff --git a/Moose Development/Moose/Functional/Detection.lua b/Moose Development/Moose/Functional/Detection.lua index 418767218..82819ae37 100644 --- a/Moose Development/Moose/Functional/Detection.lua +++ b/Moose Development/Moose/Functional/Detection.lua @@ -273,10 +273,16 @@ do -- DETECTION_BASE --- @type DETECTION_BASE.DetectedObject -- @field #string Name - -- @field #boolean Visible + -- @field #boolean IsVisible + -- @field #boolean KnowType + -- @field #boolean KnowDistance -- @field #string Type -- @field #number Distance -- @field #boolean Identified + -- @field #number LastTime + -- @field #boolean LastPos + -- @field #number LastVelocity + --- @type DETECTION_BASE.DetectedItems -- @list <#DETECTION_BASE.DetectedItem> @@ -309,12 +315,12 @@ do -- DETECTION_BASE self.DetectionInterval = 30 - self:InitDetectVisual( false ) - self:InitDetectOptical( false ) - self:InitDetectRadar( false ) - self:InitDetectRWR( false ) - self:InitDetectIRST( false ) - self:InitDetectDLINK( false ) + self:InitDetectVisual( nil ) + self:InitDetectOptical( nil ) + self:InitDetectRadar( nil ) + self:InitDetectRWR( nil ) + self:InitDetectIRST( nil ) + self:InitDetectDLINK( nil ) self:FilterCategories( { Unit.Category.AIRPLANE, @@ -531,6 +537,7 @@ do -- DETECTION_BASE self:T( { "DetectionGroup is Alive", DetectionGroup:GetName() } ) local DetectionGroupName = DetectionGroup:GetName() + local DetectionUnit = DetectionGroup:GetUnit(1) local DetectedUnits = {} @@ -550,6 +557,18 @@ do -- DETECTION_BASE if DetectedObject and DetectedObject:isExist() and DetectedObject.id_ < 50000000 then -- and ( DetectedObject:getCategory() == Object.Category.UNIT or DetectedObject:getCategory() == Object.Category.STATIC ) then + local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity = DetectionUnit:IsTargetDetected( + DetectedObject, + self.DetectVisual, + self.DetectOptical, + self.DetectRadar, + self.DetectIRST, + self.DetectRWR, + self.DetectDLINK + ) + + self:T( { TargetIsDetected = TargetIsDetected, TargetIsVisible = TargetIsVisible, TargetLastTime = TargetLastTime, TargetKnowType = TargetKnowType, TargetKnowDistance = TargetKnowDistance, TargetLastPos = TargetLastPos, TargetLastVelocity = TargetLastVelocity } ) + local DetectionAccepted = true local DetectedObjectName = DetectedObject:getName() @@ -648,12 +667,14 @@ do -- DETECTION_BASE HasDetectedObjects = true - if not self.DetectedObjects[DetectedObjectName] then - self.DetectedObjects[DetectedObjectName] = {} - end + self.DetectedObjects[DetectedObjectName] = self.DetectedObjects[DetectedObjectName] or {} self.DetectedObjects[DetectedObjectName].Name = DetectedObjectName - self.DetectedObjects[DetectedObjectName].Visible = Detection.visible - self.DetectedObjects[DetectedObjectName].Type = Detection.type + self.DetectedObjects[DetectedObjectName].IsVisible = TargetIsVisible + self.DetectedObjects[DetectedObjectName].LastTime = TargetLastTime + self.DetectedObjects[DetectedObjectName].LastPos = TargetLastPos + self.DetectedObjects[DetectedObjectName].LastVelocity = TargetLastVelocity + self.DetectedObjects[DetectedObjectName].KnowType = TargetKnowType + self.DetectedObjects[DetectedObjectName].KnowDistance = Detection.distance -- TargetKnowDistance self.DetectedObjects[DetectedObjectName].Distance = Distance local DetectedUnit = UNIT:FindByName( DetectedObjectName ) @@ -1435,7 +1456,6 @@ do -- DETECTION_UNITS for DetectedItemID, DetectedItem in pairs( self.DetectedItems ) do local DetectedItemSet = DetectedItem.Set -- Core.Set#SET_UNIT - local DetectedTypeName = DetectedItem.Type for DetectedUnitName, DetectedUnitData in pairs( DetectedItemSet:GetSet() ) do local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT @@ -1450,6 +1470,17 @@ do -- DETECTION_UNITS -- Yes, the DetectedUnit is still detected or exists. Flag as identified. self:IdentifyDetectedObject( DetectedObject ) + + -- Update the detection with the new data provided. + DetectedItem.TypeName = DetectedUnit:GetTypeName() + DetectedItem.Name = DetectedObject.Name + DetectedItem.IsVisible = DetectedObject.IsVisible + DetectedItem.LastTime = DetectedObject.LastTime + DetectedItem.LastPos = DetectedObject.LastPos + DetectedItem.LastVelocity = DetectedObject.LastVelocity + DetectedItem.KnowType = DetectedObject.KnowType + DetectedItem.KnowDistance = DetectedObject.KnowDistance + DetectedItem.Distance = DetectedObject.Distance else -- There was no DetectedObject, remove DetectedUnit from the Set. self:AddChangeUnit( DetectedItem, "RU", DetectedUnitName ) @@ -1474,10 +1505,15 @@ do -- DETECTION_UNITS if not DetectedItem then self:T( "Added new DetectedItem" ) DetectedItem = self:AddDetectedItem( "UNIT", DetectedUnitName ) - DetectedItem.Type = DetectedUnit:GetTypeName() - DetectedItem.Name = DetectedObjectData.Name - DetectedItem.Visible = DetectedObjectData.Visible - DetectedItem.Distance = DetectedObjectData.Distance + DetectedItem.TypeName = DetectedUnit:GetTypeName() + DetectedItem.Name = DetectedObject.Name + DetectedItem.IsVisible = DetectedObject.IsVisible + DetectedItem.LastTime = DetectedObject.LastTime + DetectedItem.LastPos = DetectedObject.LastPos + DetectedItem.LastVelocity = DetectedObject.LastVelocity + DetectedItem.KnowType = DetectedObject.KnowType + DetectedItem.KnowDistance = DetectedObject.KnowDistance + DetectedItem.Distance = DetectedObject.Distance end DetectedItem.Set:AddUnit( DetectedUnit ) @@ -1557,19 +1593,27 @@ do -- DETECTION_UNITS if DetectedItemUnit and DetectedItemUnit:IsAlive() then self:T(DetectedItemUnit) - local UnitCategoryName = DetectedItemUnit:GetCategoryName() or "" - local UnitCategoryType = DetectedItemUnit:GetTypeName() or "" - if DetectedItem.Type and UnitCategoryName and UnitCategoryType then - UnitCategoryText = UnitCategoryName .. " (" .. UnitCategoryType .. ") at " + if DetectedItem.KnowType then + local UnitCategoryName = DetectedItemUnit:GetCategoryName() + if UnitCategoryName then + UnitCategoryText = UnitCategoryName + end + if DetectedItem.TypeName then + UnitCategoryText = UnitCategoryText .. " (" .. DetectedItem.TypeName .. ")" + end else - UnitCategoryText = "Unknown target at " + UnitCategoryText = "Unknown" end - if DetectedItem.Visible == false then - UnitDistanceText = string.format( "%.2f", DetectedItem.Distance ) .. " km, estimated" + if DetectedItem.KnowDistance then + if DetectedItem.IsVisible then + UnitDistanceText = " at " .. string.format( "%.2f", DetectedItem.Distance ) .. " km" + end else - UnitDistanceText = string.format( "%.2f", DetectedItem.Distance ) .. " km, visual" + if DetectedItem.IsVisible then + UnitDistanceText = " at +/- " .. string.format( "%.0f", DetectedItem.Distance ) .. " km" + end end local DetectedItemCoordinate = DetectedItemUnit:GetCoordinate() @@ -1699,7 +1743,7 @@ do -- DETECTION_TYPES for DetectedItemID, DetectedItem in pairs( self.DetectedItems ) do local DetectedItemSet = DetectedItem.Set -- Core.Set#SET_UNIT - local DetectedTypeName = DetectedItem.Type + local DetectedTypeName = DetectedItem.TypeName for DetectedUnitName, DetectedUnitData in pairs( DetectedItemSet:GetSet() ) do local DetectedUnit = DetectedUnitData -- Wrapper.Unit#UNIT @@ -1736,7 +1780,7 @@ do -- DETECTION_TYPES local DetectedItem = self:GetDetectedItem( DetectedTypeName ) if not DetectedItem then DetectedItem = self:AddDetectedItem( "TYPE", DetectedTypeName ) - DetectedItem.Type = DetectedUnit:GetTypeName() + DetectedItem.TypeName = DetectedUnit:GetTypeName() end DetectedItem.Set:AddUnit( DetectedUnit ) @@ -1808,7 +1852,7 @@ do -- DETECTION_TYPES local ThreatLevelA2G = DetectedSet:CalculateThreatLevelA2G() local DetectedItemsCount = DetectedSet:Count() - local DetectedItemType = DetectedItem.Type + local DetectedItemType = DetectedItem.TypeName local DetectedItemUnit = DetectedSet:GetFirst() @@ -1967,7 +2011,7 @@ do -- DETECTION_AREAS local ThreatLevelA2G = self:GetTreatLevelA2G( DetectedItem ) local DetectedItemsCount = DetectedSet:Count() local DetectedItemsTypes = DetectedSet:GetTypeNames() - + local ReportSummary = string.format( "%s - %s - Threat:[%s](%2d)\n %2d of %s", DetectedItemID, @@ -1983,6 +2027,25 @@ do -- DETECTION_AREAS return nil end + + --- Report detailed of a detection result. + -- @param #DETECTION_AREAS self + -- @return #string + function DETECTION_AREAS:DetectedReportDetailed() --R2.1 Fixed missing report + self:F() + + local Report = REPORT:New( "Detected areas:" ) + for DetectedItemIndex, DetectedItem in pairs( self.DetectedItems ) do + local DetectedItem = DetectedItem -- #DETECTION_BASE.DetectedItem + local ReportSummary = self:DetectedItemReportSummary( DetectedItemIndex ) + Report:Add( ReportSummary ) + end + + local ReportText = Report:Text() + + return ReportText + end + --- Returns if there are friendlies nearby the FAC units ... diff --git a/Moose Development/Moose/Wrapper/Controllable.lua b/Moose Development/Moose/Wrapper/Controllable.lua index 21a67981b..ec62872f1 100644 --- a/Moose Development/Moose/Wrapper/Controllable.lua +++ b/Moose Development/Moose/Wrapper/Controllable.lua @@ -1782,7 +1782,7 @@ function CONTROLLABLE:GetDetectedTargets( DetectVisual, DetectOptical, DetectRad return nil end -function CONTROLLABLE:IsTargetDetected( DCSObject ) +function CONTROLLABLE:IsTargetDetected( DCSObject, DetectVisual, DetectOptical, DetectRadar, DetectIRST, DetectRWR, DetectDLINK ) self:F2( self.ControllableName ) local DCSControllable = self:GetDCSObject() From 7b2f0fda9c393e46a38aaef749b03fbbef9e51fe Mon Sep 17 00:00:00 2001 From: Grey-Echo Date: Wed, 3 May 2017 16:35:34 +0200 Subject: [PATCH 08/39] Update to the documentation generation process Include a doc update too. --- .../Moose DOCUMENTATION Generate.launch | 2 +- Utils/GenerateDocumentations.bat | 13 + .../Generate.bat | 10 + .../bin/SlateDocGenerator2.exe | Bin 0 -> 904704 bytes .../bin/TreeHierarchy.csv | 35 ++ .../src/DataStorer.au3 | 174 ++++++ .../src/Parser.au3 | 460 ++++++++++++++ .../src/SlateGenerator2.au3 | 310 ++++++++++ .../src/Writer.au3 | 209 +++++++ docs/Documentation/AI_Patrol.html | 3 + docs/Documentation/CommandCenter.html | 148 +++++ docs/Documentation/Controllable.html | 36 +- docs/Documentation/Database.html | 43 ++ docs/Documentation/Designate.html | 21 +- docs/Documentation/Detection.html | 370 ++++++++++- docs/Documentation/Fsm.html | 3 +- docs/Documentation/Mission.html | 244 +++++--- docs/Documentation/Movement.html | 4 - docs/Documentation/Point.html | 575 ++++++++++++++++-- docs/Documentation/Positionable.html | 34 ++ docs/Documentation/Spawn.html | 12 +- docs/Documentation/Task.html | 59 ++ docs/Documentation/Task_A2G_Dispatcher.html | 36 +- docs/Documentation/Utils.html | 35 ++ docs/Documentation/Zone.html | 33 + 25 files changed, 2695 insertions(+), 174 deletions(-) create mode 100644 Utils/GenerateDocumentations.bat create mode 100644 Utils/Slate Documentation Generator/Generate.bat create mode 100644 Utils/Slate Documentation Generator/bin/SlateDocGenerator2.exe create mode 100644 Utils/Slate Documentation Generator/bin/TreeHierarchy.csv create mode 100644 Utils/Slate Documentation Generator/src/DataStorer.au3 create mode 100644 Utils/Slate Documentation Generator/src/Parser.au3 create mode 100644 Utils/Slate Documentation Generator/src/SlateGenerator2.au3 create mode 100644 Utils/Slate Documentation Generator/src/Writer.au3 diff --git a/Moose Development/LDT External Tools/Moose DOCUMENTATION Generate.launch b/Moose Development/LDT External Tools/Moose DOCUMENTATION Generate.launch index 85f0a3b46..43f710ca8 100644 --- a/Moose Development/LDT External Tools/Moose DOCUMENTATION Generate.launch +++ b/Moose Development/LDT External Tools/Moose DOCUMENTATION Generate.launch @@ -3,6 +3,6 @@ - + diff --git a/Utils/GenerateDocumentations.bat b/Utils/GenerateDocumentations.bat new file mode 100644 index 000000000..d106f5189 --- /dev/null +++ b/Utils/GenerateDocumentations.bat @@ -0,0 +1,13 @@ +@echo off + +:: Generate Luadocumentor documentation +echo Generating LuaDocumentor Documentation +echo -------------------------------------- +call luadocumentor.bat + +:: Generate Slate documentation +echo Generating Slate Documentation +echo ------------------------------ +cd "Slate Documentation Generator" +call Generate.bat +cd .. \ No newline at end of file diff --git a/Utils/Slate Documentation Generator/Generate.bat b/Utils/Slate Documentation Generator/Generate.bat new file mode 100644 index 000000000..592061d18 --- /dev/null +++ b/Utils/Slate Documentation Generator/Generate.bat @@ -0,0 +1,10 @@ +:: Generate the Markdown doc +"./bin/SlateDocGenerator2.exe" "../../../MOOSE/Moose Development/Moose" ../../../slate/source + +:: Do some cleanup +del /s /q "TreeHierarchySorted.csv" +del /s /q "FuctionList.txt" +rmdir /s /q "./bin/TEMP" + +:: Copy the Images that go with the documentation +robocopy ../../docs/Presentations ../../../slate/source/includes/Pictures /MIR /NJH /NJS diff --git a/Utils/Slate Documentation Generator/bin/SlateDocGenerator2.exe b/Utils/Slate Documentation Generator/bin/SlateDocGenerator2.exe new file mode 100644 index 0000000000000000000000000000000000000000..ad688e4b7c87a54943a46a757268dfb76bd6d63d GIT binary patch literal 904704 zcmeEvkAD+ zvkMv8MIZG%^%TM2y?E!HoO%+}!-Q~2P!90NqadiLc=q1pFen!m%`xw{dNu)kp1aTc z2fXOc^z?LBS65e8S5;R}iWfX0B}$TH#m_J#sTp_r=MvZdd~sMLX~<=743SntD#l1@AZFgkW1b>nF^Iv36pIw%D&%I0U7@v|d zC@T(n#PUZUopVudYu_)mAfwfb=Y6l_wU*&t>AJG@R&h^n{Yu<3TJOYtVW7Tsp}61M zT8sOfi~iMGBO;t<$dptNmp0~TkMkbnN5Yq@5H?&MasTUl3K( z$?;|}NqHF6j}4ZjIk@k^{k(rJbYpzY@|xR`C;Ey$OCI!j1n%eka}m6nJMO+01*z{6 zXdu<#z6kg8{<$P++If%vKl%Saft}OyXGwhW)LRNlsS+$c%aUs1-d z&5Yx@$cR$L29Z&Hg3@*7%gS+h`8{RaV`h9i92qgnSR^t^`RyDz|Dv3kB4>-EY?f5Y zT-GE?czGpws`{cGc>gmK#1q#e<6_FV#LVynk&#XrHZ!B6*dkS5P8p{&2K^ZD7yK+3|%uDii#>bDMdfG?UMNw?hpeWc`WUW#O-WDK8yyN|Q8 z7OA|FwO1_MZI#M=?4a)lY+8j~t8-`-sai#vR*|VyWbtLdKz~(JH2B6)w#)OY?X&&s@zjU-K-|JWDjsQa%l(11Z|35C%)z)rf0k*F(5= zcvjD&+qwo^9|5ilf$4Ap-QfVT>c)qVXES$uB^SXecd)B zEENmee8%vJr;DUr+x-|@wx4es2E1d2lFEiV=FgJY{y+k=K4@g~R*0I4-41CU>slOL znk-R5?MmB86@4sd^ZWSSsLN7BHS1cIqt>TN!RzvZb~*GqxR$w79f+ft#fah$DGM&btY1SBKq;5o7+fSC2E z2dUE9{h+L*KL+IE0F}`K)*&>ZuCbpr;Yms%9t{tvkhJ1%kU?{I zMTv8XRNjE(FZJf299pqWbK6;t{Ca4Z11km_s16)!;i%P{nH%-yYjE-2wp?}$MffPrkzBLyAqUVt(D+Tw0=U|G=Km_cK!-)jWB zokz-yV6PF3`FRL%ax3h06WRXAIwC;C=g{1zP9N6hQ5PC=Y|G2k-8L8UlDbbDMq(>o zLQf<~8dkB2kbKv9^2t#_%kRGh1N|_XHzo%+EhYOZ`1w+bV!{ z<{eft$G#g;spZnd_McV0m)nH=fCVF>c*i)uLO;lyH`Kfa3(Eyf(-)W=-+^xU^6k< zc^FI|pXTJNq-`q}efvEtMja_BasaGQvm8np(~@LIWcOBTkISs!6i zL-QkG_KTEM3@y=wFB$|XCK${isVj?&;NQ@uy*dZdFggoBh;5F?)UHL~nto&+rs4hS6yj%SOq z?Cgf96D%NlNub98beu)4v^2=!8K}+L^xp$Q;R`lN-+TTj-w92R__H(ozT((oE(VPZ z#7>ifW7L#GST4X`sgRyn4a8Eg8%seT`8;lLNSY|8e+ISeYy2LRuhwd_EvMTl8<`&}0-~2iN}HNo|L0xXzSAKcFsdm*U;bV2jV3 zv+qHlH(59!Gc3;Fr!knKYTYb@#gs%=H_KmU40nNPAW8YH5Ip+BtW%AafTKZBHJT)c zekT%R(y3LTo)4@UkOLPDg{lOxK=8@3kU@C4F5OzDwGvo;z6zr3Rj!u?n1cGODcl@w~>OF)dO&m~Hw zSj4{ggH4KlgPcG@w2p3;Xf1A~(c6Il9>(GZW)e#Q+d-3-?S~`}_b5}qEM-`AZF$=p z(2?LxtinpG(k9ek>#1a3H!_nok@oS+Pg#h+%28$5!hi*nZn80azL+B<@WL&@OD}BT z6MajrMcD-i7QKb-XEz9G%8IifsDnv6X^u1Zm^Yq4K&jybK87= zr@;iFBOYsRPH-Vs%S3nDRHA|$abYxB9hOmhV`wt1ern97jD*UlO+V{ES8z*>6j~}Z zkG+CaEuo6pBE=3q1ZIr7Ce={hj})hJ2~T<_%hsQ!R*TaBaP3|o>cvdANx@tDRDv>N zl9gm`a2y6PIK~KO8No~=m<|#Xr+SUynb3_{H`pXAXYoX3SXp4GF+3Hs#2d)Qv~0w% z=RQa3y&T!HDNzyz$l~4E(rCjtZRk&;b+s!;NHBjx-HnhB_n<7aGkJ$fgo8E~aqsgQ zH$VvoC|3L-b01>9>8!3uD~85l*XG5vHMa0xIaCkuG^iVKS9g)Z4`@%~K>&c57R!VC zLsqssncs5RhlX| zq#fBdWZ02GJOaId3dV~NyFk4rS2KKm@m zWye!vcfS|Qi^&h$fji1WHY!&GB+3)0p4KJ7w9sC;QO0Wwn_0YDemH}k=h;}RdMrT> zJMq-hYL&w`P&V=)v+ogkF6fg;#1||(=8nCJdFD5~O^U#PDs4UW5;=>IB$Sm(JS@S3 zmQqs{{Sx8@*0*!FeC-n@6@ zhklP<_G?Pnq`QdG^;q)?LD&Yom0w>+R8#pNEKh)-@?<&mok%3gp*KVVBl{#0Pz9d- z0j($3VxEpJjf zNDv&LrqJDBDXF-L<>?u~s;mgV9~@~+`VbZ77{l$D`s!$U07g_04U9Aun(2+bYK|1N z@3bSE{}N`eew2(Bp~k9RsZh>EL6S4pM$t2f6PBhe?&S`+>aYfPx4Q>JaTJU2s`w(j zYL;`3nT>%ufi`4zsvEQ9)G6!pOBnrO-fEmO2$7+a*_qNgrtOo z#0%X!`-tsxi2hw<%rFBBYC3b|4uVnVvg#*UvE4G$$|UBpnf73*R(z_%9V5wS3@-xe zFbj4PfQb8)mro*t0anWg087RpjG!TL$AKJPj6PJx&5=@=8DtPf+%YdZ%rM2@0+pCM zrmZJW3}9&M$r(fMA>v7~7B*CG-oxab3ErN!ekI)(8q3qzq;AwTJ~Ec4!=us4Whkb` zNAiwttaPm>XUJXCt%)Lfx>2%{;eU@}Ol;)){tnf{qm&~@ z&1!`3Sedv&HeWMyvMC1$IT#=tpF|6Aq7ha`Gyu^6TuWKX7;u8mpPQ16d+--)r;@Ov zZ4xY*C|SK37yfM&UP4+$8}P(B`4!ZISOi19rq{bO6E*ltlr@Pedo*!lDZ-j;Hnr*H!+f;U-y;oAGJ^dy49Q8J* zp@%(rCs)6xe$TqCMlF!+qWi;c#)tK=XZhrNE@jUtUc6Q^^L~E0l(L%{iktB(# zWsqdlrjk9UWgHdPW8!)o*TxKvD|eJa)+JU1R?n|$+Jg*dOGgrk%rxk$S_avMS_Vm0 zEhCMtQ%Nd!B+)peiV{RjErUi@%NR%3Ni+r>Ni;l!xRyclU(1*xt}ePxoi46LB4@R@ zHi&CTOHxVj+scY&q5(Mz+I;*`sLd>e z0AlWiYfwiWO(2m;I8f$&B9pL?OkR2)fXpT0MGU+kCVzSYR$U?#*f3m%8Wn9AMzw1U zq*C=khy_0Ln>dr^ql;jg@lmX3F>?t5pTdWen?fTXhp$3)pv_Kt%~qa4du&ZF+i$K? zi_@V8XgTHsGy!ghfKu zNT%ja-{!)S`xKU3sN?QTXeH23N#)-82nn;$HeA&;X;{C0Ln%1ru7$JJ&EaJXz}j?S zHHB|z_bxqMgsV$Zh6b!= zp}^Uv%1@uMxB(~)EklVXM-#O8JtU=r>BtL6Wq96qiX{H2v2OScO%s58S6N=@p<{uu zFaqo_v24|Qeh@WHLqHoqvg3;6TL8!Xz)ex044-Y z8D5xV4jdd#VFT!~0r90IQ*s*7Rv6BM4@IwlJ&fDcxM{_yQLnhCMd#p79EkPF|28qa z9R7?z2o;Hz(N%(hobUT+ami*wv|@XX??y##^xc^IglYTip$cnks$r8K{sC!aWY|!a zs)j`wsu~GODFnY#P1Ef=Pxyer;~zZ*pw92uqrlaB)sG@Nox1xSm6Ax z5bHJE9H&(STIWN6s&jf5J%OZ1tVCi?91b#I@u4``nJ^2{i?8weTraMJ@erAoqQ+8c zvqXo`Uh9`u^eM7o5%Ic|*vVZ!i8dZ+5d^3hK$Vt)rvdDh3xFx=8XGcqAXC61g~DNy zCs}jH00N3Y7@o2}QMH)x^QT9O?fg#co51HHt+@dl6R=>5X%;`#gZb@Fry27za1h z9%2Z&&}K|_cFPj@4ION5R;oG+-b?ZW*;s+1&4SYp-qIXxbyoU@Uy=GJzrI_I4V5=W zfxpU!$)VFwHsIrbnQpj`C*6Z5$zd4@e<|N`0_!lCnbdivWZBjF=~B?C)-RQU*aoVW zf>YIcuN0hy_EYmb>B@93dzU{6+(4>0t6Hgp-y5~l&20{Sw^6$^p8T^>TMgJ?7roi2 z#l)j#^j8@=p_QcTuYv+lxP%O4VnX=U7(8q*5t6Z#x=YE)w{eqr8Y+i=DH5sRDN2yS zy&mJ=FD28;w8h8yHsHo!dmj^ymnteiixF9%P=Ke?6(`yoSK{}`Nn9d3A}pbKUF^2B%-i80fMVLFJ&SL7?> z>>mI(&qkbZhst#ARge?s#C~V^oV$N!wyY)|nh#=L0B&U~b26|m~ zie{a13oGswY(rKc%Q1Zemj-iae=bsBsIiM{vti3!lZ|1^3a8*kh8cOD%KUs^mzW(3 zE6MtS9LMa(?<9U*kr`4l3Ln4DC4Gr5k3Co*72>xCY08%@mV^Y0#gd$e|Ew^<=)a_7 z3w5o_wPocTD9X;BCMyO#Aa}U;WMe2h+?``_(}D*(+#imjl>3ktJcfM)%sS0|TrB!9 zYq01ajkx!CwIJ_schTzD;oi3%>lC)OP_nuKdRtY~YiI(C95R}0XoUMxaZ>QanmByg8>T=Ug-Ff%*RF)(k3mzE3sQ_mwdZO zo$NEugZE(rdkpMrb*j+9g0ec5G*d9@_2A};wk=brv}7!URzZ8I;u+>r02Y$V)l$->M+F$aX_!afrOd~piw=E)1%YFhB{H*hc;65d;v!QPW!Z*Bd-vGxlI=Fr+N zagkb&IR+mb{GK*KXrE;1IgNllx6Z1J=kFX9`X}un+Ms@-2Ux(|2NfzubcX36DPxBNcJ+1`bGO?hz90@^xNu&v z*b6VbP+6fRvNkxC%|(ImgE0t-mov|5H8xm&cob+MhsdXhWk@MeIUG_S;E5KeKT>Yh zGDL^WMQ8>IDxP&U4EmBRo-XdGJQa5z_fgB_vqd|l{BR){r)s67|C*I70~@?m%Ky9o z!}nS|oCHQuq$CxgBz4w!G)aYnkDqP=zDnHZY84X^OA-$vshF<8k6SlOtMKwGqjmqK_}$(_o4+t7HA^3BbiK8 zew5a!6;^&NbwJ=>S_&EeMmk=41J>&4xbFmmHE?*JBz2FyN?jAXUVglVY(}v(&{|UF zQ)=LkfoXr2v&DI&N=v47B48;ajSX}Fg(lx!{L~E zkHh7a=e92&>D*hT**&jfwLpnIR1uV9S9?Y4_ZyurPv z(E{0Dj|8yaMEsF!Y8o-=A5%)nK%!!Emn3ta_Mp4wxM(ye)X0Z-;H+g2Y zU<^SpLLz?a0c>By-ECHS+pL5Ih{rCc`rZ7cThWi;Ta+xinOaBD;?3L-6Natn_E%2_ zXny=ONp?cI7D)T6(<$>ne`cM?JVkTqjsDEA$n2!d7vh=0yb!ir-@uEGq+=ipR?Ged z{|0)Zalx`){%nzWQcolZZ1&=%I<*&7z+3B3ANv@Mub?)B1CK#`M@lU0P$?!Gzk5E4 z-oa^_!rv7<1{L!_8KF03`oI;fIgT!V0wR1%^ z6z!wS&A=q@?CN)kUVq9&K1S;2^uG8tek);l$7V{myZ11Z0EIb*|^`P^`ff>W61GIX_ zA-K7OTB_c06p!6dIFFGZ-p#iVc&MMW$*HA~5QDmD>Z=DKs1VrK1;vtR0k;@5SLY2b zOk~nTjY(9xs!74sm_%So`HxV`g}y|xxp^F1i2Tma6W}$D6o1HJK3qUP0Ag7&ae#!BeI< zNY9rbTYdnx#-x7G{LcMCeuVk2Xxs5e7;*nXieCy34}SqppoXc`kQ5wbO1^aiB+0*% zf_nKu)cncY`8G_V{k(NDSk-qKc z7^X{zE-GCfq{~{mG~m*-2bbm+T-uY?;c5}Xo}G#1W7($(B1+gF@uad&kdg1g+#)B! zRq!okNmXjj<#MP5)Qgl@y$BTHzl8{N!UA&|5Te+OoNxqDh!YGyNc5+vm@k>-@(!sg zuN8qefD{;5F48hVMfqZzpKnC5LMlX@LX&#!Sqk5mBQGJ1`lz5xF)Jz)16PRW!Btu) z_~GY<;nCj|KxR-|c$aIFLvKEjD20wFRTGZj`i#D$;YW*dz}W&B)>jJyhq_*#0Cr); zr^ND*3zSIA4aJ!RXU~Lqcc>r#zzpc`hhmTSAv^`_UZ{WesznQSM*V(-8NQn_0fzDu7vY~mU>1!^DOtWCy zDnAWSGMZbOC$dEp~(l4zq!Kewp}s{&R`?kd}gxxUEKEQu|*vWdHZEHbJ`!F*7VcC;Q#@Ioc^^WOs$>8Afh&FpdL&qCvE z7pg01B>V)3Os{M38mg;0HN6~DUm4@ul8MAldScmpG!`OI$X1Hsw;&xa7W~9icCjZB zNM(olj{QJ8Rt~4`)W~cr&xK6D6hIR8%$nZTW7Z@JP)DFEKkLGfLv&B}M%Y83CjSac zUwny!F=yx)NwRAoo^(Tb+&E>T$U6s{pHd3O(k~hFEV9@6CTiB-{wD{6A(147Jh-Z=>i~d7FAOP|hdhua+v?lOh=WZhJYjChI>db>6xtq39 z*3d1ad}-_GK@&$jayM-^%aS^#t)qv?rp>sPMMMyppEskYf{`J@&>$Km?vrp&N85DI zw18EyNsyIW;*!HQ^qYy(Cn%n!4KQb)1xPx)3L@tO)3ztklqAci43Wig(-bz3c&T&r zcWqZQz{jVq;&rx&PJ6{FudRKC@C?sFT`ymX*Z_ebx~_@5NVo`ZI>eO-)DiaLnXvXE zs$8@YH^A3+wcx!`Y^RuylXCb$lrd*=9K>`~BoH*Ef5c8b+5pm05#r}IJRT@*C@nbc*J9P=iv0gkD|vyD%PHbM~{3T(0KSMgf#j1 z4SOMvO!pYbcZL;Oy=L<`=_&tD^Lw>oPq*!81w~bw6X9tXVsU`RSlYEQ< zb+v0gd5#bc30?gVZ-xmFDc;7ni+d;EChpCAGwv)oQVc%{CtoFwn4l$`7V+4tTVM^5 zzAW)CZ-AV5*MRAr*CvM!f=ZEPmNMAF+{>p;pcx1V{1Pm3)eS$A!rRGTMithb_q~!v z-DIAI$*>zw(++p!yUtVKN#;z;f4JT4)sCzfm?E5#J$bSpAgS>ETT8CVh3(F z68xzb5nY=3BysQL*NXc#K3d!l@eJJKlaYGCy?~;>9dS2%xto%2VnCWx;VIy=--lf! zjGsuj8-@^K49G>Y4PjSi21wA&e@h+zh*I#Bpyh7<=Fs>;MUW_}fF}_oZ0m$>A zo?QI!jUNs!cW;@utXcwY>_M-U`_fd6qE$Q6DGnl5esdpksubS`7~Lts=E7RSa8 zXvr-68VYG1D+@P^ge?+oLBh*Fz)W+tkv|(S)B?|X$*e`CFt~lB3DbuK%LE$;{l%7oT!k0*+ND*LO%P>YSMyJe2Twn zqCAY!|0j-euabs+WFUM>svwL{nHba3ZesO?2?`*{6g>s$4)>In%rRut|BDFN)&0OO z@tLsB2h}c=Y7^SA|InArdAIzpefbYnT>qv@zriYy7hzu{Ct+okw$f^BjTCpm%?Y!~ z`M&)6gY&&JrN-&Q48-nosm9Te}9R4HTM{^+zQ0Rq7)v&L~5~${Z_tdX0jBupx#cHOOiN2q_!kRi%m;O?Mf5O zhEtb&pz~H|5yJw*d#wpzS<{LAF~9{9C>RXFeYNm*^=ckFFG2+h%4Pepx#Q*em>Ad- z-H#BT(3_~j2cf;bNFCbnq4Vdtqm)5#BrHtAiFa)jE1^|-Fiw>Qhc;HEV&{(GB##%T z(jEHW;b<^<8)wvY;%dYwV_sA^%CN3sR?Ur(vvK7pKNQJs$fCd?QKJC};?yBl!n=V) zd|{{Br49GfSig!~>fxgp;Bu43=e^x7-a04}9Ay>`Oc2U1e0p}$MN8=*wF%}$QINtC z;$`f&X$}+P+IQ;rYrdb*LIAg0M3@$0 z?h#Z0AtNw3h)8kpGlYSk4rMCCa;zh<^MnS}-3fUg)!-m>uXAsH-pLiI4O1?Gb9ytq zYE8)7U-K>13)+vk?ctvLlaD49ZMsGJbaB_G?ye&Uv~-_BKg`EZlg7-LDIMK=c<-U_ zj<{oH=4bC5-uu~iM_ksvGMQB7%n_Fj8AsQ29eV%sV?BHFgF_F$d+0rpltXv1LN~)8#5z)uOs2d#YiY~wvd$xM?)5D)05^REPCiP50O#xXA(tOs< z4$e@n#VBl;a^r?YH(Jo!5I8gqEns^kl!ZHpeM#PXHJ{;rF|_xQFpbP4#2HnTv5C}v1O2UPl|hAwfI5VG-@n0#}#^CxvAlY`q~kB?KR)Rujgwf zv&iH~^dK_xriL>aE3Syl%xpL#ugGfH?P&PHy5g$J3TKO0bZk;Xt`zLnTiyV7NYTeP zBuZ}(gy;rJk-UgDAk_?kA?e$I2_|C#6uBDv23rGS6h}6kIjdZO%*2|34LLX&S&!0A z!66MREoXzraFC%2S$HslhXMnl<>I}1W`J^$dL{`Wh-VTNOIsi@x(F|DhHxHkn1Zx% zYzq!0N7^-SL1x~-ufVO`+zUqgC=#$@#d+dQ^|rxkX`DW3uqTpl(F*PASxe0k zORYoor_!!j=qr@l;2w-`1z4t}D7jMxDPDGq9pU>pll1TkfQ7>payYlZRx^#2S=nF| zZnO?E3asoFD@$y*TBPVoVo^)PJ(wNv^1ILn&}0zKoeYx0*MOpx727RwC1dJt%zarc z1>D3It-ywY_p2?kdaT=vC+-F#ux|3wCgRNqw2+UlHt=R-8&3W#ZV*74GrF7_gvT-F ztrm+~t(C$Mk3r`kb!!yf3Oh;;4MQ@zr7;m*q=3lqeRz)Zr&VeujZtoPp)YyD*Dr@*ZhiY~+qwF`9-6O0<{n0g9mU&1{ zHi`~~#HXmBT(C=+?Zk<+L_xz`jl!sleNZA*BXH;^RkxQ9Kv)@(s+%LIub)&lDNZWU z$s}bobqS%b0~7>n+LRI0r6lTo^5W=5KwKRC1A4SLsvSv^L={`D6Crc6{4Q*dV#c)v zGNaG0gMc94YFoe+{iS%INz{yqg)8|<+5(Q~YP?`Z0V+<#kM5K4yBNO={Ic--8GhH} zM*~T5wOQ0r|7nkyqH<{Ydc;L~#vs!AH~=$`1K*7(gEg4OJgMT&w*ZGSVb6UGKN3}R zk&k8uD!xffTE_3(0bxK6=uG|^iXf57HF*!`K$6~y1lR}hzZeTK)3FP{GhYW8agN(#<$plak&-mN z2?1yz)N^=*1SWSDe=Png6RqJ@2#+Ms%c-)t%|WH^p&AHp^o-e-7__BG4J5_K7%RrG z{WPIg;x*X%Y5*Vw6Sq&H65^JRK7lfca(HVv5$Z?0XLScR#~NrcFY5`j>U^)vng^(vIHFS_0v@8+-4aT zz8m=U07)BR*AQrvU|4_Fz}JV9*s$rAkM{DH&^SVWVdf!@{|0{cH54^g*myk>P_5go zIS~ES2pXo!4t5fINjK3)eR3&6N^zb;wKIe`5|H3=z@$%bVCM`V-v%UfV2{1sIzYg( zt@_&b-Afh{}W)FilyJ{Wvi@SZy_Quy)bKEBC}S|aIz2XIDji>-Od)g z3SxaeSEk5Y3N6jY6U6u&r*ha~Bo;t6_hU^Ez72A(VvRNz+j3xx<(eIEdHH3i$NW|% zZ*bdawMF&-Hrq<8EesB#DY}iZ^U~l_7YCyWEjeJtICJ9_8Z(S@N}pb0r&$4|gwBrP zD;+Sz(LD#WIy!tt8icX}PD}+~KnUIgZ!3ETPjV>FZdEm>dG0I3n1;QfNXq5{M z(1K(p@e?G>KnZ*wXax>UA^5PDe?oa33?V|a{wGna6xs(^BgU0RH z*4Ft3bPvX%rA?fJJX6ZY;T<(dBknvBxVb!#O${$V5Ji1bRo?D3_@;mjek~g^>QaG; zLz#|irjnzLG6P_#(D(Y+es&W?Q3fld5P?E_ZW>6t77~c(0^M=}c!4&mQr~{~#HXY5 zJz9lT|8txaH`gUjXlWCDJ-uB7m!QoupSs^*UYj4$x2bHtmCbsrmy@rN&R#48WM@zO zD-r$DFcso`@MU88!Exteo4jLUewBK5!HP?9y|pF-*9U4Z_Mz08k)o6#=^r68f4Q!I zihH)KJ`4IFRjC|CsRseeFcsm|h_Cd+wg+Dl_pT&ZnZfHY`ZyoFpT7ybXweggN*#!! zf1I{WCo_xTwVD;+(bPXcrE$u;xL%|D1=oSf+qh0ucH%llc@@{i%I~XS4Q`9}Hb8O} zI|38=5&~W9@bkZcjr8YGC|6#W17Rkj;Kl4fS229pz7AwBWXXZt1%dI{Fqx7shrXqy zdJWO#`wXN;pd>!9Rh64wiVqPG%U|5?z8EJnljR-OeDE(0U#qe4a_9lnqc8o0J^&tS z>{@)2K_sq|H$IPQYAjcNcs(V)`c{26bA$Whp0-RJItLhgzN?hMQ_M$Rf(CJZ{HxDN zv^?9>21V~afF+yZTHKAvd>t*p_~uXy(Y|Rj*(c5DRXq+s0&w18`Qf`!YPAiYxLAK1 zQh_9s)LxK5y9w;muTbOjB{8=gI#W-m-hrr3N*w!KjpgHO9O|0hN;$lM=ygIASWvG= zk0T}Tm|mKo##Sl=)!2MF{2h^bacX2*f|iUgtBjy&U@fKCp_Ct<({6l1SK&rdf|3Uqx<6M7GU-U?Vn*3x4vkh>02Ve1TuL6 zYJ-qpAx{0%QRUGniV`iI!J+70egdZEilGx)q8}iiw%Sh;3w>Rc*H-iQ=+{U?jb8-- zf^+qc@$?i55=-HD6fjML`j21;{H|Ovx+`G75WY& zR$~L@P!tKu1qcx|hOH79#Z}sx?=b0?-=m%#ui%m|t61xCk_`iS7$qPEF zcliXksdC5yO2ILHPz8()(F?S(6S3%e;SaB1sx7N6DeW3P6R(w3JTWwi`am5*?;zLlb z7Ksr#glFgbRocXS7fv@7R%xmEdNbs$$Ag>>V`WKS;b(B)qa5(xdqrSxlZz`aHw0a}Z&Xw2SOeF0=UC@dX zKLH!Cgu0q0K7SRsijOq~N~qnf=b`>jm>+@(rT{{KYV+`UuRrR0ok6dQ=ylb3uXpsl zK1 z!q<39D4Tr@(|5oK?|_eZq!TZrOR4M(D!cQ-vbXe=okL}xp|Uwtb{3V5Tv+z9zOwVE z>@q5Ar?S{~{ zuOT5$xP~{lI_W-d-nG-1BT{x8(ZA2N&v~C>EeF8+pS$lkG6JM^xz4(-RP&$oI zLv_XH?9Lg)*IJP+dKZcY-2AtIAVynYIGsP;_dEemL1l;>Ijq4r1%6`6l|c%Uh=LZh zU_~0Px7Lir^?}+{%+5o6ABhnCGvwqiKcOGPJ$v~WTq_ky*Vld$pH9l90c=ll{xj;q z8-$BTe-I^dS2XJfBZY=Hx*SCDNAJP)_g@xB$EsY?m3O*uV#g&tkKZb!XXDq3^a0%e z4}Kd_Za}q5`UleYBK`eRm$Ve`D{=SYdG=QY_%x*X&w^Wmg+5y|z;@BVcqVRxE*gB1 zJ!QzbjGw0DiyT8C_=QF6?18y5@lTs?nTa5{zs4=E!5;POwX6SzML|!XJ=VAttaeqC z?t>5`94er__N~SZk>V${#oHPezr;(v7BVmN*!|>;7H{~C@w|HEArL~%!O`5ukuDSQ zu=Ev6cA$ftG1y=KGi2w6LzR7wNwJ}$c8$Z@7~k9HUvC9|7@`<=(&r_DP}y&~QW+gc zT!;l7E^mjI=e&R-IAFxDqXc3ROfRPcheoTju9|^n{)DhlnBdz|yvg1TU+xqiTQLaejJ>HiWjKDM~68-{t@^+aK1fTj@$;kok!sI8)ji` zxLsk1Jd{ORC|rlBjf)VpasX$D;i`#eS4$1>F7ZJ)3r^jhit2dtBr5Pb2V*gdr|;Ti zp>!kV&!+sxMH*_{n41OhC~@4j4Sg-=4LHIwa2NNG?K$V0CK4h zO>CzoYJez_gGf!ECvf?M=M|nkgWmxPm>JQsflZ>9-%{>0w_Duo!c?-=6lRH9{0mAcvkZ8S{ZU5?JfI!-QqE2wt`-jatqH98+v zkugjhR#dyPabg=bCY{na$H1Y2Rx`xw5V)nszb|xwPV=upuM07VP~ZpuPAQT5wdJ z{s!lXR$>~*1Nsp}jjtg*+H(5P;8rhx;W=}7Ll1!f5m?LF>>aq(hIUw}ik5HH@@-na zJ@G)v{axB{>Jp<*Ii6y%IeZ2B1;+`flaq(jG;(MKW@4##4u9i&68kH!6h}2aOiZC_ zUfya2d(4YXQ{AT=aLMVr+TGpQQ2CJG3Lp6fcefeuhK=wZc%8q)rtv{N0{MZ-hpF#8 z!oG)pBUq*0e5Ep{D)%zwVtK~^HFkx94~|@|OjKieN|xG@pdZKP?@VEv(h8-XO;83R z=j%X1g?@~EuOG$3M2dWp^-r*IsC41E)1&_-E|dNIMZ|rYV)E%gqW+G0Hc|N_@OhaM z9s08ZA!myYxzT85*dRjW>{+ieM!bDmE8Z88E=|GLl3*6zbhuemsg+xf!lbFS&3XgUQ4C=!!su+MM* zc&vE}HjDUQwk2S7qL9UOe6*{HJT$&$I^t2KWzgX+QH?)jr#Fe_GWl&F> zwu$6R;<{a2U&FN{sTtQs;?<0|L~e_??!mRGQzZ9^>p^k-P+SQ`oZiCK{D9YSk;}!k zOT6pGwTeW-2#6n`Jcj@Fzd@S0S!38cy!|o!6$tN@Gw8)QoqqZSc5&a`F!3S|SZJkY-2lp|) z1CpDg+zi*q)?b75uxo)yjsPKgg)i-`wDUz9AdO1wl{mhH-4{26fK?YqdkVmSx)`>?%GX@fg_qz|EC%k6w2+AQPqaAluihoC3O zE7#|_*|>BX_a=Z(xFwRYL&C9w9EMVcR+ct z`>S1&lv_DpUhe~Xk=fqLh0*6)D8TZ&r%_km2}+iV&;@of?|bvB#?VACoUFi>>#;AN z7_cqK+bydfVw^Oe9j=?*7fShwfYbj`f+1)G`$DMeJVKOP+zTPFIAG^PP)ZzBl0&}+ zB+wt{t5`ZdzIqEp$!xe*3vEabLYmyzH`h4>4&n9+?FBC(CsSF(614#g8ytuqpYkNM z#ooLMTTN5H9d4y!*{eHf&xLP#3hjw6EsSM}|JJ2_vHmhU7{xb%jZYIly-a_eT-rDa z_3ZzM?*NGov;uX4K;t6otIIvxL4g{E9HeIX#HtzxlMna zc%Rq?K5>d7A>|na{yjW`B3xGv9YGEasY%-s&=%fyLE93OwqtYf@GYJ%bvc zZt_Ank6?jn6B~^}93CL4Con#M$uNr=5EOmjKTvdp{$}6dyP5>nigmxxej&eD0Y|Mz zFl%=?_J9g$volScovXF___Mlg|O3CYmH`_qcbX6i3A4d863x+ha~2IM>4JH zd=csA*f`EaC37FN$8AfX9gom&SJ2t_6}2uYQrBxt4mj|c@B`Qv#(IE1U%^lOiev>o zfkZu}4U4@9;|e6uj@<&V?|EkiOHdM>!S-F1X5%iZN9)`Fx_w6>7_1c^)b1g@1)u9) z(;e{};FlR-dz>?cPUAd+B^&jz;S!@QTQb$L@Z!tR`(;Yj5hKg#7S>3Wb{;;Lnk&fki`5gGmwVe4@v0 z;POA|!S1t;{a$~Q`iYtWESvh*Xc&I<1e|oZ4G`(mb>_D=usonI0ZZ`WY6%6gw}{YD zFovwQoP~OnDpe1p`rknLA>@Gq)mUc5cH(_jNQ|xMZ2u;r5DWdA)zlCsGZe+dc1Vhv z(PFn6VdbQ|m14iz`M%h(hFi6$FGSWV#rNj#LgmC3FGi6^&~-7Mr~lS}g!Tk91{`dp zIh=t_?})va{2QglWFP+nEqasr$ML=T$$BHp^K2|R?>(yMjaMuZAHqdf%t@QDfTpbL!YTV};7Eo?GG;6m z|t;LWWI-4^4ja&Ad?7O5ht%XQxKDA;R%Eo#(0*N z4e1ELuEaJFT5+i@1Jq-&|7GqRd=z|!L%rSS6WUE<02w(sdJmWY4Dt%apwjoNR1r{( z4^GLUEOdq#k@WZ^6pKe-pwNGc%#cwF!GGdlbCHRaI7t1IDb4>27?`md85pO29Mx z8-O(rAVF7?1Ev`eI{Wz`;t-D&Lhc(>0p&bDLD3Bq%e7?vk3#Bv259;&8h#33!2!NM zzYM}6aKc{B@MUU*Q-*8Aq%nv3BP=Y$-89tn*K@=O?+3*A2oJyj&&Glv<_`u~L=Vx@ z+&>3H0Eh3^*dPbif%?MWA=>w^54~6)%*A061fjem(OegW@E`l7rc@aZ;5KgFj zvzA@PD)Cu0dx0`JQt)r)q`r|bxRiAZsn;x8#$;Tmzl=uSrqWgbjogyozNbJ+z7?SLIoPDLB!AIQN-B*wcFQr7h~Qvo68tjJ{5#S21k8T7uso zZXBiX31s~cDkst4(>VWuLh}y_Dv~l0kN>I>!2?zpHSc1q&x-&GyrkH9+~M zz_hQ_cN4txM*HWqQu`5V1^wO(Fsm7L{v35;ioOB}n4*;n1@2xx=fZ~T|4qXuBj-2# zThb@6FvC>?p#X0U{#cR)``N;tLxe>Wk+m;Kjs}O6H=_4xU%(0$Y9eSD#=-q8AOfpS zoBe@Qq)*z~cn0R<1?vG0DV$S7yw%Zv(Qu@28^&DYdL}PpbBbK}-Nt}7Ys9f;1iVq)xh#EoT;<4qH*z06EIh)#; z&*o(1mDpFGgbC@fPdMTA?q z++p&NIwITz*wU}h0_2xqmAwNWq4P+|%2N^RsHcDg{k;;X(#FK~{4t;d|C}9xQj2>F z@;<9Os_$pP-V*&(-e>iDNS01nuWtYYKsZw@U9iv>7{edH5h(M7V?LIWf5FE`gNYAS zs>t8ZKg4bt%nAzlqU~d~3STZMw1Tl@ZCRF4NSd+f!O|w{-8j;@yASx4>}H^xPzhmK zn+3`5`UnA&{6T8%ELrr?ipn;l*2b41r(Ay@XyKb@2s$&5sc*YG5eL?RV_g~k;1Mio zj3CsMxhxL?aXS6g5S(7BO~VnMtymn@`gAE+)KKq`f+H#Z&rJrm1Lu}vBA^` zka!dB9zXvVoFL_8yoY=t?idN$cF#a*p)thtRT{PFfIACt^_TF%qW_I14f@qkPbcWF z0ctQcr%`Qjw)J|ir&3C+;k_#_HL}@$AE&?T3sQk$K_df;56w_oDD=-kr>|K` z2#y?BG?(L3RY>im3;zf{2V>GQdZr79(-DVMqx!+?Ss=gx4ESD9Qx>QpKReB+0^g5v}_`e#MK!Tp)Ku5x_s z_-ud<)##mDsA+t%M&E8?JKMzecP1U+r5uYRt}=QCVtj=Lu|u_BEh$GE9=;9pNe9r$-Rt4jro4*|12jm>L6_cjvi{v_%-51AD8 z?4+022N_Fulf#S^>8MMm62zbGA-5K!D;g$m3%+9K0WO!1ic1#TxdT+d4*@WeQfqqV zDa_Q*J4ioTY=<-tZ)*R43%i6VXMW0mk6D{`gzCBuFcS5`b+gOp+}w>0;t!FNGwJWJh35Vor`A9ax+A>q z!EBm*gV>KySqwr@s4OX_$};{5L%S)2Upz?&R%kQRX|CIFibekmo0A4EeUnYI<{gsPUrVS!6BQ3LZA;Y( zs8t@6fLNeN6$LC+s`qxIrAjea>i*uJxi=x$_V@q)lGojtJ9i$>oH=vm%$YNZt5q}8 z%Gh;y-9h~HTW^+iA5rIw9)Xk4;Z>2iGTMrKEojDDElSpT3qDZ2>~KM{N7@x#XsHxYIBI{Ej2^S=^6ZVQ zezYsJ!44)Sj<_aJjU9Wd$p#tF)?2wGteP#7h8M?x9A@Rfg?ql(d%DP^M|U>y{Vel+ z@lK}~p3<#X?zC2HSiB+qKA)Z>$(mkoc@Vc0{5}KcMqn>yHTB+J{uCK#{DkOJ^r(Vus`rz%=_cG-}rop z`Su+Czu>3c+{J{zyUza79%7n{n8I&wq@o1EEF1k*WzAK)q7T7JlSXnpzv)znyN7l7ZLUH}ndv^sxTKwmR-4^6Ur+han> z2_Y8QmYvLFNGF%-7t`5A4SADfSh@3HJD8OWek*5N`ThDd=M(J@Xj$Hvul(-TFKqFd z4Z(H!d_OUTKDMP0(=AbLDSU7Tv2PuR3*tx#w+g$&PY?dIW=VGW#a}mk+11{-!8t3311$OWPCGb2Tl>G>n6qbObSq?h z(N@)YSTHtlWgt?c`9sS@JGc@s*KgACrHv1KakZ3-ccwS0ZE(MmRNP|csO^c*ZsJ;0 zje4}gbz!NuLUfN(9XhmOzNird4mM>9@89NKZ|fs9MwN?B9)oTMY%S+X=rB#(Q>Xzq zPW6Al4qfk6g^GwK&yUzz$8H_CsCp^(&+yzHOiJ-b)kENni8?&G zkDMnVmi-PHjDUY(d#yk;FysT3fOIxjtW{H+l3?X-w60pMfXt(cX{Q&%2d+@@5~kDS0`j5{YA=mG!J8+fvIB{ zMPBNsc)XV{d{AJn%)iy(hgGYX2_joWpq_>^neyuQ{(Rw$R>Q=VS>= zbMwgk+!Ns1b8MkS-O=PQnd&#%F zNJ#-Z-i32ufn=}?bqjW}el4YwkllU3ovMA-{Bgr#8-wMh8|J(vG1`j;pTZq!&)zw- zy*q7(_Mkk{eLzKMUN3Wgd^lT-3&CgywuI^^p2akbNmg*gYoL&l+U-Dm?d8 z0G*6KYp@~9!v>B*if9n~3y(x-rgqkmU3|TrW5v(AL1$s0b@MN`bJ%KdwonnOVdq@m z99A{iD)ccjhxU5`*EJhzq?b)~hR&HS(r8zo5VlN7Kg$%c0d2B6XO@>?`a^0f@dv`5 zthQnK>37&c&c)QGcT9hRnHV6JzrRbT=O*dO2MFa*R2n*~y8Vj8XK&k9l95wJA0rAoDjE!pU;)CCDBwqc{~o zH^EEn&b*Kne*hmxid5eQ&PX~}Q=9)EN2V}vzuBi12Iksd7Ulmdl)oX!7u+;tBCLc8I@^;dx^GU}Q)gBj;fvc|6nQVDKT$FVv<> z(t>~Gf;@Y0h%EumtuDg>Q&50LLJVSMMXu*JJ2H{GQqBiG(7)PCK#Nx#l=z|_XCPEO=>XN>kTx5K44GszORYX6z!2A%S3chbkf=t&MU zky@HVME=L`iP=Uh@MY8W1P+|!J3wIdFk0` z&*^j6sGi`w*%lClW#7a=G#G{GhgB~4_H&{g#e@WxrZ2k-pmD!9ztzz}5Ipsb75~I!I|)%D zyF+{<$L*r=+Z~X|< zqJxp%(tb?DfhX~u-JsUKoc*V#r!p6F=U8iYWCRf+!-&eM5ycvE9B5CPMFu>M6<@?B zOef{A$GFW|N-p*`_2DyAPJMWK^AOXAS}tsJ?htgY)s@VND3wE?)n@zw9=*$~gB+@v zxH2p@J&YszFR5!*v>FPXlj^S%vLX0g$?G4;*vNeH}VFhs75>OJ*1~V&`^0=Q*^+e?-B)vJONqjJnQhXXqWr zC**l{SIEh=hMZg*LWzgPf=5p3xw`Y9?mftq8bk0RKLMwJlM-wOGTENpcB)gXMtslp zI@WmuIWx;}c@c2~L%A41qrJK6pkB+PhpmMX0o-3lf$tEg`|alR-=I3!WrktMzJAka z=b1lK2-k&}p|zkz%F0C0fnGGl*b&i+M58U*zoAPiF@r3*g4?J~S zKwfBYuG8Ghruf9HnIR|Y*#RCAbcrTV3BkfU#q1@Tvn}R8?7Ga_1PU+t37C9^a|!V> zv+|s8nE0Xe>&w4?bV#6-k9vmt{_AlU@;u1%y8o=kZL6V>OFMVx6H{?1eOpJ~Vquo@82EJ#HWz0{z}^WXHWrm%`LX%=^$vMAR}9d!PA zyJ;lsbx%&VZgKtwdQ4$16D?z+L~GX!D?9T?+H#Qkw%{J&=}$crrss3QzsdVmUk(Xe z&$E`N)qnQjdILw(PvmOnb_QERzCXn|cTv7KhxZe2`d>_bQ+1!dip-1*Ill!P(wJg1 zIvw7O$71Syjr&th$p3V;4;u=TtoQ|drJY#n(#1{PJ~WF6KU-#cbc4eKD)J&B=8)_N zrrkWwrMx2{z<&-qe|J zJ&a~oLlm%Bk)<5RY&vpn|$|XL8T$k>CdR`Dpkv5d%wxn zO8lOXF;3&-%4g@FF7V^ZaJbn90o$u1S5!x8t0QNU{w1YvXBjw|@HonFlgu#QpG(>M zCu5a!DHYV9bL`v)xTt1Lb$0CNY|dJeHg=zP1k8_^u1ES1d6M5tZDU1l`*@CA+F{&APi8=(nK>AJE_1sX6_29Y&CbpaXY5PbXS#1D?S~3aO8>;{39e0z3b`mEc}@GpXy+J5 ze9}Lqb{;?dw;y;^_jGTBr2piP5Pz(CG=WP6)Ojt1v71|@;jP^u9qLCut*K%HdLqVR z-V9!lFc(O}`zX75ENiOrt@}2V9$CcIKrPM;&4b3kB>O$&$UfzQ4gJYt0{CPfX8D|p zgjJi*Fv)C-!X&c^5pWLEMpKiH$bes!(wU$_vUt2vQtA=K!3lK|t@rK;(=wO);2J{H zID#{oH4GSbn4G?Sb7gVwEY6qo7UqvAp6UtJjenpd(1^Ud zKW>ET#wVFNB4b7k#n`#xzjnwME|B*%yd3WtA=MIY_rwN1Iyt${*%t`Z)}s5_Q&Od> z3RsbDiHx;x3vwnZY!@uG)(qwdTkHJD)hlDIrB?iDY8q=D6)B0eVvhB9@UQUCv(AA# zduENto#EK9_CagOaAcqyhOkm$Jg*20WSYNx@rdF{81^rU!|L5Eu5jb`0zIu4;w3Y& z!)Z9ruVA%e=4emi9`yk5=6Vne0|Wg+>YHd_LBOQdJDtOLqOxP055KPw8?@g>Nd0M> zIvm^2m>34o`E-PAu_gY%guNiM2v}hyXMP@(zf5w!Ss{JAT3#{VovhU397CS2coJEd zg-bJK!UZjb3@TSD6&gx=iaE7mC0-|ADmTL4_0w(}(B$F?^(hxbV{^)i4*^<@gS1nJ zIPP79uikc@+0{9pZ(LzWf$DcI2nG9^iSi%!bvPVlHg+nDr^;n_1v$#N;u4DKuiYIw z{CU!9cSkNZ3;MFNGY-2~oE@@H)>P*2?+ozvcQPZ2%c3nz3YXHXLi=P><1(n2uEaFE z64`tx<75C*Ywx{%YiypibhH>|l}#P&Yl>9v5Cx46mhZHh@_>!9rG{ZIWAs5d6QvY% z;~~PVu#!aIQ6e&3xQf1T&Dx{A+(MPRO*Ef!H(E_^ z3AcKfCaY2E1g}iM!|g<>Q?=wV?d@Z-{x#v=`|YQj)>IUETS&OwV|QwA>ANanMDalF z2WfMO&M>=6WLN0ks-@UCzb)Bqc@!oGYcHpwP)JTpW(j0H1VwkV@7bQ_C0Wdw~$R3NqT7-cIpOn$=sX$x}B#E|P=r-hJu(r6hl z^!jW6_SX#5uMeCz5x@SIfm7CT;CTCqb}c7KG=8cjINwBCL04}1AFPGTq0w}AfBQ2V zF+HN?p5D;066^Wm4WE(GG!i~4MAuh~p04JTwQM;!+JTCTh7Z-Y-s4g$AkQ+NjCa#} zJ1O_x+R6D21p6j|M)gKX`3*%+T*55qKFhneX{`|qEEzW!`-2fpXe&0B7q?U)gM;pU zBuNbwl9cFHRnARnMTYVR*j)a`9l7=!0AV1_1f>ZJQ^i7>jDo*UEehMIMHu_W#44x6 z+k)xyZaPRoDdmEVVoz?`8 zYn@FXxS)B`WP=amNL1v$f_xB6_C{U_8qfxt2dc|-NL%y4oZ^y>v}7P=Yv>PxR7tju z{hisdl;(TG8nz<~Q&gH3DX-xQsW9|w7eY@{qNrAhp{9ZR;Yc9o3)n<)US{35y>s}0K{k-0R zWDqvOz0d=92ohjpAgr=@wr0wYB)#`3!QigQgio9!C#VXQ#d9xx+MS^_3GdE`Vc{;q*LPb6R?UC`e>2V`yoGu0Y6 z+)CuoXRJE!g05kS^%a^RP48run_y|0?8i`?6ma*G&Tr%n4`BUn?f|eYi2uI^u!jzL z0JGl~$OJG*8&6-ii0b%x{g`z2XKr6Ypx1GobZ5xL%1(~_Q1p8;Ma8Zxu;PyquLFu7 zfaMU1e`6BOhcgs!MAk*=7nyt+9!rh+7Z@<+rYk0z^FE`j_{I3tLdJ*R!d2)gDnv3+ zug&)m65kp*&2UGr-$WDNR(HUFDSw`E)O;d%_A%>IfhG$QQtNJ{XOs~G#?PpljKqw| z^rhjWtoXHvh5dFn;|1wHy|DufCx8)OgW*J$LhVRLcNv5eg9K%-gqeZ_ceg7S2dBkm zhlW{+hsQ$K3brCnk5z69Dr>b&i`0h-(c5ty>;xp3&AHNAq zgU*zQr>`e(##LVVWzz|@;x_LKHb}5M!P)R3DY1tg?z0FkjOh#6Itz#(Oq^e{Jt78U zf`EuxgxOfGERGm}vv(X^Oo5@8gC(TjkX?18d(64QiuVJ+#7F0sk+V!w-}pQcJ*4>~ zibp7?>;X_)E0zt=MZYSGXL6xcqng1V-bJ2I-X(a|Hv?#Iv^-}$R$XuJw3bd_Z&D_L=sia||IVt}=R;wzMIK zjk6Uwsw`)+Ztg42$HvysVrza)4;&Z8Hr*5xEJ?NBjYi;u&{bZuS#NVdt&Z zj1AG~=@c>6C?)Ldm`dM+CnBJ2XBtU$+jhQACm%CVoTrE-%D`eawzie}GDhweHIC-F zjyG52$69+?iHVwCD`W{bpFt?}2UxrGM#%dFX2X31VNnvDY3 zGuG148dp)drK`rE#RDsDFi6f#Q}GjvfSwY6536fC#>kYQ!AfiJ;Phk z%~Sq6oGOebcvNVI^Dcgn;J-4YUCG4$!t8SCl0bE}72i-}IKjkgxNX?<27W}4l%U=< zS_IB#60dn;R4YDKg_HdMCXa*_2iTe1#Sh#w6>h~NOggT@iRyuW z40ROjnLvc=`9R!*_cNNG#suAmG*!35{j8XQ`_>6$vBfEqF&ZwwF#vJi;LQW<1T12W zBqz6wiA(m&-AnP{z5?UmPXNQn-(xa?OBwTQ8mw@4@Y6npzogn$)EPLn-3ZAVkO1s$ z7~x*~6#gJll|Lia&;MiaHP(6xDw^;zd{QGZ;L!oW-XI2I>7w{o#sAO5h>Zlk; zd1+LSYkad-+FP7&U_0PAMAq`=LFA9e87fY>YEGABJYk)v zNTB4Xp}$vZ8P=dvu=x%smc8T<^Bca_*RbLgLZ-)R}s?CNorz|mG}`cc-4Hq z3NKCZ=JU3a%SfmtU{wLro7)@d9S5h+XQ^fYuRCnr%26Iu0de+$Ia1L&@??VmDdv3; zgLUA^4r{@O?5KT~3|omGQU^Mwd^4(;@-8WEBv$|yaejr}7-(0-T37(Sx?LF3ZKKp; zyt^NZSA)NIPeah6&IL|>eO_TQg4bAhT?bxcH=n)q?F?>| z{p)9aqc_j_plhF>WPr8re_(D5+j4z|6Xn{irXA7eu6q=seH`L z$nShyMK!iK_p>pfPCmZQ=Vmwn;hs&=0wtL5xA%5GgbB$H`3@nmqhQ?(kU?;7cDWnV7b#x-6&VucXv zZrHlfPW|g1F8GQrZk$j54%b&IDdhx_ohq|Gz~)5QS*(xhul3#gaQR$`{9Jh~XDIU;6!{|Y*|?=!-SuES zyuiSQneM7_kQihH%W(;s-0*#OFd#PG@426i_q{XRkK4SrxMvdqes#>_*o=ER9N7ES zkieneh6A_oG-g!>;+-l3zxs7J(Dk`+paAl?Hr&bCm4O>_D%tL;4BX8#EyzPTfvnR`_{%=w?X=T!zV?3FX~EO5J$F1b zbW)eD7@o88dz^eqLC@2A^){ahPo*7?J%MezpN9jr)afn!MM$#G=Q*WYW#AR+)JnZS zqaG`9`|t#5-`PA~y|O$1fB)rR2hYwtLViPNr=E!KPvSnu^BT{m{_`%b*)Yj(fER9ADI_6{c$g9FxSiZ0#}lrypEV$VHXeib*uRCV>$Ve_PM zw0lSv2ivKjSF=YCK#9?($bJ&1X&=>;5=*>?#wjW#CmDTW?K`E`>{J`JJEtE2`%q1M zp=lpUQ_Bt!T+16*h;wFmjVODn=>UOaxtKZR?Eha>0Cka~e;7rF7ndokOo{VH&Z1zR zJlk6MC(x5GIEi5!ky^^N&G{3eA073sH!&;EP* z&Dd4nod4JKJ72te`c`{G`U8KT$@F1=L5VwkMxDelen|v=NtIAXm-eMzf5vO0xoD;z zE!aHlq^u10kMywOCGZ8P4X{ORJlOp>6OWFzTpQ$$B5TR-SdqqBEvuBk|A>EE&ZDK027kIyjOI(X0mY zkHR9X{~QGGllWY5k|a=kS;kVI1>FA*u(^k-4S+LfgO}?D8hK(( zQ64z4rk5+q4yS~XzVDLuD(-KuqO8n%nT^+U+E&GUs6+8So$dX_=o4yjsbZD7e}$=# z-kH^u!N-bY-|Jxwt}QsGSLo;;stcqvcArY)o~tv+^ylxB-l!_Rz87|(gQ_C6T+B!J z7i4I9w<>l<&-|pdBfl3#w%s!w8tF;UZ1FI&4I2r}5 z2@QN3po1Uzo7F&fvji1)h1>^K2i!sJfa|XLsgzuQMqUEkZLCF1Rf3Ebu*ixR0W~7j zw-#pydR)NrLnf*vkE>5LdH&9@AzV3dA@FeT(wk`Y58ErZ zSN#HY*yb#t9L}z6cb=zm_BJhrs;QpyU4?5M(DF`)ML0)9oRhy+vu(}TJCt3&q#=tNZA;kkxb^jileE(r*;baR_fret?Jdbt;$7 z?qlkJZO&%Wn<@?`XCc=sbV$rW8v_jeGcAXZtt20^i+kC<_XpH{$ael)3FIjr=fy`X6C@rioWsUAC>E97i(J{XK+;Hcvoo4II3 zCpu2^Kkg=(?hf`Edx4kto638KbM%j7$Ho%}f;gV07w^E_vo9FIa`K;u2;A?f!`Vr= z3Q`rgaLWT|sk2wRh4FCV2JpG&7#!B=U)dW#W;mW7AyN}E+Y+s@Jn!yqRh_pxDP<3F z+2O>F7c|^2=y96wmNS?~J6+eP_nAytv)xPiT$V(nwvc5+1OO8*HvqU?&K9S48vx>5 z_?-a&S>`0FkGWQ2KY7{J`R@B9ZV!A%f#CDGltGR`FUNzInH+yn0q^~cA2)iZ60a7i z@y6bZ-k4|da=bo2=Joj@ug6yGpfN_2TJC{n`KV9mEw5IILZJX{_ z1ibsH`vnf4Cks;L?sYl5+4yI#JL%B9@>N)BW7bg+2; zdv3W3)C!bWaBT^hUwF4pGx7>#1+#5$^(b8KCxji~sa+oqbm#pno-4>lt{#QU{XStmaX;fdO1TaAukc;@6)txvVU0Y$ zpdAy*cMJ8&p&fGdH2Gorei`*XiaP~&FwdK`EfCBKQu~~&96R%&RT;Q|uyWcaS5H&E z7j}qmdb;smNLy~{RT)?Ze11$^xq2S-!}R?V>hL?-(2SqI?Cfl9oM*92Sh&i zgg76>Uotid)8rg@>xDSQF1jaK-(sy9A`QurkvkEo;JFMF4J^9wu@C$aK08`~^6ur@ zUE=)abp&{e(~#6!{N+)1{9|oI*c}&0=k8=ac=cZ(6l?feVl=+`mG?4)mv&wVEypU( zcbHXf;s;vgRvl6_^lCll7& z5pzD0!?LH^@sx5;#vjR7+HCKPB=IY_K<|%;U9-kGFUcD59?pm8M9i0hMNO+VBF|>v zVei362hNvY9c9IneQ34$`UjFTA z18U(0e?Zja88fj4z336d{DI^n8Zzx`jN`c+jlJ5!7nTg0Nh0an_)x?AOb#L)v+p%& z+JNd%WNhr_Luj@ilJz2cM?Gc}R z+)-(1s;Ot(>`hCq+l8yrZZ)pG_k35W=vb-*2#kvu| zd9IOsZLV@g;h>XX&Ixk`mt9p@UUkS?)<^K*Kx*DS)|%ni39D&=d0>E9@mC;4in8QW ziR3WE6TBb#>5&?eI~YYgXvNp^u>m9RyKA{%>{b9F^713f5}L@QS^YuOg;#38bLl{| z5Cb*!1)2UYIe%bO4=ev_&gW!`HGa-rHe`=>cD%yiWu&i<+=VHB9sgRl9XMjXrI)sp zg3CpA!qGFSK6jO5Di<6ZtdCWPlfBgDg{Lt_(!CXRuA|rkW{0BZu_J{&?A#%`9N<$H zbL|(va2vxW4&b?OFtpUL+J^7BMKmab(chX@Mw-P7SY(WKdiIRC!4O?`I$`{=^7n49 zhJL2_3FI;2Rkk#P6s`e|`~5^IIM1%WpVR#P9q_*CCi!AZht~ zw_%LH$BVoG#>)<*|28W9XD$db7~Iz$U&t*BHHR}}xrfVsH(7NssY~89ozb!CeX4== z0%kMt%zAZp7Y-gaj5G*mCH`06Yd9`oUxg`T#!tg2JGj=5#l?cNS)kF~5(%jz_tj1q z&4T4;fL&c_)-jqX8b*EFpDfJKdsVqs6~@ZK*0SgDGjF80FCy1D36xgCN4y9G+9l3m zt;K8Dye>=ze}kD~YHpg)HUXI{_b`P4-L@iJhw6+6J9z07y@4q7bv{$loNwDGsrXhp z61(P|YS$NX8zS~UoH#bshnAOuOmkc9`j!T^4)1#vi|@Lm?;;&kp&HKTY#@LsKA;N% zbq#m9_d`Ol4f0T3!#sB}{<`T4skb{HZyOUqA1r8*2m$*EoU#ST6Y7p^MDcNWP|M+e zihYcIkOKx|PXQ?F;XKI{vWMfw3tTDRB zZme_Ob1ERx?F$-2&Q>Cq_+)fsBQoh8s@GhAGybrZ&_v}!#&0E@Lr+sLSw#*m)~K$q z637%xBEy8(!G#{Nc@sGw88puQoWneaBj+v1%mkVdUtOr5+PuT*wHcOO;rM@n-(&L3 zWZ`ovm#RE$3+#m?alHvbw%9M|2eCm6;{MCq>{HoS`F7Suit45o9g5=kA+kpERx9vagE1W!LPERqd0xDPmq5{m^}zC|o+cf}T=0 zvBAzD-^Sboxy|;6+EyWFcMp=fZcz2I;+RAg7aO(`&yYtONCgZ~>@g)7pYKX%N8My4 zE+f(ycDV(^u}<@9n6j$F2Ik}0wCW3mbTblDiRKtwq&n{F3fYKlJq}rtBO)d?rC48q zAjSY4SYo|ka&mt{RNeb4%=z%whDOBq64r)2@$J00n_z)TkGx7=1`(3cmy^-gl5^Qc zI!v}2Gj}|E$FQk*ML^dNK_btKo0oI@pk}UUGWMP@; zn+>1K@(;mRUEX~3YObM!5k~y|&bj&vj@UB8@4v266 z$V513`1a56bA#~sJyaY*2)l0f6LW2pQT)?nw=%#b?M<8kdD-jl8FsSldo}P!6?xl_ zLyqsp5!3J=N}}bI^xmoHA)06!_m#qO$`8%CKzt7?4eTj;6K*XvVto7R9b>-BN_{Q*0-I$7@|tDazPf+ZA+FsUT#0sB6^Kmn1vHdn32&jckQ z2($xA(OmVizBgB`S5R}6L^(KbdO5Tm!Ev%YCd%wO=?7^n11 zTrvy@s2z<=*E#qrZ+^-rL_}E1LGc{DOk_D+u;4>8M`1rl7Dui43uODnCU0VDQAc4n zJcyJD&0L?rf2vUIp4LC(Pcl%YD=AN0%>m46bDILuYmQ-FatnGzq84Rj%E$6OT>Hd% zS}T6PCW&p%7MKUZ8O2ULtc72ar$tU{e@(1dnFX#Zdi^n?LXj(Ex>7}Kt8@OxFW?;j zm8x0o%&tFDU&mKqwQZ?(HQN(-61MZv2`t^cKb)Lcg3y5J?y$lLR z&eK+49~tsEUHN6bBr)7-5t&ZZ$2qi){OjM;jq!=|m8xS|^Vtp|tTfYam%kuqXjf+? zyZd)OT@6tyZ@+jcQWD=4y-0kYL5Dzemkp8cX2qvd$Li>72@Lkvsfm*^&t`E+WBS=t z%}ys5{O8oOMq7L#g#p@-6+b{%mk$G6-la7;|~A?5ELxHs@(zS z5Yv#_rCjW{)Y$j^kZ&r4VO{@3JIj0ip?uLTt8sX7qj&**?K(a|FDKDeJeOS`o zJJ%BNh_cEUAtp_6=h6daHDh#HQdJpUM(iKoX1e;jQv}z|+;)kOU$=ms?5Hf> zX-yO_a_%*QO?Bab?o6AF1%j`C#0+9>!q=D|$c(*ELdA9eo>Zp7PX?%vV^a z+nL@%gHlynY8Px!m7IE2s49=UQp3s4&Pgw;TlP3vxb59AJiVeKeUGVKk*H(Hez&e+ z{uH#0{6#*6YBgjf=0HeFGs9$NEtGmr`I|GopBu7&5;J2kIwMw=73rhtKyNq3%CaLT zx4nHkR)*fiuR6r85uG}zygE2}m405<&sL-@%K)o;9Z5{tjtF!<7ZJbCVKr zLqi)%t*2}*YlM<+g`kPjHmT>iOa%FwCp!eKeyf>ye4agbi`{P|cMihhZh_rfyvNS2 zP0h?oMnlPd&R_2F(PFPb3lN68#z2g{LX49lBdeo-05K|==f2uBD*d`?2N~5LhHH$J zveryyr)Q+H&IB&L85=cl^fxNeiPIl-3T|kAeKAu5lrj}>2}+H;eYxn21nbAS#Val`W1 zV1+JP_F6>6B?+`CKSr{WIqNvgG(&~9ox-@%WbU^05p%|K_l7_+KH$~P5s8qj#_q7KlI zMw7K>R0n8qUz!gMYw2`Sco2Em^8t~&Ng-oC9zr%(+arBt{0tGtn~9fh>dD zhMz!7BJlz_LcgIDiJLT52WQq~C9Bqg+^fs#yGEa8(4>FHpoV@VJ2$@M&-gl0$&6oe zVTUflPfpLh$82+a{Yrlq1p%c*_*7%Bv>2XR{;vZUDbNkj9on0H8 z%y;U0Nk_;S_6w=mg3k0K9WpRsPAO7@j?n}i9TIL2YisK+PRq0hHe|O24@-9l_KUfy zW1eC~J!lnmj0zq+%*64xL2M|0gboDHSv=>^M>}vo;CYE>4{=`e<0-D5T>~ovKU5st z&v?2Jb{db|Z}MDD9yj5Jh|?ASX#BHyR`IlwR}0S(zA3NmJb&V8%e&28OxRUCU&Frz zEsN+RV`<4q=MQnoQt2*VPSsrX5Pc3&d%|;`6bjgR{j4<=l9VBd+(ZaIPG+z6eC+)G z+VfR&J0m``HxfHq5xIC;?C6-t`TUNJoXzjJ$m#r!$Erl^=!A$xF3fH-==9jeVEQMB z@;|Y2*O37e?%~Z&%2fa!#ctna~p(VJ&!Sq z_?HI!(@2fS@cloU$f#OtEM!!zl;h3sXCfJt%yaw!bk1cXV*rUI50)z%8Gr3ejk=<2 zHNFMwGXLfFfIMrBt`umq8{=*ASW6G8HRL?E#lF^9j`?0L0f;`|vzl~3pB=ja$@=9? zLZ|ubO=JH*J9@IL>TkrV{_^N2<@ErEZZ)d=#gwg0OTr#LVkMyK1C>&&4}-Pu?k zxWkvaS3RT9^9fBx*UI}D;P)l&N2HB{jF%NVA~uiagP@bBfMgKC<<^?nAZ-REh4V$i zw4=?^x*z^nYaT*a<6&LhM_=oi^1VdWA@+Mnc(j6T3j@tVsj7#NS#Xcb;M%ds^PJzJ z9>hZ6w#K<>2qZ_onMKVlu}GcUId&-&sLI2rax6n;UCE4`$`3^bczf<=D0f{)WF>~l z>nlj?^Wymm5-dDCRemRGnzI^bNUm-)E~nsx(bE+HmI|2FQt^P?fCC^QDT*F zZzC+95^=}7oYK9`ReKEis#+}#lw@>KvYx#|jGV!xw&7>OCaM?__F@k;z~~(IVmyC7`v4 zG#^UL(OBQZNI@xOZF^PXQJSWWLo9UBUUrSYu8h(b{gYRW{z)c0w-@>+$|xCsrKA2y z1-6j)c*-YNJw`Dsh7eYm!MZ}Z*6fxX`!}XKdkn&^k$)~Xof~NRK!o6DeQhWwE~ArN zsi;7US<8-Jjf7Q@ZmxRGbG8WF9;^>|U|inbxZO@f6=5IvB5=(hsSP_5$-#9Rw4F?WYWlV&2dZ}n z18=9WOzmZ7{Q7;Xjqq??8&NUQRI^-krmd91wo=f;>Ehl_DYxx6O<;V`1m8{*qh(^z z@g}qiQm1ey45?4V~qjr(|@4_|^?y8XC3+wILK$ii_`0K&})&Q(Zxv;g%uDR&f^ zF{O;L;sS)*P|GCL{Hs_dXf<8HCu9(PKM!kmfMs_k{4Y^XCO9_tN#vOC3WyjGi#{R2 z!&#C4Aes#VXh;>wY4{9*Uo#y!;d zBD?WgmOKv?G1KbPcy#6%;2|e&ams!~`rV3Mf52@bOV)Vj035F7Ly2J~%J2vR&{vs; zFIDrVdlxQIWb2MCPBdkVoa~kU5SFF+eB6~dQVQ7rl?`E=f{__rq z(<`aGSGdGR3uTND&0}aG%R^fSnE{3qwxDqmTxv>g9X6+@vGXIf(6%Z(0byj9JpHzK zmwpXhP*#pp&iAgxZ={PypouSGH%{2ATJ5EvS)OBOB43=K7+Qs)I&i94x`IcqK{cL6w%?-V@kQTFph zz^NMQPdVi~BA2mWZ5t&vwL8pqHMm1Npf2&h$cv<}s=zt&1a=$d7FY`hgEc6Z)Hu$E z1T|tIIXbOf`>2q6hfk2J4bA(yTy4{-eygas#5F&o4E8wPuH-w4a@`*>fQGrxYS2|2 zbI0%*9mZ4mIu;7@tK2~Po{p=xHv6rymNFWGr>9k2gqytVq+&t zCVOPD2qOj2eEb)&T*e!6egqe$sdN;{>rzXV-kG9=vOZOfNu$#{d>GpP0eeQ-d_Xe^ z>HGXu94=`yKq>@*ZJ60%K!ZPCx0=EF{YTZ+hP zx5D=5XP+&WLtLI??l093^?=i*O z`agldx`A|-b1`WFVk7?ARg?K$HB~=1>1T$1X6h%xkJI%&riPl=oX>(;f!elST(F@) zeKClzRLw!>ibpk*zvf(ui#h8fKh0BJL;5*Jyj21DTICDMH<6!dtEQ9tPgm$?ya~jY z={e&wXzL*@xSKJC#U5wR*@QQAnYd02U~*7CQO6_)72qTX6)Kcqv_!*jSJPeSx`m%~7 z_mfbmoaObFTGRO;?e>{s+EoUdEBDuk2nLaAs7H4d>LQI<2S_KE9+cP~U({y{( zJ}qSWt3IQ4$~#E4*qfZfLUz60$5ZjtsK=61wm9qzW>U*$enlC*Zzgn^j$=E^fO%@! zO;psm=SCAM?_?8K)pxo*tYrP=UDFlhSyn9XZQbN8koSL#Hz@C9y!NtV0w`s_J^~ml zb9i%ll+l=F2mBA~`Cu>G?Z0g{(bg;4UnZ-pC*_@Yw^BUh$9aJ`$w!~y&0e;=Ls)9r z2;P#9uH@JG`DCRYDDOkYdy%~N81FHGwrftCtbCK*WX$OVS4&MOa&D$1bJ;Vf{bza} z=5FZYAF&#tv*NiNb{Sgk;X>>%Els~_-x?h4ybD0=?OGwO1eWQvVMN4F%6_~~A(%M? zh83%{v6lSgz!Ov`-GMZ#nTs0VQrl@qFWD+a(Z)XPZNzuvz89V4-?bi}GOw*0S#MpgowY zY7NU5%+)fA?k^tfyFxm`{7a_~0$TDa5gEIVPqFz0SypPBme!Lgf!wj-wn!Q9hj+Q> z3nWb!*f|8PAV^@vAQv2xiDmW)@QUgBC*hCz;ZMrtk5sEYpS;2sWgza1$YT28(jI0& zH-w#syMt+nje1h2%w2M5S(4M#V3ennl7Y8)=`abz>*@IXnPJXkc7g9b(^`0mXpCTyll0<<>pV4- zv(4i=2T-NP**bbwXvHsq2~qH74#*@rDdC;0%nQoDh@9#Pb&mmJYW(a<@3i?f)CmHI zjh@OgLph)8=!=#3n=+Y=<>Q1yZ2vfnl{jF6OZ;Gysx8G~6A$AviA_X8Xlzd@Lqbz1 zRmx!$1*;iWiOy!o6rfCAA5x1p5A7Dnu!Edq80q6pYEmXEiq(n9+Jbg7ptA`!ytFFZ zR`h*p5T|!M@W(c=^E>*X_Cq{Y;#v|JR5L8}y9=m{H)vB!Oow@R1mOnHod^407zYUIQ30mruz9 z?O=W*+69TK;e=7g1>1EfpzT71ld+5zW*>poTKwC@Xg{)WqoSXoYtP5lk$IW(dxp07 z=Q=(t_((dS4SgUhBb;kQyxWGHATw1==y0rO#^5KOB zV+v552EYR05Z#{;4Cgchn0%2<`oB;4lmct1EOod&m?M#|>LA1Y$jCN)ls$xq7xmjq zcZZd$9pnImG>GDNS5bM6(s`>G!b&6A{r0NPP|=%YjOAkRqan-r3o8S_CFs0EI~Ns# zgi|@QGgL@TH{9g>as}0-UKG+cEzMM6STr8TPL#6AcOD^|_P)B0jG)~!JJ7z+ePl9% zn^eXb6ff}RsQ!y9;(NjEi2$I8OB1McCbIaLbm^U5P)kh&8Fh>hotZ|L6JT~XXa|3z zc2;m3JjH7sBJTp=64z~%#~TeU_a{#zOBl$CUm%$5R9@g_F*M%}u2DAOXeTdYrW-0! z83yVlHd3R-w-*dpmmWhX83P_j4UT?;HHhar&Z(So9?_lizS8XK4CBVpsI2 zI?^4Y7Qhn0i^lik_f@s_vD#&T8S?qE@du4z6zV%pcq)yXRGy)MqsL5ee%T(q)-051 zzbivm*UbJ&`X2OZFG947Bd!=p>@1wY?j6Vw7+-zdNtHQ)VQx=eiSjWGCCZ0#GOjEW z@fK+%D&mJ%efK2c1n(03GBahl-|+)(_1#9_m5khDHDfI!5QMVw!bl}MX4tS}A`un6 zHFP!uou|KqTlu9KZdbx1^4FI~+*J{eu3X^$o}M%v6ppo?F{>AbVSdo1LfSOtII$g_ zVmpFtN-%At#^&lWm1RT0`>~zmeaLvZV&#rr=%i@)!LiN5<71r}*hcJP>sL1$K~YUwCNHujxR!0CcY zC+JvQN1tBA)1PPH1b(V{YR#?n73UI#t7Hy=qUFo+w_W3tyu$f8xvJwoRqN-5&WLm# z>#RaBGO6^4#70h6;+t!-xMhtirW!g=aeEUL7eS;nu@tfgclp3km4N{~LwHU;sUpym z=W_i00Ae4WzC5#eznbS~Jg4#9`^(DC$;KLFUZ+mM&N+e3n5E<|C(xB1h8l30)Hm2- zbSiH0jyNnNku!$ri4FEUoqN&w!!r{F9F8%yqI9TZOw%*-nFmTTJ*R$N9q@vUV5Zg? zb{qH@J?05)uH*&1cg<$iUrig3I!1CUehj?z(@2C<>zrbu<*j;+H|{n85FrF_ne;!} ze8hD5aVV_>i%`-kIP+(dB7gXys3pi200V$xfP^s?Ba3^s;G1{AJ2& ze03sOQ@vm7#k7x?pYj4n5;qJeexEDxRuSS%Ixr>kkq|(aSO{wA(Z-p4*9#SD7gK=G znRuW|pXBf6+gPXF=Rq{jz{0QCQ;cfcvnQPC9xcSQu(Eb+FV6|iLeCR>HSTrbPl?|+ zsAQ6Xsu7Sh3FyY?=Q(T_8OwN60fa}R6_iK@nGdlT#$^r#RnP>XF3E^?mdF< z#Dg+;hNC-cv^?=NL9JyHu>$<1KfrC*2({us<8Bg8gJt}jD|?@MD;1htu!^(GKEZ5n%GgSM(V@?y+2uv#;wIc@4~}d zgVEf>#1!D+zmMGp=|3bzwKoW~JE9S!tFIep_XtD>*s}{VJ=Y>{vbU7(y0Dq$f$p?# znluEK6*ABL$ypC@!gJRg%Uafz8fd8-!%h!sok4ew$_q8#*#mSgBL#vY_lJaWKU=ih z1nAv`@50=DgKXd~=2=Y=O+nv_dl>qjj{_~OrTI9;wG$cw&Wj&;ywPXSH0jogj<>1o zn3>d-#EIzN^HPm7?3PKI`4l;bZe%^a*IP{73CVlja(&dB?7#ryoL3;)dbc$m$I{pxaNlcIPT*iX4Ld=8oFe9&iQ*agZ>Zz z3UE2?vQ|9K4?c%V?wWJ5wM?gU%bWDoikVa8KBneaOTI;|TrG9|a%(d^TcAnD-yGi3 zjdqiER6wRM{IbT^#mwpMmseB$9nKOydE|{zoG%dWa2_PA0qN2~lDA2k2I99bJK$wM z!bA`)^N85ecj!U)98lRKUfI#_dDxWIY-(#@7$XiBX|&-E!k6T*0+tb9ETz!yWR|tL zB0ozjc`g=VE&s~T3D3ovM8Mr71o0JyC9%X9;}c*4T*_XWLNAHJ1l-qIkbTyjiOZ@8 zv|NWhDf~kwS7M9m|M@S=7~cASPWGP?u71?z-H{V}Kb z`|LSlpyMTJZ=fDyj`RI_Hh9bdkZ)E4+skA+M0Pm#umd$c*!UULz+u(^}wBy&e$FKVg7A*SE?6mWh>?w&T=CIpOs$BKt{ zIw##3R2%VE)=pfz<5HmyE_l&b6y{hP6AmbHfMOGR)G&*vTMk zEB-l@1k2C6q*+hZ_lSzh+C_Yuim2Hsb;`;`oD!==f9jYOUqV0V7<@5c)cKcXTZzY& zO#H^20`3VUKSU{ekT&5g^qiTJJ&iwBO+qX2R}nCakW3Y);wY!%GN zzgbiX!yWT|lODILp5u>QGcq>!G3^Ulam{n2ck)PwYZp5C%3=I5)`*Kl(Xot_C{nVT z*7P&xFwsR+nlmU~k*SnWfr9S^9nl=ou4>FV+e%!cCUz*gRdub|Z6!X&lSZRsH+_hK zIAkV&)Tih^xYJD3!H5YeDKNIJQec_j{A`Vxqmt*7v8&Z($4pm|60;N4BV)f)H5l)X z75^6{d)0C-r&6AmhF!r6k>Q|2GWYa0u&HZ^x--aw`?}bbH=a|hr8@f=D=V~?o@7GK z1RB;-nShR!ooy{Wj5s=0cCNMbK6SxIyixbkz3o*WGn#s%PxpfAJv-a}XR78I=To-V zQ#Fg6kBs}6^S*IcIBy&GHD|kA14?I;30mvCgxh8uZxg7=l^T=Nyt+3yBu!eqBSvU8sZ|y5wfwGgU3r%Y9i>Lse_4W`+A3ykyL=QI%ql zt&#kN672Ov@k)H~2(jD(Wmwe$_~$MH_AQay)y55uX)6$a9UtG@AbykTF`;~W^j_0CoSasm^4=P`gsM2ROinAv=`Q6Y>s?;oouQl>X1l9NmbyMG{jh#M;K!}v zi`-s7V|kx~iolo~Dg$rzstA0@v!-W7AfJ)l$ny{0hvIG~&c{4$OKgsKN*6%qQJ5Wz z!KDB!WnpYvM$2wwLOA(`!7LDCdEti0H|dk-s7TD|$1RL_WLWjl9n^z#&I>Sk?dL4a zfeP$z{2n0go&6{Geqx(xi*?)t_&Gb|T#p#jTukpQfiXohA@&-Uk7b2;203AcxO9E{ z1r+}I*|w^W&@Pnhlpt%BxjK$9g-qS=%-25&C!$iitpAUp|uCli87i*nxlfDe|3Ag~?pnG>Ly8 z{NzKCbJa8u43UI+dd?9uq+EB@I{nxH6l=AIsK%Cm;v-LDiiE+)Hu<>pt>Zy|M%+o^ z`QCC3kw$@-_*cDx20EYA19-BY1{6lrQg+yR@qefgy#_4CdF(goYa8+gJX#BnU?ujF z)+zo+ARu#=-AOV~_M^HU0_FB3AJuX&)1<|sz9dZ=r#Ni7x5zmiPY2VzU+c_!sH@kR z*02*h^U?YL*UntfvL4LSDjSts7TN^T&Gmj>5Ky5^EUt^ENAY>osMvw=T zA;Q(<&n4igrV#ni+{$$qu`Qlzl2t*$K@fN`A03fYlgJ%GQwf@!YRXf5Z@((lq|F0f zw0KQ56?iXO%nMw8Ai2b>S=T-B4R#RY#b$lgB#lHqJnuQ{aZJg4KY%~g6eMAr;19m~ zSYOg|dn#jXL;-%>iEo~7+?(cHVBG0i6A(V5h3ewYEdHi(BhM2~+S!E7d6_z}hHj*c z*A(5`b!k;hZv$Nk_ISN@)e9#Ml$OQ&cAi!$D zOH^=BQ4ix3@gdc8kHVJ}YY9p$F_P<6Q$VUot>J^;NrLi=f>)|(k@umGIxKFsgM3t2 z;(ZVo$_FiUQcY-G>7}oEnE}r8(%-!3t`1%#x=)#_I(S)RUiNrjR+yK=-pez*K+~vD zEk2xx=QMhb;eWV*c15v4&lSa$grm6>FBV>v0Tern7vbV$57esIlO9k-lV=mEYk-JU z!s~J`QW@U=!`RutM^#+?f0OJ&kmy}CYSbuEqKzinD5)kUYJem}AsB=}K;CR=O1D_4 z>;kq4Z@Vj8FAKCqOIx(qVv8+pd0LfdktT#@1Ev~~+Nh}1()MnXwy{!Jkh1^pId`*Q zpXd319{6nLcW36FJMVMm%$YOY4y*w7ICWPEe6mq%v=+F@@tpt+!+Jwu3b0>_ePezj z5TBVixrJJVbAgr6BygS+I3LIB1TFyXavH!wph!h{dnvHgNoxoga^MEwfCD!HcRA_Y z44jKEBQRsl$JzC<*?{Fo)B5&`fhA&DnkYP4W79-GmnL+(8flo z?*@B6V}xvoeO-Kb4PSd}iw>SS`tsGIj?aLDvb3~fWdkBUe}kpvLu04RhB3rk>>LsdcQUoyzLu?_fe7cNb_J*(OoFOqvBnEF6Xqsi9pORI}>ep-RbdL$f zzi6!Q=3*ry^cDUF?U86~iZstIM!7%%)>U@$JU#p+>m!BqerSgIT>BV+y5(P(XZw--=Zvarm1RJE0{~w*!u4Xq;ZDs;a#Zd#2*aH z!|V3Yx;IuvcGl|4DtoWNmh}8AlnNuk@j-evUs_w71-2@A<9(lhm zOZ{FZPgVx9n80bNmRIecG2Y6%Uo0g6F(AdM=?`4YCx2Z|(I@30jC|Pz*xA8K}w^L_ar^N!82|mapLhFuidSYAdr#t%CcWlum0ef z^rTm&{X_MNb5tqm<+i`6UdM#YEfn+e098%no|s9yVM8g7u^o(hvZ71eVsFimNwhu8wNYg7HQ%3z9q^>ue(6XZ&@ZK*(&4VvdkgI z>UIZtC|w6})aDHbWl*Yg(b_C~4Fo7vuG30-W!eGpq6|)BS;Q#}>t4Wsb?fA5b|ZnJ zk5n(NJ@&k_dD!D0EEE~bKT#;ULTQ`ESJIY_s8x3Cee z+n-}7kdFLw<{&9ct7AzG`DCCXc$htseq3*FbDz!O6C?@w)m@e7lE~?beWPUfu{x4R z{V|1Pzlc}gX3aHUeUM!Ll=d~4WuIq`6sNIzp7Tl9lIy6QN2ReQ+tjUm;uEvO1JWFY zUZ(vG+M5;c`z-{6{qv=IIB_n9WYXcUh8v-4AUb)Pk7Z?Nbs|kZGzY!@F%(an2wbr; zMkd=Xluqq&N-CJ}8ta8grlYJ8SHBZ{G;634`m~e6GT!KCl;s`d6-103=c38gkPZCi&iyegX@E76iJ-U18_+5nQ|d zW7J-CAEW9SE}s+Ln}*=KQF^v!Y$C~fJiewmKMT7hew5)ZusE*vU+miW(jTxd{|aB@ z1dpt&Wl4v_l3JGD1 z9}P>|-9z|2&UZ(HP^g_*4#%e}**~_^|{-_eo<<71Uk0qF{V}~Ne*the&GaW{_Og5e1+_$J;;f4)0Npis<7B2vL!L8zXAXB4}#G$5&APmJ#j-+2KDWC&(A1 zth?;yKPrb*c=*(~=aR>e6<4}IW_1Ep1e)+;mEo@sw~8n02q z$)$Dk!-G_WQ{g=#<=BfQlF~+kA<9kJlk@{;6^aiZt93~QRFPbYuGn@l>7K(!(44Ye zu?fi**6&p@6K08*OV^#nOCrXQ+LKAHE{mEvK|2N6jXnsanyYkFQ9G7JIjvK6n`9d- zlGGD*oJs=O(~67EJ{0c$B4f-u)_`y5SPoPD5?PG3Hh&Xw-f{H2A%_TZlGIl92bGH0I?OX%b3ELV-OY^=git=e#Pzlg};h7XSBmEA-te z-YvDgsdo$Pqihe6^BufPn3pVjoh(D9mTcE^^N3S$jbwkGedu$8S+BLXIq$a0cZbM# z7ykF}HfyFs4*8|_6RFqd+h64MbD9)QVG>5f0-4B(WMp2PqjQAYeuXw%>%XDae?79v z>9X6(ps8)@2Qu`~BHltKcD7B4T=Mm)_U90u_QiB2;6xo{bzTWcMI;H&gYdhaOzKxx z5_H5(uW8`)>4+$qPQFKk!&kM{-s=*Bq-i=>qXAk;7Y<1f*5f7}_IM%iZf?F^#xngd z_m8$@F*?64LeACfoXJ&dBckK7*piVcltt}3yni;eY+k}UIfu6x=8}Tb>mcteZ#v38 zxx5+W(EJ|-r%7S2^tnv?F8Fj9Ov*U~cyM+K+XGa*2(F|#9) zMOjq_`(haixgMaH$%c1wtj@yr`bqLRIvm*~I49#ZC}vx)PPLyKPcdG{W>jY2GO^~4 znbap!Ua$wyl%oc##BZiVGeVckX1gp*R84d>1u6q@B_F7rI+-u#+V4{w#Hhuqsf!=9+CC~1zro(1r^zA-qJdl zYws>hg1#FxsLK8TK&mSfnSl%I?cDci27IW(zDN)OGYPn$-p-K6Y4+*&aQJkt{bSxc zX9$=S`|F)dl!>WMk-v2>q6S!IU9PfXpzYDZlWpkx^Z6uq-LimyNx_pXoAI{T4jQnZsv&ppVUF#crQ^bhrQ@jJj`H~OyU*b-?uG8O$#UT?@h8dt zxU9js-{LkJt@s@;_(Ynm_xfJ2&J=#!_p47F=pF1dTcy)Xl_o=m=VDOnMp_y>GIUYt z35P|R4@Rk9S*>n)o|xH6+o5sGYfPybv<&Yf*GoKd^E2r@a&&FY3EAd7<2Kg+9iUB@ zc*J)b!A8nawjNeo|ikHqm4`pd63TMSHZ6Urpk*B)(UcPj=mPjTPiB8 zZ!*xpO8IHYuL6UoSb**Ul)q`L7bQ1TwnWBjIT|#{r{RwHy8eDnHpnO>T9Qlcd(hJh z?#)4TD}K_AzXSnmZNAJl$rNC93@N0rwDQj?D}U5Y&m=SOYF>^()5|1Pm68;$7>$eo zj7ne&CrHPWUXdTk(z}a@IRQ%=k$T>xLC+(nm9i#SC!ciW^IS}Q{(>p@ieP!Od~Bh+ zusGtDJ8oU|D^GrN-e`EnPw~2aIG-V1zC8imBKiE?LWH9M*mJCh*cN%)6>*QLpJX3> z2h3vNkK_LcJb;OYB*yrY~Z zqxWJEluDG>-s3sgHZ*u7uDaGG|9N!at+%C=-F&)8hSiMYQuv5b#ybfsC0U}nmo?;> z`Q)9j>^tv!P_inP_w744PDv@s`Dk)cfrX^$KCc~iXv*go5{tG`g!yrXeG~B|s|2$) z(`?M*Vj700aiVt*m;iT60`j#YP}Vepax$ILlFE-g$grjQ;}xQ*x9WBLG&=?VsXBfh zpQfnuoh(&`5Bjgi*3q?*EMdi6lkTs#AJN2#rgffuzr<$0$%&m8V}C56X8B`p@o{v( zv}GCLljYhf@-;^l;K9N3U!Td0v+t(rxOVsCt|sv-KX%4{f>0(J}Kx`kXRg`T=dP@)u2RA z>|q>O4pC%thNxiwOkEZ_U%ig}ItH_3bh-;}jWL$G_sR&XBh-y4zZ~^rKi9q#KX}D# z4uogAofmSA;14K>Nfe{7*qmq)(sF`hV6vh_b1Jy*jot^N(8KyGniR@)C^EaInFE8bLnd8ehE2lY}L$3Y7SSX_3{thRS-gx{~ zhMSU_H52kLW@5^C`~-KN+yOA%bz`Gy1MDXbIU0?hvg(ascGa? zRPMScX{5&F07Oeonk&N`CTc6%a{PQ3Tsbc`+<1wO2ihD&WvazdraT^v}NIP`h~xf?kl}@!yKn_kUTZg3zZ{M zyAe$HOUIReynI~Y`!Fz*?HbW(AY5L0fR`puOR_tky_2IL}Z$Fm+nJbuw|uE>`W*Pu&|K0Wv93mXCd;I=i=)A>#LxMPz9ye);ZyGm#R2MxjVUp|?FNXi@c%tqcgI}5q^*-MQ{mm|NP zYMr!iUZ(Ph*T+t_f7#-Qt-mXDDB*=NI>u)~Z2bUTjy2WdOgozqPqsTuA}P(JIDJyE z{ivk#mQjg`NPd^X4&3$a!aY{+fsZHK{gW9ci^U+zd#B)@r=x~+<+Af4UrWOReEFGW zhsw_^_ohxwx?Pb)iM~I{QHQ^gRA`>GhDO*GsFaiWFYTdgV5Zzr>#xbIw;!NxA~iXP zo{o@8dm8MYRZ|erG@GkMv|-g0nW}u8SX^xXndscm=^$%>;9GrGk2MHJgbp|1hg&3U3M3Ay{-ZSBpY`{R(sT9CrHD8UiwKgh7oI z?u>)vR%%`<%>x~okc?jN7)w%K> z)6x2*+hE(hF*D#nL(hMH=%D|QG(7A-xv{_5_Ydt8^JyrNy3KZXnM~)HrdCcIJ;u5= zQAB*5O(vxJheZn(Gg9oYpvGT)#D0qCGQS71e6`cDM{W(l68dr}S+1FqJCo!{pd8FY zT3v~^TN*?T$3G*^~36 znFlNK4Ra);^+Np+vM#n^L)R%~jCr+@=PV}wP#+8e$7222m@a;6NgJVV=zaN{3ar;3e z=T@&MDu0J8M(#~mXOc}8b>}p_j^NE;X`Y{UTNvn83kkPCcvRaOHn*!@a&wMPT2F}) z4oMNwdXC!tl?)loV%=hc{?WUzG$Tc#1&40J6k)NdS~1y*J%<3QsO(F{gV7B3pN_I! zh;s~MkA1Me42PFmm=;HBlq4~dNsf)}0r|?<%bmU`yHFid=ga3~-@grB#P`M6cW@nh zYAgG5X(!4YVw{LE(`?{!1I8ON>%J{%3)BoBrOYxqOl=RcmD_eE8a|Dm#EXWH4WjCP z$D=>xVXKE@RUQ+WPH;RKY^rs1*^bR2L2@5NUG|Cghi4cc7~!KsbpI*zD!Z~${2jP@ zv1E0w5xSn}((Lw0B-ET=6&K;aMj~N1ef?ToYv`TT_m8dT5Id2NkIRDB!~_{fyE9L8 zxH3gq`#BzUF~KI38J1E!(M|%H5}zalyh3yfH-fo?u_f*@tJnIo@XnK$_kJb=n~CGD zwU!hcJE!IAjd}wS_c$}mra^+l>>PJJC2DFTZC&x?CRzPHkxy9C-lrLM^I%3Y)oZ(y zjK2~qs@AaM?P>lji#^)KTurbSBFEdgT$ymQOM{gj7tdQ^AexNK-sGw+7|eApv#2U zyXplGLpV7ze%>RQHv^k8dLmpv*^p_5MQDYBj`@U$c3H@q;bzHTwfA^O9(zb0DMmBQ z43Q9`F8u0}ez3%jAK4t6^qYcTG+e}A`6e4uYepqQ5Kl=(X-aQM`XQ$jKPE9FJR<2g z*YQKu%LvN`BpqW(mKmOhcQibozd|@#{k-D{hs~4hC%8^@y1YUu20cmhLL$pB7Ont9 zHpr(v$g^E$n7K2-rD#vkqZ8M;Tr1ep`*jH=PX-0|f}>%?kO^Lq7Ufz9+0Bq$`9}xu z(-=9#fT5t0))HPzS+`DYXlOX`P_DJ7-5!y#Cz4yKK9Q^|PsEab>~&KIc`{Xn3webr zR?Qc(phP6|DK9`@iB@maJf&U>XA{Kw|90NKI+FEt`;m0(Kw(d$CbPW9SS2POf-!gb zej|7lNy5$ou@hEU2uEFl#gw)Y_7R9#PH93aNNPEZXM=cF?wk>TX=%#Z%E7;P_v;xIu$xa8lCBp;RSc0GlV$_iWFAH$|;AzN| z1rBqGj1C&7%K}}_Y-i5$hK~nsE(@#;++c~}SpOx*N4wMghSgEH=RmxCbb+zzPCgub zMTaibh9yCmSqw|Q^hB30-E3H4HmteddP16WR70frQl{iL=u;SZsJ0)QnNVm1_htuQ z(MDwr(A@BqHDLj+n$`8eIs{vK$lX!y5aZ#5)QW6!Y%s!q;@RpHuD9#JNn_{otF2C~ zJn~GMqsF@5>ASh<#@e50@vbNgOAkZYFT<)1r5>0yst4dlh8>r#)h9IDlShxJ*Wmk% zxyH_mR-Te%8>_DuQu}rE3;tnf`(HEOIAYaxh1};+6Gm7}IAVmB^CjgC-bcDrauRII zG^@K}@=o9%0iL6tQ6W=zUl1Yap zhPjm(u{Y%Q; zIFHs<{^}y53A-Te*uU@ek12okkq_DLr5@Q3BbiijSa(rgkQq&$z9~#a7wgFZ5plNQ zdps@A2>AiApGa6N9h$!~^{cTJe6*EcA|@r$`k|nE1RW7{x1ghfJ_AC2)qs$zm3reQ zZ9$Up*t`^a24R@v_mdQQA%%XELa(RLTPgI%6f!=h1m23x5~nBj5sq4@jrB*3{*GVp%rPS*c66=I*m7POwJ+8rnY1Mva`i~7ycm;nB!m1% zJ^7f7Y5sP(mav*dugv!KlobHR*t;ITOPTPCBq60f!BQOnQzNf+P`YhBecQs z2&X(AV6Y&@<0%hLbcn}eDG$1>cvvZq0z8_6n~6+Ov6uxpkY2H*RxO}@V^bsv%bGa> zX0{w+2n+s*#2Py@gKga;DNpJ@*9ntr(rrjs|h{+=hFpJNIwy|1{eU6je2&%I3& zOVXiGH?&G%Uzi^yt2NDRbWuZ2aZ;4Yf;8*;lV$k`FLM@MQnPv;*b4MA#3%E>U1aUC zjF9^llFimEjSG|Z+|YHXyl!CG_xJ!d&CBXo4&Fthl4D{mR2`ga-I20}!$xR?7-Dx~ zM9z@>*mnLzN|y0;PUNj>mfHV-KZ7a#*^`upX6e#tlIE{b4Cz)>I04tW^($n8>)M%#H^|Nqd`JLSk- zvZ>SBw6(91)(%_uhoRRw&Am3*wW2bkOFEyiGpkOTycl5!{}(Ug$@X@5U<`fGt&ZH} z@+2obBb8i4?H_JsmLFL3Q7nXysPctJNpo$82RnvHLH(Jr-l>vjrm#x3q-CbRBz=+4 zrjhO1e_oPqspH)oX{0sHys!L7+*to@S_EUsIx(i%WDUO$tMyV9unP>}4e=&!Pz$$F z*b*mB;q<+2?40a28xBR>7tvqKYbf@R%rBVS!u~y_T)kJWkT9#eDSpa6lC@IQJG-1Z zlTP!PaOd#5lyhOtQaGQqz6|=q;OO=BpHie;6<-&xT`Y_3H3h`kid#t^I ziBfKv%U*fvN@*&gU-Ht*Q+bN#fMwgDSqSY(j*Ww&&yL7_KOuvx%8bw#=`h-pjNMqt zWh~hJ^?Dq{Ox#pqw%FJ(XN@JZ-Ew1RId3tKP%Kgnq3#EzKCm79vVeUF6DHxHvHlQG z++APZU>l)*6bmgjG-e6u*=Lwneb>p@8(0yOoJqDs9NH154&gXkj$X>4iLHZu?D#fb zqrs1$iq*bJ!!aQnK~0>}Zk8S1z1ks|`#NbC&hYs!@PFfy zd*PCqjY){CSB!ABekg~mwm9wYY?iM)q4gwLMhTm<#^2!N^jUi@skxQ8)c;TN8oP%V zC_i#O*qE(12FvfY<0)ctpI27<1dzors~@mOMnKhhEIkTYt=_K`#srYkurE^Mt{ZW)irk$l;B9B}v z8#`)!i@e0Hk)%==pXYitt%kugq_08#P3pmU#K7L ziv3rW>$m(ee^KQc!LN+pG=4vvz-i}as$7ph#ocNA-d@8U3#+SKZTF9MO}KZoYbE%N zaFy$4k5#$Gkj@{kBu{IrT-!)jXcc+q_a<@IJznMd3%_}1s$AD4s$8@Ay~=L|@v~gj zuF3rR37bt?9)jMpq;Y_s3)@z1Y+H#@tKnJaUvPopz3`%ovoE>yvYgAWxH9*utFG36 zBSz$1bM46dPdr?w|E|COQw2BNSon#DBK>#MO*enK_?BDmKj+`5Q6-=G%x$;bURrhs z|H>=wthn>8yYH$TJ!Y)_(U?`$HREdUxp(}8x{3F(^)Sgw9G*m3f3J#BK>lHYnLo~U z4+=&fS`)Kb_Rn3h%xPpr8_T$S$Io~~5}pBn&}3%UCe-4Fc*qmGfqZ4{*XXNO;OM(=zuQYL-|f}C z8z~&fl8@?cEif&^b1Y>w>`ayw7SCV?921_Ecv@XjgmuScg)NzmY9pW^VEV8bUVh40 z&5aDqn}~8s&6HS9z}yn)q{`8sfs*&I2Zf1+u5vbDVE+RLGv`9 zFJ#B67PndU+GS4ARJ+&#=bZ6ie?QQ#Yj@5W>J^>hZe?&|Gd#8vSJsTjV(gqJtW&YM zID_qnT`ewc=JnvRY*_za2xq$tk!xrh2t#<-eCK@4>#{3_aSVIobu?L;X26Y48dtp7 zuUySn>bmV0a7P`)ctFDdN3vx8mn|ije6s1#z8H$qHH^?O`HHBap~8we+*~-w_5Y&A zKhaI@r;ALYqfE@U5B`O8Q|>wD!~)8For?14D)sJYO%a97wT9(bi*7kWf{oCNlsKu7 z3fclu=~Fq#PYWr2*{0$!jjXFj0D~Wsh8F=D9eAyNPD1N?lWpxe$cPQr>O+VnB?L?>{x!3@1!Wrjf3uZ4sMYf%AgPieO$oCH=XE&9Cml zj(ScOOp(R}BhGo0qHCOXb?VF++Se}opSWi?dlPiA>#U-~mPFuA1_)c|fjhG9ZU`;M|@1|)j_vqon}mhs(ei;FC4a;$rD znKFis+UIl6IA>gI`2_=CP2Q-s>B+54&T&mGrf4RywRf5+Zn*vV;ZmWJ8!EU=ZX7@f zAZ-XKpfB=?X})x{erj^;(2x1{Q0$9TeyJ^^KCw8*9GY0nwrqeN*%x9+?E9|FjWkFUcf*2_fJ zC#RMF%;I3GT|icXQTOzf2^VG)n_K&K=}auWt57((^tYE)lk<@9f#I623> zL|!B_UQ~zsUgG;yk0hW}641L_vv(H0Wt86Z==%ke7Wc);v!WHPq(+ zquT08Dq~P~m=-(E0B4nE9BlPm!g}`LvI`JH-1VilYckqv%KzE?Pe*lQny>O@`3yB` zo%-k}*LXD7d**bIm|%++O=x51Ez=N3b)LJ-m_^6)rO)x5_dxmYjqtNPm4D>tY})xo zNLHhqmz@0oN)!iUEj&%-4ukSX+<~jCi>zUk+Jy+Exved5K9Xq`-V+1=*pW87z=yL^dzafY?TZ5fz@y~ue;++8{%9#w`j-?xlb7yeQ~Ko z>qBmz^=D$DZY*o>=~&PH4K^=PO7UMH_Ds-0;fqpM(iJ76N8`c%3i&$rPQ11Z>5=t^ zC|LU^z{jieB1@P_0KSur!R^mv6r{lOTyTu;&>2o$jfHrr{n1H= zLHWvG9gt)H0g&PWa@E#L@NOxz+wBXau#yGvd(!A+&i=W)dfx*3D=cKh{hmIT*bnM+ ziM?K*^X=8@X3v=&YXLbUYGh)zd6(UTrbA?6zTKs6iG7^0G%|64{daNKNeS9NCCKNF zJ|?9vch;D@dqL)I;Z4omNBC=>WMGxL9A=gxKkuaHThYFM#a8}SPH#BFcjl6z!KO^K zlQ0qKPL#CT_tTQ0$j*K;$ABW24dRSuS0=K4mt^=hh1&%dD%>nEPvKgD zmk7KslM-LRBS{j|I}ND=Fc_bOC!cPrG7lql>Ma&r)H&}Y6*6e;J+ zf_bj_Yo#uRBreIO#mNQrowGaWJho&*Ecl-gEKku%*%TapR4L)8YN)KB>#?G32W9LM+ z?GY)~T$|B#ye88daZlt7G<#N%J5iJ6rH2_|*@>_w7Nd$6-WRxpDjapN-Zz}WyqvbB z`<$7PmC_l_h$u{$VcDn02R70SH!5arFNXVdr$17C7(1EvFJI+l&adh_?e_3U!{JE` zBf%qSoTUC9o9z3LW{noX?k2v^$7uzsH;9#X7zWKSI(6EO3fA>wFJZt%wkMNeOruRjAuIBT8*?Nt$<~nETi(J} zX}kaGV7o`$OJ9;|5R`>a-#yG)vMl3rOk?NO$eH%9JoyX}jMZ|q%Xo3+h9=#{D#jT{ zT#1UdhyP%cRdYrqyNGoMCAxuKeLK~n+oKKKky+jETQa=~q4A`o&@*^yA-9;5t6=A~ z#?B$Zwx^NLEgmbM?^|WO7?hnK-;z0zk{TLPI!;sBUH)S%ulTM?^vdHc+hg;8!VJb` zp6+W}26!`uj--h9D!-uVED?uY6KvDHnUoE_1`nwTf%#D&VD1Xx$mFy zh6Rz`4Y^h4$T~@&j0CQ7zW0N4I4f@YuI_i zhF^Bhzw^%*35_BBmVap%^6w)3cd`7vSU;Mboqb8V^FRI4OVhKh#6QTdKNI)SD_ ziFT(nZ_Go}obHqsjjURrY=0V|s{~pKFOv2aZ}H!M=W3q)rDjfjtIxeBIfN;2SpohRzC~(mVq&9NwvrN5L-54_@w19 zgLO!5t`-rDR~`l zuV7!n46|-yQ`u!ksDxw_grEfOg&;8nnY2)g1l@TrPXhPRxZ$@~q*)y!+ZjYd3kkG3 zeCgA#bCits62Yw7KI&j3T={nf?I)T^g|**NUvf0x%y1=sgwu(fft=9+RTx!+F`p0( zC{y(O`8!Yl&Xm6m+suYgR27^gosL>nHnnEHQcF15@DGbrrjKqa^9D{t-1nIco6NB2 zYFV#F+)L22L9oN#aWYxecB{0SCelJGBh@|i5iL!#VQu~Wk?KQ^W|`_iJ|WYNs6t|v z7H4n0NDI-E1T(BR*!I&I6hVNySW0Bsaa7j%bvA z=V8fUMth{BT2>EJ2j>%J6Ks;o47Z4@d!iXK!&=oF%&}DcMsqBN8hXvKYyuxK$7Z80 zHa5qX+t_4|y|&4r3(N-!ZQ%71qreZO*}KO*$iwk16$1(bW*Ok7kP~NN)@ltKG#>#$+$zC z!lA^qprTWl#tvk_IOHwd`RjjR&JtW(BD6k@02*kMnBM@iFNy#0iX`n=-acmWeB3eYwRTxG2 zsk+Ble~MmUsdA?#xIU!o9 z>9mH^feW4NT5k%+|K1faXTg@Oq_If8FG*sDRp8jn-7BOO(>ht8OkBRr8<@!z6WSW5 z)*};o-R_3RloJW4p~)KpMGgFOnvd_R=F2`e0}R-E0(<2_x)juvig3$a(tGH5{=0LQ?_+D>y$c)HxK5E@%C0r86i$|J(Kr& zwF+6!X|+mDQ_0Ep2^_es;#VsLeu<>Hy4Y&SVX-#fccxL-Z1=ixid$vM;e`c6&gEBR zwUj_7tEr6Z3HCDEMQYL!k#ah_$;^qk8yG2N$u}iqz#3QSYX+7|;EZ4kw{T&F6;iAj zO`5(e57XJRgDbyp_$89pFrJq0#g+>(K zx4e(?;oQ~)-%^GwmV$B+tjVlNhk@cWS}hg>rO^>XuDL299YyB2N?^TNOub>8r8>`= zRVw#;=Mz{gKn_Fa3Mc}2O)tFoCDz5VW4F9;58Zd|c+#4&-yF^qJjivDQuzi3cI0c2 zw~90T+;!BRE|rHzqihC~zu4!PpkM^0vTK|8GtU~Ak27~vn>;m9#&gYa`LRogMu=Me z9>Td?ctXv@xO|rQgx^dHq{exr#JN9-LzH}`lq6SROXWUv>%Yni`QXKWVMf? z#Gga)A>sc#=hM82nCSRPb!p*Maq3QsFWGDtP>iv=h+W`mY;8eoG z1e-L%vow@7SDqmsNwNAFKKu*N;+ua@;9{fWZs^QS0Kku@- z+GE4;F?P49HK|A*WP%^2O*138pi%oqBKf_|cLpUmvo2)TZH8l+E+*ifk_Djol(Gi! zNeykN4ViTt%(^XX%{X&hR5fR1cRi_Fds+~S?}Y2HpjJ?!hW3KKrbrf=#fn5F;RZ!A z*_0{Tj$ehMy`cLQA?ZwfO3^m_Zc-#iS-gtegsxPS31WEVyZwabDe4AYrAQP|VS5RE z9yCIc9EA9?q8*@z6&(gGRJ0596-5Y+5{ne6eksVSCIwRR=F1_C?mKgTu82(oGmUqv ztca9+`GLh_lbWyf_fN7*v(Peb;PSjIC%Etc6XAhVC*DT=B$7M1FWagsC>xz;tnP*-&*!8R&><9LfBb3 zR3EhSS@{2wMS$2*{~d&DjnHBOaQ=c`BF-!4OEgB!yNAozw+oJs4T>i76;WOHXQOo{ zN=_s9B-P}m?-l{kMrS9Lc#R{lw$c7L6*^L34CwU6BMvM54vcUI_&uaU_1msU`d z$emdkB^4Ai_MEGeI2oNpnWC!BBl${|M1&K>zEN9Dv@WQQaARDS-sgBGk>_A&@ijF&;YE4HtgwTaOJ@1nAi-mqCxus zE@L2fl;p(_#<~0zwO0T4T~g{-aY*MEdKUQ^nl@`5t8Sw;OH3G4(}WI*ivreWadRy? ze5MtaF-hiuOtYBWUS0Tv3=c2KJYZ!Mb{#my8H2U2k;+Jx*BlPFl$;DA%hF$NMONk; z0>3ntN);|E)V-H-81nKC0`M*x^!_#8XqNcyK<@;FT{$9$Z4HTgvr}d-3cl09KNg%m z1H&}FYSxOdcNzbr1Q4olIR=KxLS0lFN3ezkKW2gXCe6q_sK*eBVv*6E(!mq^q!p$I?(H;&-X;a_*uCHBjM`F_u{%d!P+R zBavci${q<}tL{i}uNPIv4AB84OJtT49#%syX7DmTN|l~0k@ELTa%UM~FKLUS4b)t3aZ;; zkHe_aNP~47m?V3pnUbfvV`8IjCy6(9ww1rdcg^aJRs2cs4V8-l-u7qJA z18XU+ZnowU3oBvm?EOx)NLj_puHeiAW4tI_|AM@(d_~qwa$dw(eIa)zH(BbT!xK|N za)gRKtcfc?o?G3`Ih5*6)}%bMp>+mrbXLFbMv5AF*rl9ZRTg*F^G$3Vg>K$TecwGt zaSSf?Ip^fkZ&{7&6cbNWRyJAuOs=YylbD=JJP zY9BmrK}3ZEi9j9|<*eCtAN$W$pARGL>GIGmV+AY=|vu;OWR8||oBholn?^buw>%#qfHZl>(aGI~s z8U9ux((v8w;728YPYDA@BSJsV7jTSn`H6$JbyImn_#GqkI8!SR!t!u##d#2}2Vs)) zAPkZb`keD19otxS6SR3pSR(8mG8YST^LZ%+3O0?HL3t%Yt1NF}LK2_I*d~gGF}R7t zOM%lFZ_`r|6t{G_jPO!9HPBKZ85^*wHw_y%Ur)Sp<-?0X z^#-fmI`9BR%TZ*rp{J?*WB+Gl%DAJksXXpS{u0%%s%^3vt(0N-JpR(NhNZ#a5uL-} z4b*Pe@P_UaJtLv9sj2L041G$hmIBGVd%86)JEL7j>l*Q8XyTCHu#xS~S^z((5Np zwZDNNnzE7cTZVaBg|wxJQl&BUd%nTvQSs%9q$V?smUACnhbU_bRsW_)I)a=jyw5P7 zr)7_F&chrQZ&Cl^SzBG~8%zq3v7gn;Uwv*EAZAqtR-^+w8KK+vNUs>8r~l*3iOii@ zzFCZ}Q6psYtjr>ZT6+B1$$4D2RfISD60gdv9mtl6I&OrPi${XVdpAIi7<_E3TG0vp z(ATIvvgtdY*-4`wCWcJfymde#R~Jm1TpwFVG)cC1x^GyMIXvUN>H3$Rlkpx0+0IZ% zMz~md#A7M73YaHL&hHIKX039K3Vr) zobk3$z&R5(N}D?ghsZ{8IH7= z3&IB4?Q}@_(qoGyAx}v|R-t*UMPx)Jb1clz53q^DaD}AF2>piobM|tK&`aQ8-O&Ue zWu#K2W;kI)%yyVb;8LnLtp$w=5!n4!qQ)6^o{;*l?hm$IBTed2KAwg_ZL|$3U}d?o zPIS<8kTHIM7FLrvf-E@g>!4vC7sV_%;CE>iG^TaCabq{p=z@tWjL;_7-C*K!PVc=$ zH08Mi7evOL3dX%lhN%8NBlIV@Z{L-aP9r?H)Z|KDM-VJ<9wVDH)GNvn1|^S01IDN^;_X)N+kteS(5J=gD)EYxN=&K3Q#6Y5t}73oI5_eR$tBaZ5&Dco zqyWli#BQT!Gbc2amBI4KM>Ae-gK@S+#ZP6HpZ*s)-Ny^4JX*7oY)z7(S)>fjNuqKh zUv_3OU&X1-Fbhf5;pwD2t*3;gq3mFsV~;=#@#U44&gssUu+>hB(0MmzOG}8zMgPN#Y1_te2zT+N`wKiKYW|4q4jnZlctWavF`6@xPG-#!j1|G3aXGvr87MimGcKm z;Z-);DUw)+xV--uD&Y)7u@$(9+L^Jx$#X-&iT7id%JlMK>|JNLjwOV>ID;viXPCZy znGeLoNRhAlftZ_hq0?mFIEGIiyUDRt?Zg=tdqz8FmRTC>5=6^s!$l4gOxniJZk5ak z^Hdivk1tuy-3Pjt4Nr$DfWR@4&wiU%t`oU6+u26w%N-EH;(5SZ{^62atoE^moz_Wd zp#9{^deeH1qq&^k+L3nfNT&M=uJc~}SBolZ$+l!V&s=#%KDflQTejqBSHaIfZ%`+t zL!>*WW6flYG^#mR)PP19JIf{-FQ!NCNgu<&=I_6>G^-B#Fn`+alXsy zJ@HQPm-YQXE5pm^!d_-_`_ekaenZRYF_Em% z_UqEB2e{HBC_A6NB@ZxZv#Rq>4<=erR)uIV5y132pjD6gZ=@Y zf^8pZ$QQwp(MuIiNW~wczF$?}+fu$o>bppNJ6NPSv|j>6MhDdQrzzhbsP9+Q_gg97 zi25#3-<5*Lox1Z0DY(@Mp2+vZVclsThm+bAjZ9=mKh4?EUlNObk37mI=pQy*N37zB z)vibQ{kyK(buI4A_#Fg~#$CqqrT0}s|3Cf>(|_VArOD>E>?F$;`2Xo4g9$Z*^9C-Y z!ET3?^Vj1U;sDtyA9`-cCvfI4{V#cnyPGc##y!g}48|9uL>F%{)|XHaD9o^~7GaI* z2xN`!J4pMO#6Gu}=6PH8cQK9CkZH38tU8=VxPsS`atMv;v?S|P6Iwirecsu>l454} zij7zU#8vh*mkkbD=wE8=?BNXV`c+Wz`-7(%n)8FFW^iQ)&%sl(jCG?F%r(|kD|is= z`~c&{RmlX(4JMH>e+1&mCQ(eIOiO5?FAYOIN^fnfa02s@nI zJnU%K>n!~gUdGO@^8L$avE-DbpPaRPY4GF&Mq~(2qUbG)$l%E-#(F=r&T3^K`1xjJ zv}9xikaX`_nD;$N_hoehKZ^YqAb64jyp+!bPd*sf z7z^R0seBj^SwKm#?YMvIc&yt1+TaRxr?4VVeSm?Ho)9xN;SbpR90prDe$hkRE z&V3N|tUNQ(vo(b9UeUb0+}K%-sT(w4hAuguD@AL~(Jr44erc$0Aq>nApO>%9iT#nu zHrZtC43=?CXv6rfnch^`)s%6vDVQiQR);8@|479`QZaqH#4A7P{}Rzg`ajR#>-=;0 z`zil)IWKUSL~O)j6vW7)9 z%EJrsl5L3jxQy))E>P;*>ibfxgm-)o#csk`v}UwRes_>T`3*__M&rs)+mR@D`j&`t z$g%0s>H(RLIqA4koujMN=@-carod4ip(7fh04$pdE*k;H&H>$Z#n3dv+2e6>}# zH+T{}Ahb_?nOn1Hnbx?>2qttIycuny5`{h15Uz(c9^3UQ-{RO|s87K|#$!9=qw$B0 z)qllDKPo05UXd@<|BW1)~|o!!)Ld& zbR!ZXp`k>Ih+T5-iRGREF-R2|FUxhuK-Kvq-M571q#d}a>_R`+)u5PsEZFW=MdsyF ze@>N)tqJ4B$8@aVlwQLzl(%B*2^Wq15s@XC+!jfT{rJnq>N)fUBm5pbfASD@G13w; z#v+!5x0iCU4rH{!Tom@eUXbiJj)dH|8sQ(22_Ym6-wiSDPT;V>cFkevYSJ!jNlO-2 zTrGFI{LSbia6d|hi0Q>(cT4m6FG*8iLA35e(seemdNGG8;Z%%0>)TYuU0-T3M9#H( zF)%Kw+Y#7s&9R^R$Jp(j<94zt+umh{|4r*m>^nqZA9;g(!#T6qR5sktS=Ef#MtQp< zQ4+V`qE$o@KLx z@exMI;#n^F4NZ{t()JBBj*Qh~sEnrINz~=CrOiyuL!U1>x#lqA^hR_B?#79Za}(Ev z+O@TxQ%M*kHAT}D^=^huk`;^(G1j6o2snRPbufN`u}<0&t0Y!P>n3T8E0z@n<5wBs zZUUTiGqV1N5rsO^0p;L*S(xAGd)i)1fAL+zl+;+bC!@=ELnF!klz%3F3;a`A>H8-E zZ}N}l?@0f>{LS}QiTB;WLVp>Jf>IG%1=slNg7KUEql58s|1H6It^XR|)iY4b3S^3k zU}w5HltaR?{Zs}IeLEOsI-^7LNNH>>eK0z7gh1g_c+I@5?_hMOY_P>1#)nGOyXzA_ zT07eHGk!mrCX9x#5GlR1V81A2?P1DoAxP9EvH$iOW=hOrD*WZg@We111C75qsX*yx zKJY&rxmUF*zc8u|9VC>Wvc`_FUz7C!O0XA7zHV7gp%%AHq+|mZ2U{}fF~Ym0Cfs2B zYRT`l%l;PgYAxL6#{zw+|0>}yLc-kLxq^=`do6a2zE;`yB(t#)^8bo4&72~>$7^E$ zCZoblB=zgqdSlNa?Hv8O(e`bUF4eCSK}(XjjIl;Yx@1z-ZnMBO>MPR9q^g}1fU4U0 z=c}5X|3Ou;^UqNAI{#!+>;Jr?Q+KDMQ+J!{)Rk$T(5Wj{z?R3S6kKV9<|@cFLel`L z@^IAZBsR*#9E}tise>bL|KER< z(K9(5=Rim0a?vB1>SO$^&WyO*Fm$lt*m##5I0$y7MLnB&Se-N4^#h3>^=#o${zW}o zQ)nAVx?R+>J&8I!J0vvfc^+rJTt(_>1Kn}sIM7}R(&$|&)D3b-^dwQI=a7U(J-s+3 z*9eKDpnW7I>aitAN%W`C0LUS63`B?IzWBI=Mm?u-az_Y>%zuq{c`76oSs;gmH-)lO zC2}@tu;2%@U*}wxrNjkQ8Fnvke3bMOkc@(5Pnz&JIn*F3^-Kq(<5#NTcsfp)Qb< zitZ%p^z=w*)N=^u@YRxvBcLah#8C-S5_SspgB%hAAg5A~Nodp)$7$o9-l)fYe7x(v zyCox;AcsU&3VBl~JBd0yIf9~|T%65Hq5$+mB~g@&6!jFRPzlIMMQIXsdMYF|>Z!!p zq-8MybU;beOA!C4-V|y~p_w2jBXh+s>Y0Z#pf$1(bf2~hzXU0Xr76@5a#FD(i8?(Y z35|Nz;A|NwWw8+yzqA&#NrIHb<`mija!71VqE62?38m}etW^@Npj$2z61yZwNwlTV zUXar+xlPAd9APFV~{Xw-8ICr^vhbz;10 zp_YXkB>o zdMa>cDv4UqM@nLX1SyI76q*8ZQqc%ScCi8U=1oFkqXa35O)0b)n{po*J?M638I ziCrnw269O31vwe%lF+E98>dt=(hC|xHDgrqqia}0BN+dMu zDaC2i;;aH4{y`0XwGyNxCZte3$SI2{N!00Sl+dVWCQhZ2m=9W~#koL&l*Gam@`IdI zEKQBrfjB;ug2 zj*(QHPDYA)Tqg&Kxj{}UGLxv&lO>^1j~8ddwK87hg08zrhMYVJ(p2Q9P(cb6fuwFa zJ;mb3#EX-yBq~8a%#*38N`jO`Z3;~QIjN{mqE62g35|LhagJ)!ng{ZYm5j`nASJON zg%*Mw68vDkLLoBuGiDO`#1Shs4Gt>hx@qQ1~jG3aycC zpwOK{V!H$>i5)5QJjfx@nnazRT@ngkh107Iyc;z9E+Nq)K}zCK3iW~<5{Hwh({n^Z zVViMwX>ksK#w&?q5~L*JDRdg-G%eT1<6T1t?ew@okjTVo(^O=GUK=f`$dMo=k()w! zAZe2f&LF3O7f2`*FHW(NCo_;1eV?>Z!+>sl_=HbnjRp zF;{|=#Jm)m4{}H>068QUN@&#M$Enp+tN`s&5+Mmv5^GXuEyyX(4N27L*(jlOU7TIo zw6=miRubDJNJ(r@p&cM670-j5RJ2McT^HxDj^JIOKj^5{EkR16Cxs4yoCe;TM4g_) z5(?Xlvr9?zgKjF8QENbgl*F+Vih~>yr$J61ah+BYZk&1@!M&jGKPwYrwgf4OoD|9h zITK&luD42s7Rqokdun4BmmnoEkV3~mPDbLOF-qdJgfj8|8y;LcdlqPplJJ5Y64@z~ z19CEwn?#+SJPD=i;$&(AF9yA*BuXTRe^hS@Re&54l}Xg;sgh9mDx3*Ar%nOg^#>`7 zMhQ|9GgD|T$SI3?N!00?FQHM-0vxv%=TgvLj|z!q2~rX(QYZv+Qn4n9Iz4M8H0s%a zGgnD$295udkk}$YN@8mYZ38(ZwkHwt3kijn*5PV0FGC!dKzcD~Wp0keHB| zB0)-`F@7L zkWlz4oMz3)5zu}maa4kogq=eDAcw?25_NixNhtCQoVcdKouJSDR8o-%a!6#QkQd~T z$Obu;nj@j`RXB5XHY)&??hq1162w2MH-$<-PSYv{Ia5)Egd)GdS*j!^fbRK)kf@g+ zB{3z18bMAfW+qXmXRd@Izrfk1Bo>06Qxbj&QW8s3s2SvtSdm1?FC-Mc3a4JnVk4;N zmy(K25~L(Hr_dIVlaZ}Sg#1E6;j3^CYfo(j{aQ)vk{~6~mO^_$PAa;RsMFIeq3~5W z6-weTX!Y}wiX#%FB#x$#4RT2ICsC(oKthpU;0$P4xLgxl_q`w_+#rWUW(sA291`9n zLVh8k@Krdu+O+aP&QiBPg7`=ErciMTm4MK4p_`S8AAA)~j}Cmbpl5YSGeLrsM12ZP z0XeB?OrlQDObLar!YNk%VgcylD(UPCB}hs5Q)ns3A<+zSTIUK0MSg+vyw0f`KueUw zMhQ|9n^I_V3T;UuYcg#1E6;j3^K zXamm!&3IATMZN@SDhg7l2;`6`PNGgviG(uo;_Urcc-|_|x0FP!1SyFLDO3+~NK8p0 zFGC!dKxORTA4lbK4~qJ0wU+JfA|XAcw>*kdu)%2}OQ^uW04J&^_C)i9cQFg@@S6r#$%C4-kiV!PmLf8;ow4t(XXu+m!syCfj z(h^~4Q|9-6o^x|eHR1dE<@K68@43&J&wb80_n!OQGxyFFmllt^Gzb|9k9SDI3sKyM z8B~chXzVGGNEeq%WVn^{x*THuLcHWvm|ZH-2Q{lizqnLlz@@lLgOG@|r+QLV!izbg58p#HAAbE)76NBJNOo>Y#YZtHvz!)Tx9YdRHZakda7pDIGEr84fXjAztz- z%ubcag~FPy%@P-X?7c3{g-ml6IK=#gc-eI^dsJd66nvj#e3jx-iRCV>hK$4-$h1YZ zc*(0U%_>m`-B2tN8^xs(^)59)MxxOn<}bucUWGZS61$(V~RNbHBq znZN<@l2>86RiXuY>7w+=F>$Fxhf60RGg;XQ8Hv;4C9hJKd`r^7VVS>>W#mc zm+B!CMFV7_XcRB=7nm-U*acOn#BOn^#2%OSy0p(B<}ZZEtHdNpa~^>{rxGnrA-dP4 z4#-4t5;9SAikG|!lcf^f(26YCw0gv)QP?i^L1s7Whs?k?AYSq+Oqoh}ePlTrg%2_k zewTufi6RX$QKXBPyb4pN64}t#RAQ#M_#=&SX%=L*&e@RJI_HX)`3uZ$l~@SRj3g8HswxNHmC-`3p>+O6-K5QHfpR zQi7Nszera zy-H+@i$BsRmvSK!#Vp8-owLPDUWI8NdDoij%dSnOmuuAL{mrCq%X*Xmf_CQ8ruXvfiz|2yK zgU}-?(JU^NIO0+ZWZL2wWKxt4@sd|zR;xr86j6z@;!=rjmwF%*g$WTNmxCW@eV$*V92R3a1lp-NuzOS~L-F{f2x zKJ;sqC=r)REOe<1GMm;?hnT+*FL{+1uk=VY^m~<9E6Y@()};_+qNsyR6dT1$UWJ*d z65F9asl*O(sl-l~c0opBw?plzd&Em#g;}i<2cUOU;-I)xqS>V*kf}%uBx1~8h?n^b zOruJihQ6r7Z8&sze+LT$Vj`P+ThEnJ`3N$Vm7cV*WzB z%wJ$SR3Zaft`eEzQi&{=vLPce(;?iv_+42nZLm7QHcR)t4hShr4oZKdHh2a@jAr(1%!kjb4(@Dp>rycAug53bSVom zZISH|^B3afz>DcoiMi06gjA$JTq-f&r4qQHeC@pOT~^>Ecp}43{z?BasD}eI#4F9C$I^Dlr?n zD_JDwic2L5T$&FVi4w^4$U^Zle<5b9bn0^GpHyPCEK`X!E>%NDVy#2%skP!|{sNPw z67|qGQY4B7aj8V3OWPqMu>&%B=T7l5e}O4biM`N`UXj=*E|u8t(gDaw9CV2J3-OXR zW2#l61Nyv5oD`Qzbh>mJG7?=5F@GUm<}WafD$xi1mrC@DOC<(eibF6yoG}u`a&f7|YM0iyR1F!4wX%%)3(TNOY=mmZibTD*RHDJ9MwhljMq-C7 zWBvjY^vR~RM_l7XVz0PVVxLRmO4!ip@e)O!xKyIwr2$CR%}Ed>V$5HNm-&kTEua#9Xx&Y6ViknskM4CT z9WoLbkdep~FY_0e?JAKAJ>{1uW{FEBX1g>OG8HL+%yuzfyv$!<_Nv5E=$45hQ7JB! zSnkqlm)1aL>#UY#%wJ$yRH6>rp%NR#r4scnH9)2!jgT4mwu_gv8PlZ_yP>a5k|_3w zOC|QYv=1^8`yta72gJ+#1*TsmTA)9x#4&NHM2AZ!AtTWVnTnhiFY^}|-#FQ{dZ6Rl zBeu9yqR*v%$Ta5wWF+F^C9lF{se~`M(DTa=N~iiEBN22d&82k6R3t-|F@J%Xs}eJz zRRL*>TygP7_qsG2G8LH%nJ5ax%lrjqsY;YV$5djexKyIjrR6TIhD40{3t2{9g{f7E z5EKYX6m{ZKiH$DRLnev_$W)|JyyR7w29?+aO}bgyVz;M5lPkt1x?1q8r+rAr9&bBOy##LN5zrduVlp|d*EI8$8w(Y-Fsf{es$hq!-4 zyyR7wK9yJqUDPPb#HA8TU8;nP#BztY{zAN@&0@yO23`w&=KazZAz7vpbuMj$q!AgM zA=4HO;${8<6I6+v(D$zsiCyB-;=5hiPLo(672BiiP4* zi87a#LMDnzhq(Siyrj*TT`I8_I{&Ij)QU?bLN3)orY$x))Sg-|Uh*nTi%RT(-hE9Z zc8W_ScDb}0k``cahRk-cSG?p^m>!il2z}{KBGD`^Eq=tM7Ra>4F^9PRLcGjhVB#v# z1>ICfs=HS<@Dg#U#6p+KTw3Z7 z^A|$oRhaoIQ4N*cArfnyLUgZ7A;?5g=MeXg2(jy8ma4>dXp>6pfJ_uSUD^d1iQNt{ ze<4I(g{fAF1JE9=$U(?RG`n;JG7>EgF@GV%`~{{?B~C;CrxIO|kvQv8H)JGw9Af@L zyyR7w9V!urro1j~F(@wnNTbq*$O{<>pF_-F2$5G|_Nhb$^b>81Ovp%Nxs(kViJ1;D ze<8$y7t^c~1<=C#B#QZvktlI#A!H=V9OC{FA@V9rhf1u0K9VOA)sT@`>ryRbBti~x z{e=+o7nm-UXoMmvu^loJJ6zfc8HrsEF@GV%u8ZkWiT%)Ct;hk$NE~#j88Q+_9Af@L zi1`alTqQao|17Dk#u7LgZDL`6|%>y{Zz8kdfH#(hkT->~x6xN5o5B zg;}T)`=Ch+r7iZ0i$BsRmkvT^;A?h>`$r(6Xu+&jiIdPjt3)ScBu=~31sRF64srho zghUS}q!Rtm_(c-M0AwWME)7DaBA)4nxPL^5`3p>gN~8&?L^@<7GF-}pOcYrTwWnr7 zNX*3SQi<8nVI9HeLPny%rTH$EIMklHP>A^p%mI~H4&8L8RAjYNh&0NjYRE*f)*h!nYP#gIrA6dC9lGCs>ELCzwehQ_K8a+_PcZdk`Hnc z1ep`7X7Q3&Vfs~~1A4wpBuNv}9+?lBbge|Z zB^q36gp9;?NaEr83-OXyVd_+35A?uNsmNY&sl+~)_CqGiIRKgM;-GlRt1yi!aSS>- zQ&N-;ajC>fmpUO6#c9Yy(IsB;D$FjGu%UfAcJ_%&CHh?&fQ&>OGP%~EcscNY;<)@sOf>KgHqS78pQLhCR1cZ4vjH*}3^akO6-CbXx_P7 zTq?20rM-}8i+v7p{e^fr@M3yY;s|suCQ-DAOC^rE)BzcZlMZqJhV`hs zClWofOeJiW`dsRVOpgr6GUhKZnJVFZ9~T&%7YQF^B>XM~T}p!_9_BA(8F>|Ewn}6} zQ{NPcnd0J)?saJvWO`(_L(E@@m-!3KYL!?By`vIk;!=sFE>%LNEtW&3BCEyAffrM! z61C9Qw&`J{N6zrdVSiL=momFO0iM$zMv4VjAcL1qK*7cY4g zrbi__Gnlyjh*ZQ283~_De#l4!9pd^6@iKpb=~Ia;Xqif6i;F+H*QH#SWCuShhDOC^rD)B+ia zV-7KYAztz-Oqoh_L9h5k;;gt-qT8h&$h3tGIrA6dC9lG)QHen){Z=`$doqS3ye|15 zBjJZka|XprUWKVuiA?A-7o8HqZ`NNf}@^B0(1DzP0puM#`Nr4l<` z+69@4?1oH5_K26f3bRio4nT)iNn0Egmr69dbObUIEs$x>W8x*R!W>kI)6hp3NT+s* zOC`>_)D0Pl9>_@8;w5dyoK}fAbnR-1Vo+Qv;d%cMc_Aa=gUoK`7cY4g##V_8s7@s^ z#ibHiE@eYTVkTsw$Q3UKUNMtpH!Fbd8;~gG%QBTHacLoBB+4L@cPu= zQ<0tGC9lHlP>H?J3hmT=;!=tIE**f3#6gF+{zAOWUtspALShKIm1I=ognt47e1B%+@&wnTmKaRl!4R=rOuGFx0KG1sL6$VkkG%+ahwyzIJ|jH$A9RzmO05Q*jD zQi;_rt$|EMsv(nit`#qN6=s%7Y=pk{evzmbmr69a)CidJE~P_8BEuo>9}zEk6{bZca-mmM zVwSl0qkCPN3mJ(5hq!-4yv$!RB*H1&F^NTs+`V!2DJAtSNIA%6ctyrj*T0hOqO z9#x5r;!=rvml_}=(dZEOkBFD~3rsLgHm%*zS(Vr$E|u8p(mu#Y?01Oy3-OXyVP>jC z3p6)VDsoI*D$(K6NytcaI>h{ic*(0U3ss^A+N~0{xKyIgrGCh4-~$eE|A=_Wt1xR+ z!uJ8bE4o3V@Iyu-=u#SFqDXg$-|rMJ^B0&pm6!=FP>Eb|@kbiv(rm~`%yo$Q3-OXy zVRooQ8FVgJ@{6V7Qi)2JmP4i@t06PwtPwBs7nr>&5rTHyE)sR(Qi+W&)k8+20W#x7 zqj)*+Vp>#U7nJuAk=QLRmDuCbUP#u>Nf2Zt_KTPK3yiH2N1*@IwrCNT7C+`v2V^8p zLMG$u6fb!d#yd?mt#0V<8>L5j#HA9pOMQ@O&VER$#P45-m-!1!rb>8kTTR|!uR3vQ7pyh1ABbIA`GiJ(KwUx=5y z3KN_zn^qRIK_#-qr4ln;%7sitW;w+57vg390+X#0CD7xVqVVKpN21K7rI3-RbcpLO z#7ka<$yJH9&~G&RtreF>!DF%=s)LNgMu(Wc5HIr=nE5KP1NzuMNb0&%Tq?24rQMK` z*y9lM7vg2t#jH_@gHTi@n#H9OM_g)wOmiM{i1`cgl2>6iszev`%}+@bXT_xw-7fV& zM#6^7KGG*%(q_yKl^BG!tPu&%O+yl1mwb?^h~FWuzYs6;7npr2kqPB~S|qZ>rBP(N zG!rsWolui)mJg`Ot>Q{-i;!=rP zmqISpImGoBLgZDLZk5;$-SQcUVuw?R?saLGOS>K7`U@fEFEDYHH~`gtOm?$_P9f4L zmySTDIa?g!`U~+ge}VB|Bm2l{=sA_>5|>uwtV`W4^*F@!7eeG!m`s(3L-7*XQwNmrbuLpOQXngDH}2pGa)l-<%*XBFQ!Z-3ZU<) z#C&n7M2SlaAtO-+8HuIhC9lHNs>B-Tuu4>mOC{F2RO?a*5;3m7kY&tYU>a4T5t?6)szfLB z3zax6E|utV=`3UJ02=#YsYqO0DlzDi=jI^^uR~ma0a4tK38u@Y zl@5JYB{IaN5}7V#L1s70c8K{4@p9nB%vOoH&?C1=6b0f^iTN&-Kt^JrLtK9$Uh*o; za+O#O9aM=m;!=rfm)1f?qShhiFT_h;h1sYQ4bT;pXcU)9YgXB}exLcHWv zm`;`GhyL|;iDE!pDiL>S&?QgyP!wK>;y%oPN~A%)J47N~Tq=>_Ql?8;kZFr-Sw>!k z30^DP#cb$Sm6$6ol_+p&zDp&Lkyt3p$g429DzO}@)3I~4xKv_|OVyCcJJ&*HXRj46 z^B0%`m8gf(^JVO85SL0cy0jfK`^XN+^vF(GMqY&}Q;EIMifS3b_d!Ntze@)o(<28R zV*WzBFu-YG=)y42{> zc88e15aPg#=~jt7(C2HVB72=ebgxVMA=4uV9Af@Lyc~Ejag{g*?OQ1ONQbzzA}3wy zgp9;#NLq#Y3-OXyVS?|IeZ+>=EfR@7aj8VVO9PORh(ktVP`n&?Z{eaEmGDDdDiMT? zM4C(KkderMj6|k*$*VB4RU#KEER`r`iHkqF*QL3Tktl$S#C-9RS78>a#8SvoiAr&) z#B!HbLq=i^WcJi*@iKpbS*;RvP{sWc#YSK5E;TyD{DlyC6{cP#c0-HHL}HIq zi0*Z1A7rA~51EP_5HEQZW{*m=K&MpVn7A~G4wp_sMxqlk5~sz>`~~KiO7uX#SS(T4 z;!=q|m--4Fqj<@yFa;{H3%dS6k=QLRmDuCbUdTx7gN(#}@iKpbsZ@z0 z(7&ogi?~$cm`fdykvIt%iB9p7He;$)q8oZwC3?iA61GcyF7-o3VnCLWS7GW@!aEaJ zrBuWR8415jLC74<(jfCQcIo0}{sOaGC9xI!x8g^YyHB|l^&f(|i% zAztz-%u@6fzQ( zkdas}Ugj?_^(wIz`h!Z;ic2LzF4aLsVk2ZE>cz`}7qeR>c0eClB^B8zE|u8j(r(B| z?17BLUh(#R_v<{TtRwk&(!bz$9w3#rhA$I&+uMYbN5n-ody_)b>o-sIRD{#&H~V=E z*UnWbp7!F2Nvjg2-j!`usn6OFU_}7LbDKy?$8uqqPL>BYRE3-aNc#1rLa*}=Ydpt<3*t=35b|n#nKU7hZZWpKV zEUfr49uS&CvB+n99_tzV7vH&(-~olv1wq!oDt1ByN_}=c3K~swULy7q^7dQ*b|q16 z*P*e@YF~*ktBvSm)mp8$D$01Enw@h851{*?C-22bmDh7O&!23nOWd$1&a=wqEb?tG zuE~99TcYk0Jn24g*jpEg&v|Sf4_R9`H|OZ$CEt9Y%--{99{oCoM;T8p_ukLb;{$uo zcx!T7U-cHCz=M1r$}jS5{ADDO2xlHhavql%iO&l>Ub#}9fL9!N;(h`9qp=?og~V`2 zOYC{Vv|6{FsJr2eeWvAHk&h>XC7(TU$_|Y=)AENCvHo*iIDO~NtZ2K`6?^dymsd!8 zo+}DQ`hsWPIQQ~P-4~C||I%aUQaelT^_+X%ysbWSV#&D&`^ziNwAlU4^4$4;tDgrj zM;}ak>GQ#J4+hVi=z8I$?sI1@9!r(#TAeFWJZDooL_!{Z7|+=hq@FVtrA5w>brmiAu=U!CwsU9lTF!OlJsW!~(w-D~))RY8TU{Q=YMp7? z)K%kK_Ny*bt)myd&!e`RN_eo{VAc1nu#Za3u-YTtfx!OfysfW$tE~A&T~$%|} z{!IJz-B%J#_Xq7)uoZUo6t;)xN^g7dIM2h0Nvl@2K}oT{)NdHart1yM7Mkm9p+@+6 zgez)h+s!;N*KCb5WSe`&p2j|46?>x#a-*BQs}f^$>t*YUQDuGdv~}4U6CKOCwUk%4 zTAx+yk1p^x6$c}q^m)qcK8db4lR(Y;v%I&C^H6Fw*t}=ud4!9D(Rmrs#p%&`GkI>~ z;>_sc>^55Sa)rJ2HlDtDqJYQRUwS35qxI662_1{=$r5INMY%ocb~bJvWZq64Wt%GU z@o3cv^0dwIJh87N{Fl6z6>V0lZaz4dls7H&R#>yG|Fz|bt5(1DJNw7qBAEX@UhJ1q zCHirD8HVk+y&%YA>3lpS?|9NN#-->yZ*-ooDmu^4(}$(<6-^twG|(-o(^Q&iSBcPr zG}`gvnW|NuY5Va$xyZk2Wn)RMs15Id*=>LA*q=V^bZmxI>a{k^HUm(ZM6_AEaab>E z%fD&*?HhcqqNc$11plVrW=UAmZ?pfV-&m&v`}2P#*x%Vd!Iayx`Sf4M52stpWh}C9 zr&3QA2kE-T1$1#*bV1sa#p#U;(&e7tmDE#lA+mc5zzcd%Cu9 z@q4$v*B;^#l0G}1=NMa^%XqZ&HP#}ZH7+_{YEbBnmV1Xbyk}#5!<*2n8%g~Z**AWQ zNc|S}jcct1-ZG2l%6<~PWzomH?F+_v5&_u@7RX+}9>C+5liJFAzsW~v&BcqYd%TQh zJnnegE*8mtCySp7F5x>bp4U5AZWVZs*UQ^Z*%T(GLD7ln`agsJKhNZ!{SCZ~Ce{@YhO`H8ji?mQ~oFmdDB7-)K*l ze*CID>V4aZ@R-PF8a%5Ad?Hb5M^@Xjma%V@&a&mYH|uvRdojk9WnZhVG<&jI@5){u zpda(vtBIJ41%^HJNQLu5cwJ0rmjrDe8@OaTc4r_0m%p<991S+WU;tf|4H95;_R`MKKp5)1c zksk^)tV2kjAN*N`qk)Fi3LIS;%Atw{*6*U5GVC-yY=!$-n?8m1OLQ{cnu4Z9-F7Ly zrlO3prlM|nj&NDcCcA=lHnfE9PlUS@vwjx5_g;^E+lSc%mN6!bDUMwE)W+BN7ihQ% zk@{clyXRhyC;R~(T3Y}ygdzH;iYtk&H_L;(o@_J6vZLvqJ6?>vO0)3H*(K%nB6`pY zr`_>l;v?1~zrC*R3Jj7XB{jju1s}pz@8Nypf)5JHCfB&&X7NsLT#zkxO5=j8#B+@cZlVIRd%T&L)_kdi z$Dse3jc7|wd)~A8mmc%wKl519H`yifpILu7c2RphxP&LKF6uAOJ5gc1JukXxAn)1e zqBu`tZFfKHtBbL_5p%y|NEWpqV<)tr<-gFI2(YISmq zs>sJ{t=|M18tBZX(&R|{2N*M_)MQ%E=REW9lita`I2-iKuadu&y2PX$Q}%O9y^Te<)G`q)?H-Cg2M zUPiO@KBON=?w#YTVCWj!)qU(If)(MbpXDCeFFO_Y!>#byuL>H$FSe#)y!)$zAe}d*dO!y zH7tKgNy#bR)G=}f<>Bhsae9TU@c0QHkKaFjyx%`@;w1lg|HMFG!h}E|7@QoK5a5U~ z+TWBZNl8xcbKn|_UcCjHv?@#mS5k&!V&|2*>F$i4sl@`zyf?>ZT0 zd48_-7HwM5EPGzy@W=Dxk9~}NT6*e5>zTWGkoA*o*7MJHvtjULYoB*~B(Wv%#1nK) zWYZu+zeifTIN8}UBA*^4hlw4tOPj7F8d}1Wtl!vo8%)V-X(Qcev-9+QD1a;5pjVdT zw(tM)l|I=N2ACtSRh%AOkZu)cL>FW{SWCZJ9}MlGI>RQM|lN28G5@7llrh}z3-Y2WyHSHY6p7H^RDLIUN6p?E9%?fC7?;Xy2loJW?;Xvs>svH>*m!(o*Q_7 zGp}2D)v@d?%6tSa;8nuwHI^k)ZYo^H>pysZh}TD1wt&}zydL3Ij*ot)A&-yg1+f|0U^~+n6ZkQRb4Pq_jlhzDHAPe3hg^#r_)a@I<^38P2IiDzL4+ zoadBp_Qv*besI`Smx`{x)~VRDvdUubvZ0Et`;%0kic|FXm=?);jx(6jEcOp5x=bAv z*2g)=nZ)7YzA`zrX%bJl{bez7LPmg2!K*o}7+JA34 zzI87>Gm(wDv`@&K18%F(>BC{gXHmmKeH`$Q(zmdUWAr^3}9%EVqK$i<80e2vUcQiQw~>n#GM z=R(#P<`ou{*{_ir(kJ21Sd&OCtra|C-g|#^YQ)Y7EiWkvEw#o}%}HAjx?`yP^PJg9 zAKvh}l=0T|_M${m;IO|U($bmI+H`MHl#x6-scMe*{_yXt34tFkia%MDh)#HTm2U2w zG+!k3YKSa~Cz|FZMaRURdTKudp_BH1w=_i(urth%lv`i&+T(6uRr%zedzPj!JE3_K zdrMR4Z2P%Ik|w9yzr$LkGA}fKvHh=KxRQue1=*O>B(M1DSw6;i$p46)8lp<%D*wd0 zl9E8fBiPtP_9}BmSH4v~>hqKzFXnjS@z}p)Y#!Q>*|x;T`b2%G#Gx7qVYdAvtZYS; zl8EMNWIlTqw%lGXGG=#Bzt7&HA4|6%b3Qiw0qy3D*1AW6np|#uarR>SwKo|{ez)yn z_|27Vkyc;txrJ8}Cw1FPi>?@0E&I#8{>WudXqMGl^0}7uNK0-?C%a4}&U~6x7>vZd zp>ga^Wma-ojD4#tmeQ15c26iZ@_Ksgd1hlclP!uPlXrqr@~IT-USG;dPOhxNEP4M4 zt1vSXA0L_=iH{4XTT>FxQu@q8>9Jgg&%s$%VYaMliY{B^i!RQPUGqU-Y`jw{T9`iP z(}SV$>}k5n*il*h4g=Yu(sqq$8h z7$3BfldP0za-_|RDfGs~B;OPAu^@6ZJ@%sY;NSzzB9rKRpv-zO?$jw&>XdTMn^pOc ztXa?fSnZ155`s+JIdD7I&`q1G!$l}L(OHvJ%Vj8g(+)mH8a`&n zt(;A^>sWR?N#69%V7aMBY$7G?7jNRj>^+m^&76D8n?K57y(WnyhD?4JA1iBG)Ng;6 z6;#*#+kKv_{q z=e7R_XYQWxB+6yI%G0j`kH5gk>U_!*i2Q(JmyXNaZ(y5jT9?`le*+FY{iozdCt717 zz22tvUQX+_cv+P4=;RB5&66U%zNYoQs=#xBrY*ip?UECRJ{5TSk12u3PvEM+Bc%gP z>j$tagOT1`Y;h+4zL49rJ~wh%-v7QT@Ug%de^p@1^}OqrcSq&jf*@~yD{uSc?IW2@ zTXHuYZd&i}{jnn)Z(1L3x<}S=b#1~MrY-M=Y0Fzz+ZQWGt#q(y{h*cjf9iVQqbu)* z>B?JI*BiMU+&J|@;1Sv@*tDLSZK1t_F+1?|%YWatFOSr=mbWQBh4Z^^(@o)Nt-Z;S zS5hLEed}(y@cl&A*TuWTI{vhD99^}}AL&j>>EN``FCWWl@=e8$-7e)a_*cSfEw39- zJvpXv?32YwjSG^VEKWwZaRFz4DUsu;rvY#bZM z4q^wJyiHWylhU6OcbdaWNTq|kGI-_kvgT*`SFUQ?AvGS(ruNPfVth}F&>TZ$n?kn_ zHf@|U=yXEXUpryqyBEGc$a;6Cv6jT8Gqm)45Urs;xor9*NBU$Ju~0$^@7M>QNk7Pc<$`iM*k$cV1iXC&Q#AHmA&A`|6G4$a(FB#$hFQ3@b+ssG-wmZ=^)dOV0)# zms9j%pFq2WfXaAP@>9Qv zA}?=geSK``(@n;`gME99?CCPbl*@p$GM9aFEU)`z=d57SmQ^fzq^f{_Unt|>`qli~ zT#Mr~EZg!3%eFkmvMpO`n-0~pmZo3J|9ivVBL}$OI>na}GVj_X-+6iXDC^rYmVKZ7 z{@(EU$jgDyEmkXC!sOQU=rxS2jH~yAFIXLsms3Ik*#L_d+!MZJK3~a3>%<;Q;n483 z%qHY?=KN-{b<})f+>_HAuhCDm+V9aU313*&`!;DR2OqM;pw(6$vB|E^P4{?6r~b#7 zuNw1l3}3LYd_Uh)Fe6zJc_%aQ_){D#tTFk?frfh48#ojX97@iKho)%u zS<~&5;^Zg4&>PyK5fyq_VcOpYG~TQ(6|vNj1F|`25%L&Hj2XFv9M%GdO2<-S?C1gQ zp%h=%lSVGFS4)%zC=nPvpv{zG_9eeCIJ6-_hc*XCis}Kg&dDfF z9(kR)rob_%2OsB;3 zkxOjS5~bHr;+oL|s?dPa^9$350!kk#pj@-MYZ1G4& za?Yf@nQ|)sOdzuAokSw#Ldx$W?_3{vVjA8=*0%>|a=a?;$uH~)G;AFjwhDVjUhk`< zP4w<-toOB%OSGC2f2718M=tRlEm8U>O8jZ`*f&thDz@_r?crhBBTFtcEA2(HcjOYc zm=dp3;`NbB_)J(aO2kGF>lMy-t>V7?!oJ~Q^^Gj~GYZpMe@61pBbWG^De(p+-Wa*W z7qvv`c}kogJ*@jQtp5DM{^4Quk1TneS?QZdzBzIU`MQO`-=f4@BbRtVOO#%q#D&qr zI!Gz2cp$%UAkgr*Zd=fy%>yHAe%Y+`FKGT{(E zU&!3cR(G3^k1Tm!3v9lO2e=HBH01lwWws9iA9CHeVV!u0IWGW02Gr zjxtjGk127Lk>Yz=qSTBOqsFy~QdaRh`GxNcZ?1Pn4y(+pbda!Qv>0Kp_^>H4G-8ZU z!f(PdqsFLV{gLc}waDJV=n-gmj`#09>F8}^kyZRke&H*_BY$P&xc)`;HouCd3@szX z6*47;hL;gaJfI~?%@8wcMWGYn1%t z6ouJmOnx$ASU)x;t}@ItX^B!Z%#0e=XEdz0@(bS@9@Z%N$;Zq}O@1TetCLbz@x}Z?zM6J&9EP3EqvR*wRZRw*QHPm&Q-Wb;^C-j2N>hSiru6b? zNAbY6*&5f|`Gs!}Z>~}DlL;!h+2ki9HdpT@?dPiuGsm?=sTpQQZLX&%Rb>@lsmd?B z!nakt>n-9$#43I{zwl+Z1z)E2FONJXtTutX!l*IIxbksR;ws}xhL$KbcvQ0~rnsH^+uvTeUz4?W`!^0Zoyyp(H(yN^J z1Wk#nj4N;aMfU?Uu8bO12c@jyKj#+u|zcJwG)it}?Ft zla?qog z>eU%jnFfDT&(pqW=4D4L@r)^9=4D4L@n2fvo}qc!N$*XOtk&M`a+=5Y+F^g-5VMzK zhL7Pxp@eG!hwdee;-nG13-J;{adPb2|4*gNA*J3gaB9QlZGl5RtB7@bdRMR@uZ1f^ z+pNTx>kB;}xUtalnVY$^FQ?EGxsG|E5AdDC2Max8c;EN_LLOFA=$Xy?M{X(fEam-j z-amCyq38Jz6?%S|QRw-f%tFt2-WTxxgS`JR?;p+L@}z7o9h_0<`3CDa%Q~j;KK?$w zbK-pw@Bfi?GVe}oRhBQ(l3c|#$A8Hw@|}v8aNSyswhG0t zUCQ?s@{dagQftyHxq5(mOWU{Y?wJ%kujlUC=BSJp##AyR~AFFQePnO)Oht*J)+A zDkP0t6G+6B$qX1G!LsNp__M2_j#i!T;ZclAmPwt%=F8pBk~d$#AaCkia z=}ix~e)*=}TFSTb3$x@KpDlqy^Rs;J7xEKX?62Tkd*6lsjIEGzTi>pyaW@Y8F8&ch z<5Hi<+un7zUpgb-|M+uGHI9`pPkWQX7p;!gZeL2Pm>}jieC;dW8;!Z}LsmE5lzUyu zvEEf}{P(u?9)3x`@Zo9$28Q-xzlRO4s>06v98D7EiY}{SZFIVIe|5Cfn?G$<>^@Iu z@>6llwgt7}vG#92$(0^s_;zJge(FgZ=QOUjG5&eA^uukR#$T+Lw#}>EmmHqXU1HIB zwX7$J%SO07h${@mZ!Tz%e!450&hdo9?9|(y4PRqVWwSi);oByU{Vyv$o@Tb#E$pm| z{Cs)#3YTTo%v)9SP|m4`xu$7+RsQjH6RYyu9%B#63>@x{C0qT0!%4Duf-D}Ri(9xo zrE1&7P-<0vf2bpHxMNk|aQn)fR>lA}j<8(0CNuqVLA2R)`hr}nv4qP&g7&jAyRgE? z#g}8*2-xx7XRl+cbpreg-Se~r*lY25tEj&s(!3AygbQotEhEf7JVcmzT*WP69(BTu z6DHSskCDZMdDIQFoiG!jk5%QzLmja^xf*;?|Kc+Hzzn`ZTtvm>Lro7Sv*_C_;$ED< z;TGK-6H>Q$=(mBx&$B3}b5%Xp>aKj4m>0z(pR9eCuL8}kvX~1}%BuI>dXI;iPg~38 z&xI@3RJX7o5gtrT+oQWkC{^~p&SAS(E0tU(3#V1{8M#`;{!uM+>9kzR7ukEN%_8O-X;7|#sbO9A$DOy@TU>5;)6eDhD-X#3T?ABahxGrq!}6K* zmAx;l)eC_*urP3jeR(hDv`1P}_>y%_*k3Utaq0OR!-T5!A>u1=~ z2=o&zu>iFST9eqelM|;XlOOi4>tkr)ve7?(mf8rEvTFhv)%`Na|8F_paBxwncx8-_ z+_gup?+G-Vpf3EdfxLm9EDC=27#!KejhEYYv&0PQW`vjVJi6jEn{~*H@hpf(SM)?T zbw@Xyjhy%LKmVO|6+^8uXKd(o-Y-ael!E<3OQU1u5Fv+(A=PM6m#ep^YtEvcaO#|* z?$D2-i+Z@>Va4faQ8$;1@2>8Xt~)DT_X~EgWy`7uWI?|y_)lFhbgarG@W`ehH*g+L z)q3)t+UM6$d+EUC%x8%|9<3V#glMPSG97SW+1eNFOTKd^YQRHK|r;&forYv zdM>?SZ5oV*{Yz>*6%Q=tyL^V)MM0~BJAp;4+>3E9+j@t2vMQ%>}z@c`cE*$A<%Riu_x~Z=?&k zD4D9ty*AExc`pM3>($T+d_0ve50Bs0vSAE6{Px%WP={Bw0y!7l@WE&xUltzWUc9HQd$Xvp4^B zLA88Fmeu@q89l`~ldOkPjTb|)F&wc$$JSDL_K2SHXpzlc-c%GUTOv(U z)P20DuaJ<+ju-XFq0)Y=PTDlc9=E8cZj!aAyYX87&5JJTjs@fnvnBQzjhuy2!rORl zOk`O82ID*lar??un)>O5kdj+nl5b!=p{ys9BCSc>l~!sNgwM-S-Q!#x;}|RH>BN;Q zn^QU?{fWGzkyh`2aM#Y(kZsKyLf zde@~vhuCfwJLybCVB2;+Zfy#3DwGH`{Ik4q5}Z4hxQ+KSMk-BkVj(xdshRh1%|k15 zPDR6mu@uPUIc<_awEtb6)3(mfZE%Bb2GN>)e`vg$>$H;VIH^u-s_v1_-b;oqU9ieI z!bkejmT(c zlKX@gGfd>XR5R}(f*)3ie7V*A?<+A@7QeR=$GOUPzEt89lCZVLW;Ye}m5~jV+5bL8 z_NspKer%cjFT6KtP-0P#%&2Kg^04Yt_m;rni#h%Eo8r3v4QMXJoe8@6EV0fq==StS zj(H!nKIe_D&GO3i|Jhty|0PDtz~KP*Ns*&*aJbvoTS-pvR9p_I@ua|4{vvH~{H6rg z&ekNaysIDk*ch(j92@&k4cCpH=hG)h{aUL6k9H+j1&+0_10fYkO}T>Zz2P3Y?{10D zI;s-p^K1D0c&=*wRO`g`?2+6bACLVZ5IM)NV3sze-D}mu zHD_#iOv;s%-^KnJ_c|HukM=&uCj#4Ss;)IV|DtuDkJ?uSzR>bkptgl5Yr8$~iDf2n zjN=NowyHpwwg{iB3dFF_w=f!|N<60mM_Ra6{gmD0pGN?B&sODk1{z-1Rd9o6XLy}; z%4uiQNDJQ6WOLBJh8NAI>-Y`pILhmPSx*P+X=Odql+-@fY*rQNzLL_JLMA;n^69wL zHXfQ*H7A+cK9_PO_BFab<#)Xwl?u1UK0_DLU~ALX5lq*$p{IkO^#!`4&H75{gXr`E~;JK7`MC5#taTXhr2PBS)RX{&|s?z0Pr_ zC>~i&&fhw;cROcT+&t`is)I8*IW9%Iz2@x4XFow@<#4MXmsQ9C z>DnPjcpXv4S%W>sSyXN>r7&6bP~N9=6vyTFXqls+;5lwCe$Sdr7B8|)r4Jo1BYiWU zD*N+&p1l8|eK~)VJExl#owohlalyIUHTI!JZY}0e3+}tiCcEOas>WAlt5YTMUT zbefx;dq`d$;=V&#`&>b=ep9z+B}eh1v)a0g2J?Pv-`Pk-h9)6`GQti!nRJq)Q4gZG z{56*Ux}UYsqMsi+h%&Hp93_R)LuogYQFNbKK6Di2s3jMF za=#oyeww|L7I%jHYlw<_b{{RTKEm;pKECN5s@qQ!T@2l0pJ&!5QM{ygVNR#94{ z)SHMFS8~&ObmdZQ#uP~c63n+$e{!DOe=Kdo38a~Y$uP4o7WY1tzQG2_;bd%u{g?ZQ znJKMRa&GRg&Xw))1=ebBWofakotzC<%Pdxn zr@C9tjHhknmcO#0vtxeF0M_ZKEPK~;y zG92AGLT>U|mly#*M82KFoP+mcRZ(W8bf`?ZC;SGkN%w>%)hBX+Xowu^M*W?E#G~^1{0Jw+^;~nVY^nAD#<;1n>g)e)A4Ki6rMU~ zMKCngdN3pJ#k;Mdtlm$t9$EC~IV;k_W9O_$55F2q#e~jMhS??-Wrlw*i!wte=d8$* z1=-=FvLHLez-(PAsG4(KNY23ceG_hj|5!Mas$IhwPs+M~t4Xe?Ni4P>|0=!uUK9nsfYAd`?k%;LE${hcZ@0)7aBwWs7{W=UzB)CAFyBi%21fJ3~QK|bK%sLIpOT}pD15ali)WL@FN?eOKFIPi5^H;G0wdBJH6K_O_32L$tY{m-$$ZPzCQ`$Ev58F^uEcyz8{VatHb{c+ch>R# zCnw8E#3t4vBn~N7Nk-uCPuUwMpa6ie_oFGeDSu&Z@;s0X;f3s>%Qt0D+jGuzg56-|D<(rz{ zSLHwGb3PxG(&zQ_Vfn2ee)A`MD(2IzoVO%AtD+?tR(npX?z+xTH|bcxEC|WNCyL#J z%27JHW_l$PAl)Bh0whT$PilhIWirzD-z|fD52sE3tqD&7r*yg4dTch9K_iqY*6RtS zi%s@~f_6{QkaX{UT9k1$a^(sWw zKSW-=zV+2HmUmk>Q!#;G%}@76x|2ec<#zRU#$`F?Fu~`zFXBxKP2|UrO3~ur8jnq~ z|G`~TUaZH6Z_uCTHlM6rU4IFB{sUF2>k?+a*AI(Z`3H+*)z)rn=mp0V0yR@C|xl5Z# zZdRssZp3&!;j;P@^^Hhaexo-3_N=U}{-j21Y}N?A$NkB%SL$EhBA%5E#GevLacRlu;bvf|kcP@-su6d;gwRv&#KjU*Y#&JfV;9-34bHj6X92jYRCp?|L-V zYKyLjbBOUJK4Sl{owS=2`k4Pi#onB*q%lc+-?SqC%(|8AU{m-3xMaFfzBqkCbh)Lr zjp!#zGz_`?;z>M~;)s>of8iL+P2>MYZh~GUo(NIlxOFPO^|55DGwDHJ&I^18a2G1E zY*N4Sz^}*>d{we(N#X27k?%h0BNaKZWeoFFLN5lk-74oNMZsPh{Ya@lGv^)IeJ}C5 z4bQQJ#Hm(xr>6>7ExVIU0f(|=bPip|E-wvivifxU-wWN&`4HP>UW@(Te5kG5e)L9y zkd0ry1#ynO_sQBg@JQzVHye2es=AT?r+iLQw;d9}^@#DyMk_d#;7Cnp=*dL7ecNAG z`xE+^-t0Y2Ysv|SU(1BfMmPB?>_2}1wHsCpUR>ZW2!FA{{yww4%dF1G+uSD~dHYHz z&H7F2<Z)>p=)r0K36OMO}k z7G~9lrrY11=Qc#9MD)K2qUP{(Q-vK{K|gaAV@1GQGJD>`Fz|2qBF8d@T4NHG zu-fd;e?rb$R`gKk3VWB-L9;*x0ygb&<@P%iTNb;m+@2}GrkF|##I9!}_7t#*rj^@A z_=cm*{@`9ola}$VrhMUP(kJJu27X>5D`jqSxR4L&c0Gq*Z^+q98*lz_MPfb4bOV{77D2{Do z?QF_cxLa46m~~)iO>INnJe~Ei2J1LC))$?%H#5xA-SR1_v1hT=kSL zQc%1SOux?0we|jrWmb_Lsbl8jR;!H|TH_==zQutr{$NRg$|bQ8_YKVUzg3$d;?HrEt>Rn{}!g@tk$X&u>c1gOk)mx}z%N_qGtJGm4haOup9 z6Oos9G;PICS%lBL@j|cuoaaCKjkCLHUI9mQ3T}PbN6nkIN^fi0t#j@2k2)=0eCCbv zieJm-T~YmssUG=BPx~v#%51|VtG`+5KrA=4P=biM~5_Gw-IGcbp{` z`EMfTEhNWm7ZrRD5w|ZB$ho5UGJYsVrfDSp$X$&jfZXLOhwn(AFYu$~%=>a>#7*@S zzN`LvrT_wG=4Mq{-mI!f_ZD`_Elq2(eBpM|uzP-gPd2uhT9?;30|6XWQV#`B~F_;gor?yg#(+?~KI$heeZo;eOta zMJ@KTyc035S*Irg{~vqr9v@Y8F8t3VlVl(RJ4(Q)Ad!n&BP|+GVu&V4E~t?pkc$Xn zkEZEVErl7-N+5A(G@H#-+e)jgwsO$-(AJ(}6-6tO3nl?A2Be-uh(@J$kAoT%lW;Nf zexJ2xLTGK@)6?Jk*YD*+_Uygx>silw)>_YcE{^2clT!S4=HHN6x@@*jme$rn05u0w zwP&qAF`3f++k_LUANHBA&jT9-NT9>dyT0eP#{XV`lv2@ktGmmo@AR?ts@qC&s{W8r zD=9cup<4^|F{8RV2uxM@Ag%D_SZt~s>+YDOHGG`ZH+zyWQ60W92d1>&JI7J?M;`#% z#uRddJ|lDICv|_+>gG{LXLsmYe!4n3tx%qPH(KYBsiI|5x2K&y@KKMPdG0Z<% z+vuoiycot)%}*Y2j6VN{Zw{2qv&sbo$CFl%T$_{=`EKryx#w+*nC*}hww?)w)0pRq zav{CBr}0U+q+~1BFN^KNmkVL!9{#kg*jd(-GX^(47qYHrHiQH;BwFlYrz!h2-vJJK zS;_YM8&)Qb5pgov%Z#vYSJ~6Z65h!jA+~q9IY_r|7%bI0Agt>u;mTSKTV*Ic;h)K- za(_Rdq4_hbQ(R_kt(Hq(Gy*hQ2RhU@or;9_s0t*gP))AvX4 z7aif&*v@FVB$Y0L{jyVMY?WL|89RO`8T_2ZsT_~ss&F>y0XR_}?FuR%JR6z*G#H&8 z`*7q>$?jOmuHVDuH%Q@i%(IqBM|UE{?9ELEY^3_+`; zOh!$31zFW8zDu*JQ++Um89V^;F$LMXu2mG z@WC3TzO5n@vorOyc@^bGv`~*as5!?7!YTPg7wj!}UsF6C^XHmzS33QdaTR{SmA5+m zUxPn3uF*=lGB3_Qj=(dnyfxmR3Rg>Sa@8I3?=z95ZB}+C;L^5X>pIfc#L@$UW?h`# z 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

"&$RegExResult[0]&"

", 1) + $StringFile = StringRegExpReplace($StringFile, "(?m)^(\d(?:(\.\d))*\)(.*))$", "##### "&$RegExResult[0], 1) + WEnd + + Return $StringFile +EndFunc \ No newline at end of file diff --git a/Utils/Slate Documentation Generator/src/SlateGenerator2.au3 b/Utils/Slate Documentation Generator/src/SlateGenerator2.au3 new file mode 100644 index 000000000..75f8ea703 --- /dev/null +++ b/Utils/Slate Documentation Generator/src/SlateGenerator2.au3 @@ -0,0 +1,310 @@ +#Region ;**** Directives created by AutoIt3Wrapper_GUI **** +#AutoIt3Wrapper_Outfile=..\bin\SlateDocGenerator2.exe +#AutoIt3Wrapper_Change2CUI=y +#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI **** +#cs +This is the main script + +The script goal is to read .lua file, extract the documentation in comment blocks, and write .md files to be converted to html by Slate : https://github.com/lord/slate +It works in 5 steps : + +First, it reads the .lua files one bt one, indentifying the comment blocks. for each comment block, it determines the kind of content the comment block describes (module, class/type or function), +find some usefull stuff (for exemple in the declaration...) and writes all of this info in the creatively named TreeHierarchy.csv, with this format : +@K=kind, @M=ParentModule, @N=Name, @P=Parent, @F=FileWhereTheCommentBlockIsLocated, @C=CarretPositionOfTheCommentBlock +The functions used to do this step are mostly found in Parser.au3 + +Then the second step is the longest : we sort the TreeHiearchy.csv, and put the result into TreeHierarchySorted.csv +The idea is to have the data in this order : +Module A +Class A (belongs to Module A) +Function A (belongs to Class A) +Function B (belongs to Class A) +Class B Class A (belongs to Module A) +Function C (belongs to Class B) +Function D (belongs to Class B) +Module B ... +The functions used to do this step are found in DataStorer.au3 + +Then, step 3 : We read each line of TreeHierarchySorted.csv, read the appropriate comment block in the .lua source files, +and write the appropriate Markdown documentation for it in a temporary folder +This is where the markdown documentation is actually written for the first time. +The functions used to do this step are found in Writer.au3 + +Step 4 ! We read the newly created Markdown files, trying to find hyperlinks/picture paths... and we replace them with the new ones. +We copy each processed file into it's final destination. +The functions used to do this step are mostly found in Parser.au3 + +And finally Step 5 : We add the new markdown files to Slate's index and delete temporary files and folder +#ce + +#include +#include +#include +#include + +; Those are the arguments that need to be passed at the start +Global $SourceFolder = $CmdLine[1] ;"./Results" +Global $OutputFolder = $CmdLine[2] ;"@ScriptDir&"/source/index.html.md" + +Global $Log = FileOpen(@ScriptDir & "\SlateGenerator2.log", 2) +Global $DataFile = FileOpen(@ScriptDir & "\TreeHierarchy.csv", 2) +Global $FunctionList = FileOpen(@ScriptDir & "\FuctionList.txt", 2) + +#include "Parser.au3" +#include "DataStorer.au3" +#include "Writer.au3" + + +Func ExitCleanly() + FileClose($DataFile) + FileClose($FunctionList) + FileWrite($Log, "SlateGenerator2 exited cleanly") + FileClose($Log) +EndFunc + + +; Small function to determine if a comment block is describing a module, a type or a function +Func IdentifyBlock($Block, $Declaration) + Local $Kind + Local $KindFunction + + $Kind = ParseForOneTag($Block, "@module") + If $Kind Then + Return "module" + EndIf + + $Kind = ParseForOneTag($Block, "@type") + If $Kind Then + Return "type" + EndIf + + + $KindFunction = ParseFunctionName($Block, $Declaration) + If $KindFunction[0] Then + Return "function" + EndIf + + Return "" +EndFunc + + + + +; ----------------------------------------------------------------- +; Main +; ----------------------------------------------------------------- + +; Step 1 ! +; ----------------------------------------------------------------- + +Local $SourceList = _FileListToArrayRec($SourceFolder, "*", $FLTAR_FILES, $FLTAR_RECUR, $FLTAR_NOSORT, $FLTAR_FULLPATH) +Local $CurrentFile +Local $CarretPos = 0 +Local $CommentBlock +Local $CommentKind +Local $CommentInfo[2] +Local $CurrentModule + +ConsoleWrite("1. Parsing Source Files... ") +FileWrite($Log, @CRLF&@CRLF&@TAB&"INFO : Building Hierarchy" & @CRLF) +For $i=1 To $SourceList[0] ; for each .lua source file + + + FileWrite($Log, "DEBUG : "&$SourceList[$i]) + + ; let's read the next .lua source file + $CurrentFile = FileOpen($SourceList[$i], $FO_READ) + FileWrite($Log, @CRLF&"INFO : Reading File "&$SourceList[$i] & @CRLF) + While True ; for each comment block in the current .lua source file + + ; We read the next comment block. If we could not, it's probably eof, time to open the next .lua file + $CommentBlock = ReadNextBlock($CurrentFile, $CarretPos) + If Not $CommentBlock[1] Then + ExitLoop + EndIf + + $CarretPos = $CommentBlock[0] + $CommentKind = IdentifyBlock($CommentBlock[1], $CommentBlock[2]) + ; Depending on the kind of comment block it is, we write the appropriate line in TreeHierarchy.csv + Switch $CommentKind + Case "function" + $CommentInfo = ParseFunctionName($CommentBlock[1], $CommentBlock[2]) + AddNode("function", $CurrentModule, $CommentInfo[0], $CommentInfo[1], $SourceList[$i], $CommentBlock[3]) + FileWrite($Log, "INFO : Added function "&$CommentInfo[0]&" to hierarchy" & @CRLF) + Case "type" + $CommentInfo[0] = ParseForOneTag($CommentBlock[1], "@type") + $CommentInfo[1] = ParseForOneTag($CommentBlock[1], "@extends") + $CommentInfo[1] = StringRegExpReplace($CommentInfo[1], "(.*#)", "") + AddNode("type", $CurrentModule, $CommentInfo[0], $CommentInfo[1], $SourceList[$i], $CommentBlock[3]) + FileWrite($Log, "INFO : Added type "&$CommentInfo[0]&" to hierarchy" & @CRLF) + Case "module" + $CurrentModule = ParseForOneTag($CommentBlock[1], "@module") + AddNode("module", "", $CurrentModule, "", $SourceList[$i], $CommentBlock[3]) + FileWrite($Log, "INFO : Added module "&$CurrentModule&" to hierarchy" & @CRLF) + EndSwitch + + WEnd + $CarretPos = 0 + FileClose($CurrentFile) + +Next +ConsoleWrite("Done"&@CRLF) + + +; Step 2 ! +; ----------------------------------------------------------------- +ConsoleWrite("2. Sorting Hierarchy") +FileWrite($Log, @CRLF&@CRLF&@TAB&"INFO : Sorting Hierarchy" & @CRLF) +; The magic happens in DataStorer.au3 +DataSort() +ConsoleWrite("Done"&@CRLF) + + + +; Step 3 ! +; ----------------------------------------------------------------- +ConsoleWrite("3. Writing Markdown Documentation") +FileWrite($Log, @CRLF&@CRLF&@TAB&"INFO : Writing Markdown Documentation" & @CRLF) + +Local $CurrentOutput +Local $CurrentFolder +Local $RegexResult +Local $Line +Local $CarretPos = 0 +Local $Results +Local $Output +Local $Declaration + +FileSetPos($DataFile, 0, $FILE_BEGIN) +While True ; For each line in TreeHierarchySorted.csv + + ; read the next line until eof + FileSetPos($DataFile, $CarretPos, $FILE_BEGIN) + $Line = FileReadLine($DataFile) + If @error Then ; eof + ExitLoop + Endif + + $CarretPos = FileGetPos($DataFile) + + ; find the file/position of the next comment block referenced in the line + $RegexResult = StringRegExp($Line, "\@F=(.+?),", $STR_REGEXPARRAYMATCH) + $CurrentFile = FileOpen($RegexResult[0], $FO_READ) + + $RegexResult = StringRegExp($Line, "\@C=(.+?),", $STR_REGEXPARRAYMATCH) + $DataPos = $RegexResult[0] + + ; get the comment block itself + $Results = ReadNextBlock($CurrentFile, $DataPos) + $Block = $Results[1] + $Declaration = $Results[2] + + + ; choose the right function to write mardown depending on the type of comment block + $RegexResult = StringRegExp($Line, "\@K=(.+?),", $STR_REGEXPARRAYMATCH) + + If $RegexResult[0] == "module" Then + ConsoleWrite(".") + ; We need the name of the folder containing this particular source file + $RegexResult = StringRegExp($Line, "\@F=(.+?),", $STR_REGEXPARRAYMATCH) + $RegexResult = StringRegExp($RegexResult[0], "\\(.*)\\.*\.lua", $STR_REGEXPARRAYMATCH) + If @error Then + $CurrentFolder = "" + Else + $CurrentFolder = $RegexResult[0] + Endif + + ; Now we can write the markdown for this module + $CurrentOutput = WriteModule($Block, $CurrentFolder) + EndIf + + If $RegexResult[0] == "type" Then + ; We need the name of the Module containing the type + $RegexResult = StringRegExp($Line, "\@M=(.+?),", $STR_REGEXPARRAYMATCH) + + ; Now we can write the markdown for this type + WriteType($Block, $RegexResult[0], $CurrentOutput) + EndIf + + If $RegexResult[0] == "function" Then + ; We can write the markdown for this function + WriteFunction($Block, $Declaration, $CurrentOutput) + EndIf + + FileClose($CurrentFile) +Wend +ConsoleWrite("Done"&@CRLF) + + +; Step 4 ! +; ----------------------------------------------------------------- +ConsoleWrite("4. Processing Hyperlinks...") +FileWrite($Log, @CRLF&@CRLF&@TAB&"INFO : Processing Hyperlinks" & @CRLF) +Local $i=1 +Local $TempFilesArray = _FileListToArray(@ScriptDir & "/TEMP") +Local $CurrentFile +Local $FinalFile +While $i <= $TempFilesArray[0] ; For each markdown file in the temporary folder + + ;read the file + $CurrentFile = FileOpen(@ScriptDir & "/TEMP/" & $TempFilesArray[$i], 0) + ; The magic happens in Parser.au3 + $FinalString = ReplaceHyperlinks($CurrentFile) + + ; copy the result to the final file location + $FinalFile = FileOpen($OutputFolder & "/includes/" & $TempFilesArray[$i], 2) + FileWrite($FinalFile, $FinalString) + + FileClose($FinalFile) + FileClose($CurrentFile) + $i += 1 +WEnd +ConsoleWrite("Done"&@CRLF) + + +; Step 5 ! +; ----------------------------------------------------------------- +ConsoleWrite("5. Adding new documentation to index...") +FileWrite($Log, @CRLF&@CRLF&@TAB&"INFO : Adding new documentation to index" & @CRLF) + +; Now this is a bit annoying : there is no way to insert a line in a document. +; So we need to read the first half of it, read the second half, and the wipe the whole document +; This way, in the new doc, we can write the first half, what we wanted to insert, and then the second half ! + +; Let's store the index file in $IndexString +Local $IndexFile = $OutputFolder&"/index.html.md" +Local $IndexFileHandle = FileOpen($IndexFile, 0) +Local $IndexString = FileRead($IndexFileHandle) +$IndexString = StringRegExpReplace($IndexString, "-\h[A-Z][a-z]+\.[A-Z][a-z]+\s", "") + +; Now we slpit it into and store the results in $BeforeString and $AfterString +Local $SearchPos = StringInStr($IndexString, "search:") +local $BeforeString = StringTrimRight($IndexString, StringLen($IndexString) - $SearchPos + 5) +local $AfterString = StringTrimLeft($IndexString, $SearchPos - 1) + +; reopening the index file wiping everything +FileClose($IndexFileHandle) +$IndexFileHandle = FileOpen($IndexFile, 2) + +; write the first half +FileWrite($IndexFileHandle, $BeforeString) +Local $IncludePos = StringInStr($IndexString, "includes:") +FileSetPos($IndexFileHandle, $IncludePos + 10, $FILE_BEGIN) + +; add the new markdown files to the index +$i = 1 +While $i <= $TempFilesArray[0] + FileWrite($Log, StringTrimRight($TempFilesArray[$i], 3)&@CRLF) + + FileWrite($IndexFileHandle, " - "&StringTrimRight($TempFilesArray[$i], 3)&@CRLF) + $i+=1 +WEnd +FileWrite($IndexFileHandle, @CRLF) + +; append the second half of the file +FileWrite($IndexFileHandle, $AfterString) +FileClose($IndexFileHandle) +ConsoleWrite("Done"&@CRLF) + +; WE ARE DONE ! +ExitCleanly() diff --git a/Utils/Slate Documentation Generator/src/Writer.au3 b/Utils/Slate Documentation Generator/src/Writer.au3 new file mode 100644 index 000000000..b6a249540 --- /dev/null +++ b/Utils/Slate Documentation Generator/src/Writer.au3 @@ -0,0 +1,209 @@ +; Takes an array and returns it in a markdown flavored list +; If the list is a retun, then, there is no variable name... +Func ArrayToList($Array, $Return) + $String = "" + $i = 0 + do + $String &= "* " + $String &= $Array[$i] & " " + + If $Return Then + If $Array[$i + 2] == "" or $Array[$i + 2] == " " Then + $String &= @CRLF + Else + $String &= " " & $Array[$i + 1] & " " & $Array[$i + 2] & @CRLF + EndIf + Else + + $String &= $Array[$i + 1] + If $Array[$i + 2] == "" or $Array[$i + 2] == " " Then + $String &= @CRLF + Else + $String &= " : " & $Array[$i + 2] & @CRLF + EndIf + EndIf + $i += 3 + Until $i >= UBound($Array) + Return $String +EndFunc + + +Func WriteModule($Block, $Group) + Local $ModuleName = ParseForOneTag($Block, "@module") + DirCreate(@ScriptDir & "\TEMP") + Local $Output = FileOpen(@ScriptDir & "\TEMP\" & $Group & "." & $ModuleName & ".md", $FO_OVERWRITE) + Local $Data = "" + Local $DataPos = 1 + + FileWrite($Log, @CRLF&@TAB&"Writing "&$Group & "." & $ModuleName & ".md" &@CRLF) + FileWrite($Log, "Writing Module "&$ModuleName&@CRLF) + + ; Add title of Module + FileWrite($Output, "# " & $Group & "." & $ModuleName & " Module" & @CRLF) + + ; Copy the short description + While StringRight($Data, 1) <> @CRLF And StringRight($Data, 1) <> @CR + If StringRight($Data, 7) == "@module" Then ; If there is no comment in the module block + Return $Output + EndIf + $Data &= StringMid($Block, $DataPos, 1) + $DataPos += 1 + WEnd + $Data = StringTrimRight($Data, 1) + $Block = StringTrimLeft($Block, $DataPos) + FileWrite($Output, $Data & @CRLF) + + ; copy the long description + $DataPos = 1 + $Data = "" + $Omit = False + While StringRight($Data, 7) <> "@module" + $Data &= StringMid($Block, $DataPos, 1) + $DataPos += 1 + WEnd + $Data = StringTrimRight($Data, 8) + FileWrite($Output, $Data & @CRLF) + Return $Output +EndFunc + + +Func WriteType($Block, $ModuleName, $Output) + Local $TypeName = ParseForOneTag($Block, "@type") + Local $ParentClass = GetData($TypeName, "parent") + Local $Fields = ParseForTags($Block, "@field") + + FileWrite($Log, "Writing Type "&$TypeName&@CRLF) + + ; Add title of Type + FileWrite($Output, "## " & $TypeName & " Class" & @CRLF) + + ; Add hierearchy info if necessary. Some cool ASCII drawing is going on ! + If $ParentClass <> "ROOT" Then + FileWrite($Output, "
" & @CRLF)
+		FileWrite($Output, "Inheritance : The " & $TypeName & " Class inherits from the following parents :" & @CRLF)
+		Local $Hierarchy = GetParents($TypeName)
+		Local $String = ""
+		Local $TabBuffer = @TAB
+		$String &= $Hierarchy[0]&@CRLF
+		For $i=1 to UBound($Hierarchy)-1
+			$String &= $TabBuffer&"`-- "&$Hierarchy[$i]&@CRLF
+			$TabBuffer &= @TAB
+		Next
+		FileWrite($Output, $String)
+		FileWrite($Output, "
" & @CRLF) + Else + FileWrite($Output, "
" & @CRLF)
+		FileWrite($Output, "The " & $TypeName & " class does not inherit" & @CRLF)
+		FileWrite($Output, "
" & @CRLF) + EndIf + + ; Copy the long description + Local $DataPos = 1 + Local $Data = "" + Local $Omit = False + + While StringRight($Data, 1) <> @CR ; We discard the first line + $Data &= StringMid($Block, $DataPos, 1) + $DataPos += 1 + WEnd + ; If there is a tag in the first line, there is no description + if StringInStr($Data, "@type") == 0 and StringInStr($Data, "@extends") == 0 and StringInStr($Data, "@field") == 0 Then + $Data = "" + $DataPos += 1 + + While StringRight($Data, 5) <> "@type" + $Data &= StringMid($Block, $DataPos, 1) + $DataPos += 1 + WEnd + $Data = StringTrimRight($Data, 5) + FileWrite($Output, $Data & @CRLF) + EndIf + + ; Add the Attributes + If IsArray($Fields) Then + FileWrite($Output, "

Attributes

" & @CRLF & @CRLF) + FileWrite($Output, ArrayToList($Fields, False) & @CRLF) + EndIf + FileWrite($Output, @CRLF) + Return $TypeName +EndFunc + + + +Func WriteFunction($Block, $Declaration, $Output) + Local $RegexResult = ParseFunctionName($Block, $Declaration) + Local $FunctionName = $RegexResult[0] + Local $TypeName = $RegexResult[1] + Local $Parameters = ParseParams($Block, $Declaration) + Local $Returns = ParseForTags($Block, "@return") + Local $Usage = ParseForOneTag($Block, "@usage") + Local $RegexResult + + FileWrite($Log, "Writing Function "&$FunctionName&@CRLF) + + If StringLeft($FunctionName, 1) == "_" Then + _FileWriteLog($Log, @TAB&@Tab&"Function is private. Ignored." & @CRLF) + Return $FunctionName + EndIf + ; Add the class before the function name + If IsArray($Parameters) Then + If $Parameters[1] == "self" Then + $FunctionName = $TypeName & ":" & $FunctionName + EndIf + Else + $FunctionName = $TypeName & "." & $FunctionName + EndIf + + ; add the parameters in parenthesis + $FunctionName &= "(" + If IsArray($Parameters) Then + For $i = 3 To UBound($Parameters) - 3 Step 3 + $FunctionName &= $Parameters[$i + 1] & ", " + Next + If UBound($Parameters) > 3 Then + $FunctionName = StringTrimRight($FunctionName, 2) + EndIf + EndIf + $FunctionName &= ")" + + ;write the file name + FileWrite($Output, "### " & $FunctionName & @CRLF) + + ;Write the exemple if any + If $Usage <> "" Then + FileWrite($Output, "``` lua") + FileWrite($Output, $Usage) + FileWrite($Output, "```" & @CRLF) + EndIf + + ;Write the description + FileWrite($Log, $Block) + FileWrite($Log, StringTrimRight($Block, StringLen($Block) - StringInStr($Block, "@param") + 1) & @CRLF) + FileWrite($Output, StringTrimRight($Block, StringLen($Block) - StringInStr($Block, "@param") + 1) & @CRLF) + + ; Write the parameters + FileWrite($Output, "

Parameters

" & @CRLF) + If IsArray($Parameters) Then + FileWrite($Output, ArrayToList($Parameters, False) & @CRLF) + EndIf + + ; Write the returns + FileWrite($Output, "

Returns

" & @CRLF) + If IsArray($Returns) Then + FileWrite($Output, ArrayToList($Returns, True) & @CRLF) + EndIf + + FileWrite($Output, @CRLF) + + ; add to the list of function balises (useful for hyperlinks) + $RegexResult = ParseFunctionName($Block, $Declaration) + Local $URLBalise = $TypeName & "-" & $RegexResult[0] & "-" + If IsArray($Parameters) Then + For $i = 3 To UBound($Parameters) - 3 Step 3 + $URLBalise &= StringLower($Parameters[$i + 1]) & "-" + Next + EndIf + $URLBalise = StringTrimRight($URLBalise, 1) + FileWrite($FunctionList, $URLBalise & @CRLF) + return $FunctionName +EndFunc \ No newline at end of file diff --git a/docs/Documentation/AI_Patrol.html b/docs/Documentation/AI_Patrol.html index 21275d1d5..da3a39afb 100644 --- a/docs/Documentation/AI_Patrol.html +++ b/docs/Documentation/AI_Patrol.html @@ -951,6 +951,9 @@ Use the method
AIPATROLZONE.M + +

This table contains the targets detected during patrol.

+
diff --git a/docs/Documentation/CommandCenter.html b/docs/Documentation/CommandCenter.html index 99e1f3291..7b2d84919 100644 --- a/docs/Documentation/CommandCenter.html +++ b/docs/Documentation/CommandCenter.html @@ -251,24 +251,60 @@ REPORT:Add(Text)

Add a new line to a REPORT.

+ + + + REPORT:AddIndent(Text) + +

Add a new line to a REPORT.

REPORT.ClassName + + + + REPORT:HasText() + +

Has the REPORT Text?

+ + + + REPORT.Indent + + REPORT:New(Title)

Create a new REPORT.

+ + + + REPORT.Report + + + + + + REPORT:SetIndent(Indent) + +

Set indent of a REPORT.

REPORT:Text(Delimiter)

Produces the text of the report, taking into account an optional delimeter, which is \n by default.

+ + + + REPORT.Title + + @@ -765,6 +801,32 @@ Group#GROUP

#REPORT:

+ +
+
+
+ + +REPORT:AddIndent(Text) + +
+
+ +

Add a new line to a REPORT.

+ +

Parameter

+
    +
  • + +

    #string Text :

    + +
  • +
+

Return value

+ +

#REPORT:

+ +
@@ -779,6 +841,38 @@ Group#GROUP

+ +
+
+
+ + +REPORT:HasText() + +
+
+ +

Has the REPORT Text?

+ +

Return value

+ +

#boolean:

+ + +
+
+
+
+ + + +REPORT.Indent + +
+
+ + +
@@ -805,6 +899,46 @@ Group#GROUP

#REPORT:

+ +
+
+
+ + + +REPORT.Report + +
+
+ + + +
+
+
+
+ + +REPORT:SetIndent(Indent) + +
+
+ +

Set indent of a REPORT.

+ +

Parameter

+
    +
  • + +

    #number Indent :

    + +
  • +
+

Return value

+ +

#REPORT:

+ +
@@ -832,6 +966,20 @@ Group#GROUP

#string: The report text.

+ +
+
+
+ + + +REPORT.Title + +
+
+ + +
diff --git a/docs/Documentation/Controllable.html b/docs/Documentation/Controllable.html index 5b025cdc7..ad27bec5c 100644 --- a/docs/Documentation/Controllable.html +++ b/docs/Documentation/Controllable.html @@ -382,7 +382,7 @@ This is different from the EnRoute tasks, where the targets of the task need to - CONTROLLABLE:IsTargetDetected(DCSObject) + CONTROLLABLE:IsTargetDetected(DCSObject, DetectVisual, DetectOptical, DetectRadar, DetectIRST, DetectRWR, DetectDLINK) @@ -1466,19 +1466,49 @@ WayPoints If WayPoints is given, then return the WayPoints structure.

-CONTROLLABLE:IsTargetDetected(DCSObject) +CONTROLLABLE:IsTargetDetected(DCSObject, DetectVisual, DetectOptical, DetectRadar, DetectIRST, DetectRWR, DetectDLINK)
-

Parameter

+

Parameters

  • DCSObject :

    +
  • +
  • + +

    DetectVisual :

    + +
  • +
  • + +

    DetectOptical :

    + +
  • +
  • + +

    DetectRadar :

    + +
  • +
  • + +

    DetectIRST :

    + +
  • +
  • + +

    DetectRWR :

    + +
  • +
  • + +

    DetectDLINK :

    +
diff --git a/docs/Documentation/Database.html b/docs/Documentation/Database.html index e43251af7..bdaa3f280 100644 --- a/docs/Documentation/Database.html +++ b/docs/Documentation/Database.html @@ -326,6 +326,12 @@ The following iterator methods are currently available within the DATABASE:

DATABASE:ForEachPlayerJoined(IteratorFunction, ...)

Iterate the DATABASE and call an iterator function for each player who has joined the mission, providing the Unit of the player and optional parameters.

+ + + + DATABASE:ForEachStatic(IteratorFunction, FinalizeFunction, ...) + +

Iterate the DATABASE and call an iterator function for each alive STATIC, providing the STATIC and optional parameters.

@@ -1279,6 +1285,43 @@ self

+ +DATABASE:ForEachStatic(IteratorFunction, FinalizeFunction, ...) + +
+
+ +

Iterate the DATABASE and call an iterator function for each alive STATIC, providing the STATIC and optional parameters.

+ +

Parameters

+
    +
  • + +

    #function IteratorFunction : +The function that will be called for each object in the database. The function needs to accept a STATIC parameter.

    + +
  • +
  • + +

    FinalizeFunction :

    + +
  • +
  • + +

    ... :

    + +
  • +
+

Return value

+ +

#DATABASE: +self

+ +
+
+
+
+ DATABASE:ForEachUnit(IteratorFunction, FinalizeFunction, ...) diff --git a/docs/Documentation/Designate.html b/docs/Documentation/Designate.html index 9854fc628..0b38068a2 100644 --- a/docs/Documentation/Designate.html +++ b/docs/Documentation/Designate.html @@ -279,7 +279,7 @@ each detected set of potential targets can be lased or smoked...

- DESIGNATE:MenuStatus(AttackGroup) + DESIGNATE:MenuStatus(AttackGroup, Duration) @@ -375,7 +375,7 @@ each detected set of potential targets can be lased or smoked...

- DESIGNATE:SendStatus(AttackGroup, MenuAttackGroup) + DESIGNATE:SendStatus(AttackGroup, Duration, MenuAttackGroup)

Sends the status to the Attack Groups.

@@ -1065,19 +1065,24 @@ function below will use the range 1-7 just in case

-DESIGNATE:MenuStatus(AttackGroup) +DESIGNATE:MenuStatus(AttackGroup, Duration)
-

Parameter

+

Parameters

  • AttackGroup :

    +
  • +
  • + +

    Duration :

    +
@@ -1556,7 +1561,7 @@ The Attack collection of GROUP objects to designate and report for.

-DESIGNATE:SendStatus(AttackGroup, MenuAttackGroup) +DESIGNATE:SendStatus(AttackGroup, Duration, MenuAttackGroup)
@@ -1572,6 +1577,12 @@ The Attack collection of GROUP objects to designate and report for.

  • +

    #number Duration : +The time in seconds the report should be visible.

    + +
  • +
  • +

    MenuAttackGroup :

  • diff --git a/docs/Documentation/Detection.html b/docs/Documentation/Detection.html index af236b70d..73f24c75d 100644 --- a/docs/Documentation/Detection.html +++ b/docs/Documentation/Detection.html @@ -192,6 +192,12 @@ DETECTION uses the in-built detection capabilities of DCS World, but adds new fu DETECTION_AREAS:CreateDetectionItems()

    Make a DetectionSet table.

    + + + + DETECTION_AREAS:DetectedItemMenu(Index) + +

    Menu of a detected item using a given numeric index.

    @@ -204,6 +210,12 @@ DETECTION uses the in-built detection capabilities of DCS World, but adds new fu DETECTION_AREAS.DetectedItems

    A list of areas containing the set of Units, Zones, the center Unit within the zone, and ID of each area that was detected within a DetectionZoneRange.

    + + + + DETECTION_AREAS:DetectedReportDetailed() + +

    Report detailed of a detection result.

    @@ -331,7 +343,7 @@ DETECTION uses the in-built detection capabilities of DCS World, but adds new fu - DETECTION_BASE:AddDetectedItem(DetectedItemIndex, Set) + DETECTION_BASE:AddDetectedItem(ItemPrefix, DetectedItemIndex, Set)

    Adds a new DetectedItem to the DetectedItems list.

    @@ -424,6 +436,12 @@ DETECTION uses the in-built detection capabilities of DCS World, but adds new fu DETECTION_BASE.DetectedItemMax + + + + DETECTION_BASE:DetectedItemMenu(Index) + +

    Menu of a detected item using a given numeric index.

    @@ -513,12 +531,24 @@ The different values of Unit.Category can be:

    Multiple Unit.Category entries can be given as a table and then these will be evaluated as an OR expression.

    + + + + DETECTION_BASE:GetDetectedID(Index) + +

    Get a detected ID using a given numeric index.

    DETECTION_BASE:GetDetectedItem(Index)

    Get a detected item using a given numeric index.

    + + + + DETECTION_BASE:GetDetectedItemID(Index) + +

    Get a detected ItemID using a given numeric index.

    @@ -905,6 +935,42 @@ The different values of Unit.Category can be:

    DETECTION_BASE.DetectedObject.Identified + + + + DETECTION_BASE.DetectedObject.IsVisible + + + + + + DETECTION_BASE.DetectedObject.KnowDistance + + + + + + DETECTION_BASE.DetectedObject.KnowType + + + + + + DETECTION_BASE.DetectedObject.LastPos + + + + + + DETECTION_BASE.DetectedObject.LastTime + + + + + + DETECTION_BASE.DetectedObject.LastVelocity + + @@ -917,12 +983,6 @@ The different values of Unit.Category can be:

    DETECTION_BASE.DetectedObject.Type - - - - DETECTION_BASE.DetectedObject.Visible - - @@ -939,6 +999,12 @@ The different values of Unit.Category can be:

    DETECTION_TYPES:CreateDetectionItems()

    Create the DetectedItems list from the DetectedObjects table.

    + + + + DETECTION_TYPES:DetectedItemMenu(Index, DetectedTypeName) + +

    Menu of a DetectedItem using a given numeric index.

    @@ -1015,6 +1081,12 @@ The different values of Unit.Category can be:

    DETECTION_UNITS:CreateDetectionItems()

    Create the DetectedItems list from the DetectedObjects table.

    + + + + DETECTION_UNITS:DetectedItemMenu(Index) + +

    Menu of a DetectedItem using a given numeric index.

    @@ -1476,6 +1548,32 @@ self

    #DETECTION_AREAS: self

    +
    +
    +
    +
    + + +DETECTION_AREAS:DetectedItemMenu(Index) + +
    +
    + +

    Menu of a detected item using a given numeric index.

    + +

    Parameter

    +
      +
    • + +

      Index :

      + +
    • +
    +

    Return value

    + +

    #string:

    + +
    @@ -1516,6 +1614,24 @@ self

    A list of areas containing the set of Units, Zones, the center Unit within the zone, and ID of each area that was detected within a DetectionZoneRange.

    + +
    +
    +
    + + +DETECTION_AREAS:DetectedReportDetailed() + +
    +
    + +

    Report detailed of a detection result.

    + +

    Return value

    + +

    #string:

    + +
    @@ -1944,7 +2060,7 @@ self

    -DETECTION_BASE:AddDetectedItem(DetectedItemIndex, Set) +DETECTION_BASE:AddDetectedItem(ItemPrefix, DetectedItemIndex, Set)
    @@ -1958,6 +2074,11 @@ self

    • +

      ItemPrefix :

      + +
    • +
    • +

      #string DetectedItemIndex : The index of the DetectedItem.

      @@ -2223,6 +2344,32 @@ The index of the DetectedItem.

      +
    +
    +
    +
    + + +DETECTION_BASE:DetectedItemMenu(Index) + +
    +
    + +

    Menu of a detected item using a given numeric index.

    + +

    Parameter

    +
      +
    • + +

      Index :

      + +
    • +
    +

    Return value

    + +

    #string:

    + +
    @@ -2468,6 +2615,32 @@ self

    + +DETECTION_BASE:GetDetectedID(Index) + +
    +
    + +

    Get a detected ID using a given numeric index.

    + +

    Parameter

    +
      +
    • + +

      #number Index :

      + +
    • +
    +

    Return value

    + +

    #string: +DetectedItemID

    + +
    +
    +
    +
    + DETECTION_BASE:GetDetectedItem(Index) @@ -2489,6 +2662,32 @@ self

    #DETECTION_BASE.DetectedItem:

    + +
    +
    +
    + + +DETECTION_BASE:GetDetectedItemID(Index) + +
    +
    + +

    Get a detected ItemID using a given numeric index.

    + +

    Parameter

    +
      +
    • + +

      #number Index :

      + +
    • +
    +

    Return value

    + +

    #string: +DetectedItemID

    +
    @@ -4061,6 +4260,90 @@ The To State string.

    + +
    +
    +
    + + #boolean + +DETECTION_BASE.DetectedObject.IsVisible + +
    +
    + + + +
    +
    +
    +
    + + #boolean + +DETECTION_BASE.DetectedObject.KnowDistance + +
    +
    + + + +
    +
    +
    +
    + + #boolean + +DETECTION_BASE.DetectedObject.KnowType + +
    +
    + + + +
    +
    +
    +
    + + #boolean + +DETECTION_BASE.DetectedObject.LastPos + +
    +
    + + + +
    +
    +
    +
    + + #number + +DETECTION_BASE.DetectedObject.LastTime + +
    +
    + + + +
    +
    +
    +
    + + #number + +DETECTION_BASE.DetectedObject.LastVelocity + +
    +
    + + +
    @@ -4089,20 +4372,6 @@ The To State string.

    - -
    -
    -
    - - #boolean - -DETECTION_BASE.DetectedObject.Visible - -
    -
    - - -
    @@ -4154,6 +4423,37 @@ Beware that when the amount of different types detected is large, the DetectedIt

    #DETECTION_TYPES: self

    + +
    +
    +
    + + +DETECTION_TYPES:DetectedItemMenu(Index, DetectedTypeName) + +
    +
    + +

    Menu of a DetectedItem using a given numeric index.

    + +

    Parameters

    +
      +
    • + +

      Index :

      + +
    • +
    • + +

      DetectedTypeName :

      + +
    • +
    +

    Return value

    + +

    #string:

    + +
    @@ -4389,6 +4689,32 @@ Beware that when the amount of units detected is large, the DetectedItems list w

    #DETECTION_UNITS: self

    + +
    +
    +
    + + +DETECTION_UNITS:DetectedItemMenu(Index) + +
    +
    + +

    Menu of a DetectedItem using a given numeric index.

    + +

    Parameter

    +
      +
    • + +

      Index :

      + +
    • +
    +

    Return value

    + +

    #string:

    + +
    diff --git a/docs/Documentation/Fsm.html b/docs/Documentation/Fsm.html index 425da196e..eb52982ac 100644 --- a/docs/Documentation/Fsm.html +++ b/docs/Documentation/Fsm.html @@ -1622,7 +1622,7 @@ A string defining the start state.

    - #string + FSM._StartState @@ -1921,6 +1921,7 @@ A string defining the start state.

    + FSM.current diff --git a/docs/Documentation/Mission.html b/docs/Documentation/Mission.html index 5cf8ca5d8..96f09fc56 100644 --- a/docs/Documentation/Mission.html +++ b/docs/Documentation/Mission.html @@ -167,7 +167,7 @@ A CLIENT needs to be registered within the MISSION:GetMenu(TaskGroup) + MISSION:GetMenu()

    Gets the mission menu for the coalition.

    @@ -200,6 +200,12 @@ A CLIENT needs to be registered within the MISSION:GetTasks()

    Get all the TASKs from the Mission.

    + + + + MISSION:GetTasksRemaining() + + @@ -209,39 +215,51 @@ A CLIENT needs to be registered within the MISSION:IsCompleted() + MISSION:IsCOMPLETED() -

    Is the Mission Completed.

    +

    Is the Mission COMPLETED.

    - MISSION:IsFailed() + MISSION:IsENGAGED() -

    Is the Mission Failed.

    +

    Is the Mission ENGAGED.

    - MISSION:IsHold() + MISSION:IsFAILED() -

    Is the Mission Hold.

    +

    Is the Mission FAILED.

    - MISSION:IsIdle() + MISSION:IsHOLD() -

    Is the Mission Idle.

    +

    Is the Mission HOLD.

    - MISSION:IsOngoing() + MISSION:IsIDLE() -

    Is the Mission Ongoing.

    +

    Is the Mission IDLE.

    MISSION:JoinUnit(PlayerUnit, PlayerGroup)

    Add a Unit to join the Mission.

    + + + + MISSION:MenuReportOverview(TaskStatus, ReportGroup) + + + + + + MISSION:MenuReportSummary(ReportGroup) + + @@ -323,51 +341,51 @@ A CLIENT needs to be registered within the MISSION:OnEnterCompleted(From, Event, To) + MISSION:OnEnterCOMPLETED(From, Event, To) -

    OnEnter Transition Handler for State Completed.

    +

    OnEnter Transition Handler for State COMPLETED.

    - MISSION:OnEnterFailed(From, Event, To) + MISSION:OnEnterENGAGED(From, Event, To) -

    OnEnter Transition Handler for State Failed.

    +

    OnEnter Transition Handler for State ENGAGED.

    - MISSION:OnEnterIdle(From, Event, To) + MISSION:OnEnterFAILED(From, Event, To) -

    OnEnter Transition Handler for State Idle.

    +

    OnEnter Transition Handler for State FAILED.

    - MISSION:OnEnterOngoing(From, Event, To) + MISSION:OnEnterIDLE(From, Event, To) -

    OnEnter Transition Handler for State Ongoing.

    +

    OnEnter Transition Handler for State IDLE.

    - MISSION:OnLeaveCompleted(From, Event, To) + MISSION:OnLeaveCOMPLETED(From, Event, To) -

    OnLeave Transition Handler for State Completed.

    +

    OnLeave Transition Handler for State COMPLETED.

    - MISSION:OnLeaveFailed(From, Event, To) + MISSION:OnLeaveENGAGED(From, Event, To) -

    OnLeave Transition Handler for State Failed.

    +

    OnLeave Transition Handler for State ENGAGED.

    - MISSION:OnLeaveIdle(From, Event, To) + MISSION:OnLeaveFAILED(From, Event, To) -

    OnLeave Transition Handler for State Idle.

    +

    OnLeave Transition Handler for State FAILED.

    - MISSION:OnLeaveOngoing(From, Event, To) + MISSION:OnLeaveIDLE(From, Event, To) -

    OnLeave Transition Handler for State Ongoing.

    +

    OnLeave Transition Handler for State IDLE.

    @@ -395,7 +413,7 @@ A CLIENT needs to be registered within the MISSION:ReportOverview() + MISSION:ReportOverview(TaskStatus)

    Create a overview report of the Mission (multiple lines).

    @@ -467,7 +485,7 @@ A CLIENT needs to be registered within the MISSION:onenterCompleted(From, Event, To) + MISSION:onenterCOMPLETED(From, Event, To) @@ -697,21 +715,13 @@ true if Unit is part of a Task in the Mission.

    -MISSION:GetMenu(TaskGroup) +MISSION:GetMenu()

    Gets the mission menu for the coalition.

    -

    Parameter

    -

    Return value

    Core.Menu#MENU_COALITION: @@ -851,6 +861,24 @@ Returns nil if no task was found.

    Tasks = Mission:GetTasks() env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) +
    +
    +
    +
    + + +MISSION:GetTasksRemaining() + +
    +
    + + + +

    Return value

    + +

    #number:

    + +
    @@ -893,13 +921,13 @@ true if the Mission has a Group.

    - -MISSION:IsCompleted() + +MISSION:IsCOMPLETED()
    -

    Is the Mission Completed.

    +

    Is the Mission COMPLETED.

    Return value

    @@ -911,13 +939,13 @@ true if the Mission has a Group.

    - -MISSION:IsFailed() + +MISSION:IsENGAGED()
    -

    Is the Mission Failed.

    +

    Is the Mission ENGAGED.

    Return value

    @@ -929,13 +957,13 @@ true if the Mission has a Group.

    - -MISSION:IsHold() + +MISSION:IsFAILED()
    -

    Is the Mission Hold.

    +

    Is the Mission FAILED.

    Return value

    @@ -947,13 +975,13 @@ true if the Mission has a Group.

    - -MISSION:IsIdle() + +MISSION:IsHOLD()
    -

    Is the Mission Idle.

    +

    Is the Mission HOLD.

    Return value

    @@ -965,13 +993,13 @@ true if the Mission has a Group.

    - -MISSION:IsOngoing() + +MISSION:IsIDLE()
    -

    Is the Mission Ongoing.

    +

    Is the Mission IDLE.

    Return value

    @@ -1016,6 +1044,54 @@ The GROUP of the player joining the Mission.

    #boolean: true if Unit is part of a Task in the Mission.

    +
    +
    +
    +
    + + +MISSION:MenuReportOverview(TaskStatus, ReportGroup) + +
    +
    + + + +

    Parameters

    + +
    +
    +
    +
    + + +MISSION:MenuReportSummary(ReportGroup) + +
    +
    + + + +

    Parameter

    +
    @@ -1422,13 +1498,13 @@ Return false to cancel Transition.

    - -MISSION:OnEnterCompleted(From, Event, To) + +MISSION:OnEnterCOMPLETED(From, Event, To)
    -

    OnEnter Transition Handler for State Completed.

    +

    OnEnter Transition Handler for State COMPLETED.

    Parameters

      @@ -1456,13 +1532,13 @@ The To State string.

      - -MISSION:OnEnterFailed(From, Event, To) + +MISSION:OnEnterENGAGED(From, Event, To)
      -

      OnEnter Transition Handler for State Failed.

      +

      OnEnter Transition Handler for State ENGAGED.

      Parameters

        @@ -1490,13 +1566,13 @@ The To State string.

        - -MISSION:OnEnterIdle(From, Event, To) + +MISSION:OnEnterFAILED(From, Event, To)
        -

        OnEnter Transition Handler for State Idle.

        +

        OnEnter Transition Handler for State FAILED.

        Parameters

        diff --git a/docs/Documentation/Spot.html b/docs/Documentation/Spot.html index 8e9ea64bc..a6b4cf466 100644 --- a/docs/Documentation/Spot.html +++ b/docs/Documentation/Spot.html @@ -761,6 +761,7 @@ true if it is lasing

        + SPOT.ScheduleID @@ -774,6 +775,7 @@ true if it is lasing

        + SPOT.SpotIR @@ -787,6 +789,7 @@ true if it is lasing

        + SPOT.SpotLaser @@ -800,6 +803,7 @@ true if it is lasing

        + SPOT.Target From a06c6176a27aba62126f91270f78f61ea8eece17 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 4 May 2017 06:33:40 +0200 Subject: [PATCH 11/39] Attempt to fix the count problem --- Moose Development/Moose/Functional/Detection.lua | 16 +++++++++------- Moose Development/Moose/Tasking/Mission.lua | 1 + 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Moose Development/Moose/Functional/Detection.lua b/Moose Development/Moose/Functional/Detection.lua index 82819ae37..d302fe481 100644 --- a/Moose Development/Moose/Functional/Detection.lua +++ b/Moose Development/Moose/Functional/Detection.lua @@ -190,7 +190,7 @@ do -- DETECTION_BASE -- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. -- -- -- Build a detect object. - -- local Detection = DETECTION_BASE:New( SetGroup ) + -- local Detection = DETECTION_UNITS:New( SetGroup ) -- -- -- This will accept detected units if the range is below 5000 meters. -- Detection:SetAcceptRange( 5000 ) @@ -211,7 +211,7 @@ do -- DETECTION_BASE -- local ZoneAccept2 = ZONE:New( "AcceptZone2" ) -- -- -- Build a detect object. - -- local Detection = DETECTION_BASE:New( SetGroup ) + -- local Detection = DETECTION_UNITS:New( SetGroup ) -- -- -- This will accept detected units by Detection when the unit is within ZoneAccept1 OR ZoneAccept2. -- Detection:SetAcceptZones( { ZoneAccept1, ZoneAccept2 } ) @@ -232,7 +232,7 @@ do -- DETECTION_BASE -- local ZoneReject2 = ZONE:New( "RejectZone2" ) -- -- -- Build a detect object. - -- local Detection = DETECTION_BASE:New( SetGroup ) + -- local Detection = DETECTION_UNITS:New( SetGroup ) -- -- -- This will reject detected units by Detection when the unit is within ZoneReject1 OR ZoneReject2. -- Detection:SetRejectZones( { ZoneReject1, ZoneReject2 } ) @@ -728,7 +728,7 @@ do -- DETECTION_BASE local DetectedSet = DetectedItem.Set if DetectedSet:Count() == 0 then - self.DetectedItems[DetectedItemID] = nil + self:RemoveDetectedItem(DetectedItemID) end end @@ -1221,8 +1221,10 @@ do -- DETECTION_BASE -- @param #number DetectedItemIndex The index or position in the DetectedItems list where the item needs to be removed. function DETECTION_BASE:RemoveDetectedItem( DetectedItemIndex ) - self.DetectedItemCount = self.DetectedItemCount - 1 - self.DetectedItems[DetectedItemIndex] = nil + if self.DetectedItems[DetectedItemIndex] then + self.DetectedItemCount = self.DetectedItemCount - 1 + self.DetectedItems[DetectedItemIndex] = nil + end end @@ -1236,7 +1238,7 @@ do -- DETECTION_BASE --- Get the amount of SETs with detected objects. -- @param #DETECTION_BASE self - -- @return #number Count + -- @return #number The amount of detected items. Note that the amount of detected items can differ with the reality, because detections are not real-time but doen in intervals! function DETECTION_BASE:GetDetectedItemsCount() local DetectedCount = self.DetectedItemCount diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index f0bfb9c52..dfc45aaab 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -295,6 +295,7 @@ function MISSION:AbortUnit( PlayerUnit ) local PlayerUnitRemoved = false for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK if Task:AbortUnit( PlayerUnit ) then PlayerUnitRemoved = true end From 0eb9d1917b410a0f9a8b403934093a3f835c4fd6 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 4 May 2017 10:19:34 +0200 Subject: [PATCH 12/39] Updates --- Moose Development/Moose/Core/Database.lua | 12 ++++++------ Moose Development/Moose/Core/Menu.lua | 8 ++++---- Moose Development/Moose/Tasking/DetectionManager.lua | 1 + Moose Development/Moose/Tasking/Mission.lua | 2 +- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/Moose Development/Moose/Core/Database.lua b/Moose Development/Moose/Core/Database.lua index 2ce9d7928..e3da3142d 100644 --- a/Moose Development/Moose/Core/Database.lua +++ b/Moose Development/Moose/Core/Database.lua @@ -112,7 +112,7 @@ function DATABASE:New() self.UNITS_Position = 0 - --- @param Wrapper.Unit#UNIT PlayerUnit + --- @param #DATABASE self local function CheckPlayers( self ) local UNITS_Count = #self.UNITS_Index @@ -122,12 +122,12 @@ function DATABASE:New() if PlayerUnit then local UnitName = PlayerUnit:GetName() local PlayerName = PlayerUnit:GetPlayerName() - self:E( { UNITS_Count, self.UNITS_Position, UnitName, PlayerName } ) + --self:E( { UNITS_Count, self.UNITS_Position, UnitName, PlayerName } ) if PlayerName and PlayerName ~= "" then - if not self.PLAYERS[PlayerName] or self.PLAYERS[PlayerName] ~= PlayerUnit then + if self.PLAYERS[PlayerName] == nil or self.PLAYERS[PlayerName] ~= UnitName then self:E( { "Add player for unit:", UnitName, PlayerName } ) self:AddPlayer( UnitName, PlayerName ) - _EVENTDISPATCHER:CreateEventPlayerEnterUnit( PlayerUnit ) + --_EVENTDISPATCHER:CreateEventPlayerEnterUnit( PlayerUnit ) end end end @@ -135,7 +135,7 @@ function DATABASE:New() end self:E( "Scheduling" ) - local PlayerCheckSchedule = SCHEDULER:New( nil, CheckPlayers, { self }, 2, 0.05 ) + local PlayerCheckSchedule = SCHEDULER:New( nil, CheckPlayers, { self }, 2, 0.1 ) return self end @@ -311,7 +311,7 @@ function DATABASE:AddPlayer( UnitName, PlayerName ) if PlayerName then self:E( { "Add player for unit:", UnitName, PlayerName } ) - self.PLAYERS[PlayerName] = self:FindUnit( UnitName ) + self.PLAYERS[PlayerName] = UnitName self.PLAYERSJOINED[PlayerName] = PlayerName end end diff --git a/Moose Development/Moose/Core/Menu.lua b/Moose Development/Moose/Core/Menu.lua index 7a6049091..2188db052 100644 --- a/Moose Development/Moose/Core/Menu.lua +++ b/Moose Development/Moose/Core/Menu.lua @@ -780,9 +780,9 @@ do self = MenuGroup._Menus[Path] else self = BASE:Inherit( self, MENU_BASE:New( MenuText, ParentMenu ) ) - if MenuGroup:IsAlive() then + --if MenuGroup:IsAlive() then MenuGroup._Menus[Path] = self - end + --end self.MenuGroup = MenuGroup self.Path = Path @@ -886,9 +886,9 @@ do else self = BASE:Inherit( self, MENU_COMMAND_BASE:New( MenuText, ParentMenu, CommandMenuFunction, arg ) ) - if MenuGroup:IsAlive() then + --if MenuGroup:IsAlive() then MenuGroup._Menus[Path] = self - end + --end self.Path = Path self.MenuGroup = MenuGroup diff --git a/Moose Development/Moose/Tasking/DetectionManager.lua b/Moose Development/Moose/Tasking/DetectionManager.lua index 7601701a0..7283d50d9 100644 --- a/Moose Development/Moose/Tasking/DetectionManager.lua +++ b/Moose Development/Moose/Tasking/DetectionManager.lua @@ -76,6 +76,7 @@ do -- DETECTION MANAGER self:SetReportInterval( 30 ) self:SetReportDisplayTime( 25 ) + self:E( { Detection = Detection } ) Detection:__Start( 1 ) return self diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index dfc45aaab..00451544a 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -549,7 +549,7 @@ function MISSION:GetTasksRemaining() local TasksRemaining = 0 for TaskID, Task in pairs( self:GetTasks() ) do local Task = Task -- Tasking.Task#TASK - if Task:IsStateSuccess() or Task:IsStateFAILED() then + if Task:IsStateSuccess() or Task:IsStateFailed() then else TasksRemaining = TasksRemaining + 1 end From 559e668ff99cdd81936eb88197722545a1380f70 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 4 May 2017 12:22:05 +0200 Subject: [PATCH 13/39] Updates --- docs/Documentation/Cargo.html | 1 + docs/Documentation/Designate.html | 1 + docs/Documentation/Detection.html | 10 +++++----- docs/Documentation/Point.html | 1 - docs/Documentation/Spawn.html | 12 +++--------- docs/Documentation/Spot.html | 4 ---- 6 files changed, 10 insertions(+), 19 deletions(-) diff --git a/docs/Documentation/Cargo.html b/docs/Documentation/Cargo.html index e2bcae7e2..a9b110ac2 100644 --- a/docs/Documentation/Cargo.html +++ b/docs/Documentation/Cargo.html @@ -2847,6 +2847,7 @@ The range till cargo will board.

        + CARGO_UNIT.CargoCarrier diff --git a/docs/Documentation/Designate.html b/docs/Documentation/Designate.html index 78397dfe5..0b38068a2 100644 --- a/docs/Documentation/Designate.html +++ b/docs/Documentation/Designate.html @@ -890,6 +890,7 @@ function below will use the range 1-7 just in case

        + DESIGNATE.LaserCodes diff --git a/docs/Documentation/Detection.html b/docs/Documentation/Detection.html index 8690dec55..4514b29c5 100644 --- a/docs/Documentation/Detection.html +++ b/docs/Documentation/Detection.html @@ -1330,7 +1330,7 @@ Use the method Detecti
         local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers.
         
          -- Build a detect object.
        - local Detection = DETECTION_BASE:New( SetGroup )
        + local Detection = DETECTION_UNITS:New( SetGroup )
         
          -- This will accept detected units if the range is below 5000 meters.
          Detection:SetAcceptRange( 5000 ) 
        @@ -1352,7 +1352,7 @@ Use the method Detecti
          local ZoneAccept2 = ZONE:New( "AcceptZone2" )
         
          -- Build a detect object.
        - local Detection = DETECTION_BASE:New( SetGroup )
        + local Detection = DETECTION_UNITS:New( SetGroup )
         
          -- This will accept detected units by Detection when the unit is within ZoneAccept1 OR ZoneAccept2.
          Detection:SetAcceptZones( { ZoneAccept1, ZoneAccept2 } ) 
        @@ -1374,7 +1374,7 @@ An example of how to use the method is shown below.

        local ZoneReject2 = ZONE:New( "RejectZone2" ) -- Build a detect object. - local Detection = DETECTION_BASE:New( SetGroup ) + local Detection = DETECTION_UNITS:New( SetGroup ) -- This will reject detected units by Detection when the unit is within ZoneReject1 OR ZoneReject2. Detection:SetRejectZones( { ZoneReject1, ZoneReject2 } ) @@ -2476,7 +2476,7 @@ The index of the DetectedItem.

        - #number + DETECTION_BASE.DetectionInterval @@ -2723,7 +2723,7 @@ DetectedItemID

        Return value

        #number: -Count

        +The amount of detected items. Note that the amount of detected items can differ with the reality, because detections are not real-time but doen in intervals!

      diff --git a/docs/Documentation/Point.html b/docs/Documentation/Point.html index 956b406bb..c2551b2fa 100644 --- a/docs/Documentation/Point.html +++ b/docs/Documentation/Point.html @@ -1971,7 +1971,6 @@ The new calculated POINT_VEC2.

      - POINT_VEC2.z diff --git a/docs/Documentation/Spawn.html b/docs/Documentation/Spawn.html index c91670101..05374facf 100644 --- a/docs/Documentation/Spawn.html +++ b/docs/Documentation/Spawn.html @@ -2527,9 +2527,6 @@ when nothing was spawned.

      - -

      Overwrite unit names by default with group name.

      -
    @@ -2544,9 +2541,6 @@ when nothing was spawned.

    - -

    By default, no InitLimit

    -
    @@ -2582,7 +2576,7 @@ when nothing was spawned.

    - #number + SPAWN.SpawnMaxGroups @@ -2599,7 +2593,7 @@ when nothing was spawned.

    - #number + SPAWN.SpawnMaxUnitsAlive @@ -2927,7 +2921,7 @@ Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 )
    - + #boolean SPAWN.SpawnUnControlled diff --git a/docs/Documentation/Spot.html b/docs/Documentation/Spot.html index a6b4cf466..8e9ea64bc 100644 --- a/docs/Documentation/Spot.html +++ b/docs/Documentation/Spot.html @@ -761,7 +761,6 @@ true if it is lasing

    - SPOT.ScheduleID @@ -775,7 +774,6 @@ true if it is lasing

    - SPOT.SpotIR @@ -789,7 +787,6 @@ true if it is lasing

    - SPOT.SpotLaser @@ -803,7 +800,6 @@ true if it is lasing

    - SPOT.Target From 2519fcde48acc09bd6337caba328e7bfba805865 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 4 May 2017 12:25:50 +0200 Subject: [PATCH 14/39] No loop logic --- Moose Development/Moose/Core/Database.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Moose Development/Moose/Core/Database.lua b/Moose Development/Moose/Core/Database.lua index e3da3142d..c9f7ed174 100644 --- a/Moose Development/Moose/Core/Database.lua +++ b/Moose Development/Moose/Core/Database.lua @@ -135,7 +135,7 @@ function DATABASE:New() end self:E( "Scheduling" ) - local PlayerCheckSchedule = SCHEDULER:New( nil, CheckPlayers, { self }, 2, 0.1 ) + --local PlayerCheckSchedule = SCHEDULER:New( nil, CheckPlayers, { self }, 2, 0.1 ) return self end From b4107b14f8629e56b38bf5164cfb6c4db8bab87c Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 4 May 2017 13:33:13 +0200 Subject: [PATCH 15/39] Eliminate trace details --- Moose Development/Moose/Core/Menu.lua | 4 ++-- Moose Development/Moose/Core/Zone.lua | 4 ++-- Moose Development/Moose/Functional/Detection.lua | 6 +++--- Moose Development/Moose/Wrapper/Unit.lua | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Moose Development/Moose/Core/Menu.lua b/Moose Development/Moose/Core/Menu.lua index 2188db052..1b15cbe06 100644 --- a/Moose Development/Moose/Core/Menu.lua +++ b/Moose Development/Moose/Core/Menu.lua @@ -839,7 +839,7 @@ do self.ParentMenu.MenuCount = self.ParentMenu.MenuCount - 1 if self.ParentMenu.MenuCount == 0 then if self.MenuRemoveParent == true then - self:T( "Removing Parent Menu " ) + self:T2( "Removing Parent Menu " ) self.ParentMenu:Remove() end end @@ -927,7 +927,7 @@ do self.ParentMenu.MenuCount = self.ParentMenu.MenuCount - 1 if self.ParentMenu.MenuCount == 0 then if self.MenuRemoveParent == true then - self:T( "Removing Parent Menu " ) + self:T2( "Removing Parent Menu " ) self.ParentMenu:Remove() end end diff --git a/Moose Development/Moose/Core/Zone.lua b/Moose Development/Moose/Core/Zone.lua index 998bd07fa..5f41cf733 100644 --- a/Moose Development/Moose/Core/Zone.lua +++ b/Moose Development/Moose/Core/Zone.lua @@ -731,7 +731,7 @@ end -- @param #ZONE_UNIT self -- @return Dcs.DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. function ZONE_UNIT:GetVec2() - self:F( self.ZoneName ) + self:F2( self.ZoneName ) local ZoneVec2 = self.ZoneUNIT:GetVec2() if ZoneVec2 then @@ -741,7 +741,7 @@ function ZONE_UNIT:GetVec2() return self.LastVec2 end - self:T( { ZoneVec2 } ) + self:T2( { ZoneVec2 } ) return nil end diff --git a/Moose Development/Moose/Functional/Detection.lua b/Moose Development/Moose/Functional/Detection.lua index d302fe481..f6eb2dc97 100644 --- a/Moose Development/Moose/Functional/Detection.lua +++ b/Moose Development/Moose/Functional/Detection.lua @@ -567,7 +567,7 @@ do -- DETECTION_BASE self.DetectDLINK ) - self:T( { TargetIsDetected = TargetIsDetected, TargetIsVisible = TargetIsVisible, TargetLastTime = TargetLastTime, TargetKnowType = TargetKnowType, TargetKnowDistance = TargetKnowDistance, TargetLastPos = TargetLastPos, TargetLastVelocity = TargetLastVelocity } ) + self:T2( { TargetIsDetected = TargetIsDetected, TargetIsVisible = TargetIsVisible, TargetLastTime = TargetLastTime, TargetKnowType = TargetKnowType, TargetKnowDistance = TargetKnowDistance, TargetLastPos = TargetLastPos, TargetLastVelocity = TargetLastVelocity } ) local DetectionAccepted = true @@ -585,7 +585,7 @@ do -- DETECTION_BASE local DetectedUnitCategory = DetectedObject:getDesc().category - self:T( { "Detected Target:", DetectionGroupName, DetectedObjectName, Distance, DetectedUnitCategory } ) + self:T2( { "Detected Target:", DetectionGroupName, DetectedObjectName, Distance, DetectedUnitCategory } ) -- Calculate Acceptance @@ -1154,7 +1154,7 @@ do -- DETECTION_BASE -- @param #string ObjectName -- @return #DETECTION_BASE.DetectedObject function DETECTION_BASE:GetDetectedObject( ObjectName ) - self:F( ObjectName ) + self:F2( ObjectName ) if ObjectName then local DetectedObject = self.DetectedObjects[ObjectName] diff --git a/Moose Development/Moose/Wrapper/Unit.lua b/Moose Development/Moose/Wrapper/Unit.lua index 0107839b5..c99c2a7a4 100644 --- a/Moose Development/Moose/Wrapper/Unit.lua +++ b/Moose Development/Moose/Wrapper/Unit.lua @@ -724,7 +724,7 @@ function UNIT:IsInZone( Zone ) if self:IsAlive() then local IsInZone = Zone:IsVec3InZone( self:GetVec3() ) - self:T( { IsInZone } ) + self:T2( { IsInZone } ) return IsInZone end From a499c04fa4513e5c16c2653af74b6659329839a5 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 4 May 2017 14:05:57 +0200 Subject: [PATCH 16/39] Fix crash --- Moose Development/Moose/Core/Fsm.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Moose Development/Moose/Core/Fsm.lua b/Moose Development/Moose/Core/Fsm.lua index 8af98362f..d2333ffdc 100644 --- a/Moose Development/Moose/Core/Fsm.lua +++ b/Moose Development/Moose/Core/Fsm.lua @@ -1014,6 +1014,8 @@ do -- FSM_PROCESS Process.fsm:Remove() Process.fsm = nil end + + self._Processes = nil return self end From 5bb91646d78bc05985acbc7c41a57d0699e863b8 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 4 May 2017 14:23:10 +0200 Subject: [PATCH 17/39] Updates --- Moose Development/Moose/Core/Menu.lua | 4 ++-- Moose Development/Moose/Tasking/Task.lua | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Moose Development/Moose/Core/Menu.lua b/Moose Development/Moose/Core/Menu.lua index 1b15cbe06..c38f763d4 100644 --- a/Moose Development/Moose/Core/Menu.lua +++ b/Moose Development/Moose/Core/Menu.lua @@ -91,7 +91,7 @@ do -- MENU_BASE -- @param #boolean RemoveParent If true, the parent menu is automatically removed when this menu is the last child menu of that parent @{Menu}. -- @return #MENU_BASE function MENU_BASE:SetRemoveParent( RemoveParent ) - self:F( { RemoveParent } ) + self:F2( { RemoveParent } ) self.MenuRemoveParent = RemoveParent return self end @@ -902,7 +902,7 @@ do if self.ParentMenu and self.ParentMenu.Menus then self.ParentMenu.Menus[MenuText] = self self.ParentMenu.MenuCount = self.ParentMenu.MenuCount + 1 - self:F( { ParentMenu.Menus, MenuText } ) + self:F2( { ParentMenu.Menus, MenuText } ) end end diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 70d97867d..78fea4073 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -724,7 +724,12 @@ end -- @param #TASK self function TASK:MenuTaskAbort( TaskGroup ) - self:Abort() + for PlayerUnitName, PlayerUnit in pairs( TaskGroup:GetUnits() ) do + self:AbortUnit( PlayerUnit ) + end + + self:GetMission():GetCommandCenter():GetPositionable():MessageToSetGroup( "Abort", 15, self.SetGroup ) + end From 4130b833fbf67a8b987cb37c61d57ff7287c96fd Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 4 May 2017 15:36:37 +0200 Subject: [PATCH 18/39] Turn off default menu --- Moose Development/Moose/Moose.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Moose Development/Moose/Moose.lua b/Moose Development/Moose/Moose.lua index 4c87af909..46fdaa17c 100644 --- a/Moose Development/Moose/Moose.lua +++ b/Moose Development/Moose/Moose.lua @@ -9,4 +9,4 @@ _SCHEDULEDISPATCHER = SCHEDULEDISPATCHER:New() -- Core.Timer#SCHEDULEDISPATCHER --- Declare the main database object, which is used internally by the MOOSE classes. _DATABASE = DATABASE:New() -- Database#DATABASE -COORDINATE:CoordinateMenu() +--COORDINATE:CoordinateMenu() From e3a0a67fa595842d46d12fbbb325e39e07d63cbb Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 4 May 2017 15:53:25 +0200 Subject: [PATCH 19/39] Update Task Abort process --- Moose Development/Moose/Tasking/Task.lua | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 78fea4073..4f66198bf 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -277,14 +277,9 @@ function TASK:AbortUnit( PlayerUnit ) self:E( { IsAssignedToGroup = IsAssignedToGroup } ) if IsAssignedToGroup then local PlayerName = PlayerUnit:GetPlayerName() - self:UnAssignFromUnit( PlayerUnit ) self:MessageToGroups( PlayerName .. " aborted Task " .. self:GetName() ) - self:E( { TaskGroup = PlayerGroup:GetName(), GetUnits = PlayerGroup:GetUnits() } ) - if #PlayerGroup:GetUnits() == 1 then - self:UnAssignFromGroup( PlayerGroup ) - PlayerGroup:SetState( PlayerGroup, "Assigned", nil ) - end - self:Abort() + self:UnAssignFromGroup( PlayerGroup ) + --self:Abort() self:PlayerAborted( PlayerUnit ) end end From 16e6730dc1a808bce64ee13d7a11884ab161bd72 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 4 May 2017 16:19:04 +0200 Subject: [PATCH 20/39] Trace --- Moose Development/Moose/Core/Set.lua | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Moose Development/Moose/Core/Set.lua b/Moose Development/Moose/Core/Set.lua index 196982ffb..aaa06e3a8 100644 --- a/Moose Development/Moose/Core/Set.lua +++ b/Moose Development/Moose/Core/Set.lua @@ -165,11 +165,10 @@ end -- @param #SET_BASE self -- @param #string ObjectName function SET_BASE:Remove( ObjectName ) - self:F( ObjectName ) local t = self.Set[ObjectName] - self:E( { ObjectName, t } ) + self:F3( { ObjectName, t } ) if t then if t._next then @@ -1568,7 +1567,7 @@ end -- @return #string The name of the UNIT -- @return #table The UNIT function SET_UNIT:FindInDatabase( Event ) - self:E( { Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName], Event } ) + self:F2( { Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName], Event } ) return Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName] From 7a84b6cc355108c4e274152aad9e5e34a5135e26 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 09:34:51 +0200 Subject: [PATCH 21/39] Improvements on task assignment logic --- Moose Development/Moose/Core/Fsm.lua | 2 +- Moose Development/Moose/Tasking/Task.lua | 266 +++++++++++------- .../Moose/Tasking/Task_A2G_Dispatcher.lua | 4 +- 3 files changed, 171 insertions(+), 101 deletions(-) diff --git a/Moose Development/Moose/Core/Fsm.lua b/Moose Development/Moose/Core/Fsm.lua index d2333ffdc..db7a0b40a 100644 --- a/Moose Development/Moose/Core/Fsm.lua +++ b/Moose Development/Moose/Core/Fsm.lua @@ -1121,7 +1121,7 @@ end self:T( { ProcessUnit, From, Event, To, Dummy, self:IsTrace() } ) if self:IsTrace() then - MESSAGE:New( "@ Process " .. self:GetClassNameAndID() .. " : " .. Event .. " changed to state " .. To, 2 ):ToAll() + --MESSAGE:New( "@ Process " .. self:GetClassNameAndID() .. " : " .. Event .. " changed to state " .. To, 2 ):ToAll() end self:T( { Scores = self._Scores, To = To } ) diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 4f66198bf..07fa7ee00 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -78,6 +78,7 @@ TASK = { Mission = nil, CommandCenter = nil, TimeOut = 0, + AssignedGroups = {}, } --- FSM PlayerAborted event handler prototype for TASK. @@ -164,6 +165,7 @@ function TASK:New( Mission, SetGroupAssign, TaskName, TaskType ) self:AddTransition( "Planned", "Assign", "Assigned" ) self:AddTransition( "Assigned", "AssignUnit", "Assigned" ) self:AddTransition( "Assigned", "Success", "Success" ) + self:AddTransition( "Assigned", "Hold", "Hold" ) self:AddTransition( "Assigned", "Fail", "Failed" ) self:AddTransition( "Assigned", "Abort", "Aborted" ) self:AddTransition( "Assigned", "Cancel", "Cancelled" ) @@ -241,9 +243,9 @@ function TASK:JoinUnit( PlayerUnit, PlayerGroup ) --self:MessageToGroups( PlayerUnit:GetPlayerName() .. " is planning to join Task " .. self:GetName() ) end if self:IsStateAssigned() then - local IsAssignedToGroup = self:IsAssignedToGroup( PlayerGroup ) - self:E( { IsAssignedToGroup = IsAssignedToGroup } ) - if IsAssignedToGroup then + local IsGroupAssigned = self:IsGroupAssigned( PlayerGroup ) + self:E( { IsGroupAssigned = IsGroupAssigned } ) + if IsGroupAssigned then self:AssignToUnit( PlayerUnit ) self:MessageToGroups( PlayerUnit:GetPlayerName() .. " joined Task " .. self:GetName() ) end @@ -273,15 +275,29 @@ function TASK:AbortUnit( PlayerUnit ) -- Check if the PlayerGroup is already assigned to the Task. If yes, the PlayerGroup is aborted from the Task. -- If the PlayerUnit was the last unit of the PlayerGroup, the menu needs to be removed from the Group. if self:IsStateAssigned() then - local IsAssignedToGroup = self:IsAssignedToGroup( PlayerGroup ) - self:E( { IsAssignedToGroup = IsAssignedToGroup } ) - if IsAssignedToGroup then + local IsGroupAssigned = self:IsGroupAssigned( PlayerGroup ) + self:E( { IsGroupAssigned = IsGroupAssigned } ) + if IsGroupAssigned then local PlayerName = PlayerUnit:GetPlayerName() self:MessageToGroups( PlayerName .. " aborted Task " .. self:GetName() ) self:UnAssignFromGroup( PlayerGroup ) --self:Abort() + + -- Now check if the task needs to go to hold... + -- It will go to hold, if there are no players in the mission... + + local IsRemaining = false + for GroupName, GroupData in pairs( PlayerGroups ) do + IsRemaining = ( IsRemaining == false ) and self:IsGroupAssigned( PlayerGroup ) or IsRemaining + end + + if IsRemaining == false then + self:Abort() + end + self:PlayerAborted( PlayerUnit ) end + end end @@ -308,14 +324,14 @@ function TASK:CrashUnit( PlayerUnit ) -- Check if the PlayerGroup is already assigned to the Task. If yes, the PlayerGroup is aborted from the Task. -- If the PlayerUnit was the last unit of the PlayerGroup, the menu needs to be removed from the Group. if self:IsStateAssigned() then - local IsAssignedToGroup = self:IsAssignedToGroup( PlayerGroup ) - self:E( { IsAssignedToGroup = IsAssignedToGroup } ) - if IsAssignedToGroup then + local IsGroupAssigned = self:IsGroupAssigned( PlayerGroup ) + self:E( { IsGroupAssigned = IsGroupAssigned } ) + if IsGroupAssigned then self:UnAssignFromUnit( PlayerUnit ) self:MessageToGroups( PlayerUnit:GetPlayerName() .. " crashed in Task " .. self:GetName() ) self:E( { TaskGroup = PlayerGroup:GetName(), GetUnits = PlayerGroup:GetUnits() } ) if #PlayerGroup:GetUnits() == 1 then - PlayerGroup:SetState( PlayerGroup, "Assigned", nil ) + self:ClearGroupAssignment( PlayerGroup ) end self:PlayerCrashed( PlayerUnit ) end @@ -343,40 +359,136 @@ function TASK:GetGroups() return self.SetGroup end +do -- Group Assignment + --- Returns if the @{Task} is assigned to the Group. + -- @param #TASK self + -- @param Wrapper.Group#GROUP TaskGroup + -- @return #boolean + function TASK:IsGroupAssigned( TaskGroup ) + + local TaskGroupName = TaskGroup:GetName() + + if self.AssignedGroups[TaskGroupName] == TaskGroup then + self:T( { "Task is assigned to:", TaskGroup:GetName() } ) + return true + end + + self:T( { "Task is not assigned to:", TaskGroup:GetName() } ) + return false + end + + + --- Set @{Group} assigned to the @{Task}. + -- @param #TASK self + -- @param Wrapper.Group#GROUP TaskGroup + -- @return #TASK + function TASK:SetGroupAssigned( TaskGroup ) + + local TaskName = self:GetName() + local TaskGroupName = TaskGroup:GetName() + + self.AssignedGroups[TaskGroupName] = TaskGroup + self:E( string.format( "Task %s is assigned to %s", TaskName, TaskGroupName ) ) + + local SetAssignedGroups = self:GetGroups() + + SetAssignedGroups:ForEachGroup( + function( AssignedGroup ) + if self:IsGroupAssigned(AssignedGroup) then + self:GetMission():GetCommandCenter():MessageToGroup( string.format( "Task %s is assigned to group %s.", TaskName, TaskGroupName ), AssignedGroup ) + else + self:GetMission():GetCommandCenter():MessageToGroup( string.format( "Task %s is assigned to your group.", TaskName ), AssignedGroup ) + end + end + ) + + return self + end + + --- Clear the @{Group} assignment from the @{Task}. + -- @param #TASK self + -- @param Wrapper.Group#GROUP TaskGroup + -- @return #TASK + function TASK:ClearGroupAssignment( TaskGroup ) + + local TaskName = self:GetName() + local TaskGroupName = TaskGroup:GetName() + + self.AssignedGroups[TaskGroupName] = nil + self:E( string.format( "Task %s is unassigned to %s", TaskName, TaskGroupName ) ) + + local SetAssignedGroups = self:GetGroups() ---- Assign the @{Task} to a @{Group}. --- @param #TASK self --- @param Wrapper.Group#GROUP TaskGroup --- @return #TASK -function TASK:AssignToGroup( TaskGroup ) - self:F( TaskGroup:GetName() ) + SetAssignedGroups:ForEachGroup( + function( AssignedGroup ) + if self:IsGroupAssigned(AssignedGroup) then + self:GetMission():GetCommandCenter():MessageToGroup( string.format( "Task %s is unassigned from group %s.", TaskName, TaskGroupName ), AssignedGroup ) + else + self:GetMission():GetCommandCenter():MessageToGroup( string.format( "Task %s is unassigned from your group.", TaskName ), AssignedGroup ) + end + end + ) + + return self + end - local TaskGroupName = TaskGroup:GetName() +end + +do -- Group Assignment + + --- Assign the @{Task} to a @{Group}. + -- @param #TASK self + -- @param Wrapper.Group#GROUP TaskGroup + -- @return #TASK + function TASK:AssignToGroup( TaskGroup ) + self:F( TaskGroup:GetName() ) + + local TaskGroupName = TaskGroup:GetName() + + self:SetGroupAssigned( TaskGroup ) + + local Mission = self:GetMission() + local MissionMenu = Mission:GetMenu( TaskGroup ) + MissionMenu:RemoveSubMenus() + + self:SetAssignedMenuForGroup( TaskGroup ) + + local TaskUnits = TaskGroup:GetUnits() + for UnitID, UnitData in pairs( TaskUnits ) do + local TaskUnit = UnitData -- Wrapper.Unit#UNIT + local PlayerName = TaskUnit:GetPlayerName() + self:E(PlayerName) + if PlayerName ~= nil or PlayerName ~= "" then + self:AssignToUnit( TaskUnit ) + end + end + + return self + end - TaskGroup:SetState( TaskGroup, "Assigned", self ) + --- UnAssign the @{Task} from a @{Group}. + -- @param #TASK self + function TASK:UnAssignFromGroup( TaskGroup ) + self:F2( { TaskGroup } ) + + self:ClearGroupAssignment( TaskGroup ) - self:E("Task is assigned to " .. TaskGroup:GetName() ) + self:RemoveAssignedMenuForGroup( TaskGroup ) - local Mission = self:GetMission() - local MissionMenu = Mission:GetMenu( TaskGroup ) - MissionMenu:RemoveSubMenus() - - self:SetAssignedMenuForGroup( TaskGroup ) - - local TaskUnits = TaskGroup:GetUnits() - for UnitID, UnitData in pairs( TaskUnits ) do - local TaskUnit = UnitData -- Wrapper.Unit#UNIT - local PlayerName = TaskUnit:GetPlayerName() - self:E(PlayerName) - if PlayerName ~= nil or PlayerName ~= "" then - self:AssignToUnit( TaskUnit ) + local TaskUnits = TaskGroup:GetUnits() + for UnitID, UnitData in pairs( TaskUnits ) do + local TaskUnit = UnitData -- Wrapper.Unit#UNIT + local PlayerName = TaskUnit:GetPlayerName() + if PlayerName ~= nil or PlayerName ~= "" then + self:UnAssignFromUnit( TaskUnit ) + end end end - return self end + --- -- @param #TASK self -- @param Wrapper.Group#GROUP FindGroup @@ -452,7 +564,7 @@ function TASK:SendBriefingToAssignedGroups() for TaskGroupName, TaskGroup in pairs( self.SetGroup:GetSet() ) do - if self:IsAssignedToGroup( TaskGroup ) then + if self:IsGroupAssigned( TaskGroup ) then TaskGroup:Message( self.TaskBriefing, 60 ) end end @@ -469,47 +581,7 @@ function TASK:UnAssignFromGroups() end end ---- UnAssign the @{Task} from a @{Group}. --- @param #TASK self -function TASK:UnAssignFromGroup( TaskGroup ) - self:F2( { TaskGroup } ) - - TaskGroup:SetState( TaskGroup, "Assigned", nil ) - self:E("Task is unassigned from " .. TaskGroup:GetName() ) - - self:RemoveAssignedMenuForGroup( TaskGroup ) - - local TaskUnits = TaskGroup:GetUnits() - for UnitID, UnitData in pairs( TaskUnits ) do - local TaskUnit = UnitData -- Wrapper.Unit#UNIT - local PlayerName = TaskUnit:GetPlayerName() - if PlayerName ~= nil or PlayerName ~= "" then - self:UnAssignFromUnit( TaskUnit ) - end - end -end - - - ---- Returns if the @{Task} is assigned to the Group. --- @param #TASK self --- @param Wrapper.Group#GROUP TaskGroup --- @return #boolean -function TASK:IsAssignedToGroup( TaskGroup ) - - local TaskGroupName = TaskGroup:GetName() - - if self:IsStateAssigned() then - if TaskGroup:GetState( TaskGroup, "Assigned" ) == self then - self:T( { "Task is assigned to:", TaskGroup:GetName() } ) - return true - end - end - - self:T( { "Task is not assigned to:", TaskGroup:GetName() } ) - return false -end --- Returns if the @{Task} has still alive and assigned Units. -- @param #TASK self @@ -519,7 +591,7 @@ function TASK:HasAliveUnits() for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do if self:IsStateAssigned() then - if self:IsAssignedToGroup( TaskGroup ) then + if self:IsGroupAssigned( TaskGroup ) then for TaskUnitID, TaskUnit in pairs( TaskGroup:GetUnits() ) do if TaskUnit:IsAlive() then self:T( { HasAliveUnits = true } ) @@ -560,9 +632,9 @@ function TASK:SetMenu( MenuTime ) --R2.1 Mission Reports and Task Reports added. MENU_GROUP_COMMAND:New( TaskGroup, "Report Held Tasks", TaskGroup.MenuReports, Mission.MenuReportOverview, Mission, TaskGroup, "Hold" ) end - if self:IsStatePlanned() or self:IsStateReplanned() then +-- if self:IsStatePlanned() or self:IsStateReplanned() then self:SetMenuForGroup( TaskGroup, MenuTime ) - end +-- end end end end @@ -575,12 +647,10 @@ end -- @return #TASK function TASK:SetMenuForGroup( TaskGroup, MenuTime ) - if not TaskGroup:GetState( TaskGroup, "Assigned" ) then - self:SetPlannedMenuForGroup( TaskGroup, self:GetTaskName(), MenuTime ) + if self:IsGroupAssigned( TaskGroup ) then + self:SetAssignedMenuForGroup( TaskGroup, MenuTime ) else - if not self:IsAssignedToGroup( TaskGroup ) then - self:SetAssignedMenuForGroup( TaskGroup, MenuTime ) - end + self:SetPlannedMenuForGroup( TaskGroup, self:GetTaskName(), MenuTime ) end end @@ -640,7 +710,7 @@ function TASK:RemoveMenu( MenuTime ) for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do local TaskGroup = TaskGroup -- Wrapper.Group#GROUP if TaskGroup:IsAlive() and TaskGroup:GetPlayerNames() then - if not self:IsAssignedToGroup( TaskGroup ) then + if not self:IsGroupAssigned( TaskGroup ) then self:RemovePlannedMenuForGroup( TaskGroup, MenuTime ) end end @@ -723,8 +793,6 @@ function TASK:MenuTaskAbort( TaskGroup ) self:AbortUnit( PlayerUnit ) end - self:GetMission():GetCommandCenter():GetPositionable():MessageToSetGroup( "Abort", 15, self.SetGroup ) - end @@ -1020,14 +1088,17 @@ function TASK:onenterAssigned( From, Event, To, PlayerUnit, PlayerName ) self:E( { "Task Assigned", self.Dispatcher } ) - self:MessageToGroups( "Task " .. self:GetName() .. " has been assigned to your group." ) - - if self.Dispatcher then - self:E( "Firing Assign event " ) - self.Dispatcher:Assign( self, PlayerUnit, PlayerName ) + if From ~= "Assigned" then + self:GetMission():GetCommandCenter():MessageToCoalition( "Task " .. self:GetName() .. " is assigned." ) + if self.Dispatcher then + self:E( "Firing Assign event " ) + self.Dispatcher:Assign( self, PlayerUnit, PlayerName ) + end + + self:GetMission():__Start( 1 ) + + self:SetMenu() end - - self:GetMission():__Start( 1 ) end @@ -1056,12 +1127,13 @@ end function TASK:onenterAborted( From, Event, To ) self:E( "Task Aborted" ) - - self:GetMission():GetCommandCenter():MessageToCoalition( "Task " .. self:GetName() .. " has been aborted! Task may be replanned." ) - self:UnAssignFromGroups() + if From ~= "Aborted" then + self:GetMission():GetCommandCenter():MessageToCoalition( "Task " .. self:GetName() .. " has been aborted! Task may be replanned." ) + self:__Replan( 5 ) + self:SetMenu() + end - self:__Replan( 5 ) end --- FSM function for a TASK @@ -1101,7 +1173,7 @@ end function TASK:onstatechange( From, Event, To ) if self:IsTrace() then - MESSAGE:New( "@ Task " .. self.TaskName .. " : " .. Event .. " changed to state " .. To, 2 ):ToAll() + --MESSAGE:New( "@ Task " .. self.TaskName .. " : " .. From .. " changed to " .. To .. " by " .. Event, 2 ):ToAll() end if self.Scores[To] then diff --git a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua index 28842bcab..b1a6e4348 100644 --- a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua +++ b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua @@ -277,9 +277,7 @@ do -- TASK_A2G_DISPATCHER Mission:GetCommandCenter():SetMenu() for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do - if not TaskGroup:GetState( TaskGroup, "Assigned" ) then - 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 + 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 From 99cbe0c8bb901ed205ab256e74ac968fcc652463 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 10:50:12 +0200 Subject: [PATCH 22/39] Heavy rework of the menus and now it is much better --- Moose Development/Moose/Core/Menu.lua | 2 +- .../Moose/Tasking/CommandCenter.lua | 1 - Moose Development/Moose/Tasking/Mission.lua | 58 ++++++++++- Moose Development/Moose/Tasking/Task.lua | 97 +++++++++++-------- Moose Development/Moose/Wrapper/Group.lua | 2 +- 5 files changed, 115 insertions(+), 45 deletions(-) diff --git a/Moose Development/Moose/Core/Menu.lua b/Moose Development/Moose/Core/Menu.lua index c38f763d4..70028b829 100644 --- a/Moose Development/Moose/Core/Menu.lua +++ b/Moose Development/Moose/Core/Menu.lua @@ -82,7 +82,7 @@ do -- MENU_BASE -- @param #string MenuText The text of the child menu. -- @return #MENU_BASE function MENU_BASE:GetMenu( MenuText ) - self:F( { self.Menus, MenuText } ) + self:F2( { Menu = self.Menus[MenuText] } ) return self.Menus[MenuText] end diff --git a/Moose Development/Moose/Tasking/CommandCenter.lua b/Moose Development/Moose/Tasking/CommandCenter.lua index 7b05761b1..2a696ead2 100644 --- a/Moose Development/Moose/Tasking/CommandCenter.lua +++ b/Moose Development/Moose/Tasking/CommandCenter.lua @@ -269,7 +269,6 @@ end -- @param #COMMANDCENTER self -- @return Core.Menu#MENU_COALITION function COMMANDCENTER:GetMenu() - self:F() return self.CommandCenterMenu end diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index 00451544a..54032cda1 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -12,6 +12,7 @@ MISSION = { ClassName = "MISSION", Name = "", MissionStatus = "PENDING", + AssignedGroups = {}, } --- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. @@ -366,7 +367,7 @@ end -- @param #MISSION self -- @param #number MenuTime function MISSION:SetMenu( MenuTime ) - self:F() + self:F( { self:GetName(), MenuTime } ) for _, TaskData in pairs( self:GetTasks() ) do local Task = TaskData -- Tasking.Task#TASK @@ -378,7 +379,7 @@ end -- @param #MISSION self -- @param #number MenuTime function MISSION:RemoveMenu( MenuTime ) - self:F() + self:F( { self:GetName(), MenuTime } ) for _, Task in pairs( self:GetTasks() ) do local Task = Task -- Tasking.Task#TASK @@ -387,6 +388,58 @@ function MISSION:RemoveMenu( MenuTime ) end +do -- Group Assignment + + --- Returns if the @{Mission} is assigned to the Group. + -- @param #MISSION self + -- @param Wrapper.Group#GROUP MissionGroup + -- @return #boolean + function MISSION:IsGroupAssigned( MissionGroup ) + + local MissionGroupName = MissionGroup:GetName() + + if self.AssignedGroups[MissionGroupName] == MissionGroup then + self:T( { "Mission is assigned to:", MissionGroup:GetName() } ) + return true + end + + self:T( { "Mission is not assigned to:", MissionGroup:GetName() } ) + return false + end + + + --- Set @{Group} assigned to the @{Mission}. + -- @param #MISSION self + -- @param Wrapper.Group#GROUP MissionGroup + -- @return #MISSION + function MISSION:SetGroupAssigned( MissionGroup ) + + local MissionName = self:GetName() + local MissionGroupName = MissionGroup:GetName() + + self.AssignedGroups[MissionGroupName] = MissionGroup + self:E( string.format( "Mission %s is assigned to %s", MissionName, MissionGroupName ) ) + + return self + end + + --- Clear the @{Group} assignment from the @{Mission}. + -- @param #MISSION self + -- @param Wrapper.Group#GROUP MissionGroup + -- @return #MISSION + function MISSION:ClearGroupAssignment( MissionGroup ) + + local MissionName = self:GetName() + local MissionGroupName = MissionGroup:GetName() + + self.AssignedGroups[MissionGroupName] = nil + self:E( string.format( "Mission %s is unassigned to %s", MissionName, MissionGroupName ) ) + + return self + end + +end + --- Gets the COMMANDCENTER. -- @param #MISSION self -- @return Tasking.CommandCenter#COMMANDCENTER @@ -642,7 +695,6 @@ end -- Tasks = Mission:GetTasks() -- env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) function MISSION:GetTasks() - self:F() return self.Tasks end diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 07fa7ee00..be5fb9b0d 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -391,6 +391,9 @@ do -- Group Assignment self.AssignedGroups[TaskGroupName] = TaskGroup self:E( string.format( "Task %s is assigned to %s", TaskName, TaskGroupName ) ) + -- Set the group to be assigned at mission level. This allows to decide the menu options on mission level for this group. + self:GetMission():SetGroupAssigned( TaskGroup ) + local SetAssignedGroups = self:GetGroups() SetAssignedGroups:ForEachGroup( @@ -417,6 +420,9 @@ do -- Group Assignment self.AssignedGroups[TaskGroupName] = nil self:E( string.format( "Task %s is unassigned to %s", TaskName, TaskGroupName ) ) + + -- Set the group to be assigned at mission level. This allows to decide the menu options on mission level for this group. + self:GetMission():ClearGroupAssignment( TaskGroup ) local SetAssignedGroups = self:GetGroups() @@ -448,12 +454,6 @@ do -- Group Assignment self:SetGroupAssigned( TaskGroup ) - local Mission = self:GetMission() - local MissionMenu = Mission:GetMenu( TaskGroup ) - MissionMenu:RemoveSubMenus() - - self:SetAssignedMenuForGroup( TaskGroup ) - local TaskUnits = TaskGroup:GetUnits() for UnitID, UnitData in pairs( TaskUnits ) do local TaskUnit = UnitData -- Wrapper.Unit#UNIT @@ -463,6 +463,10 @@ do -- Group Assignment self:AssignToUnit( TaskUnit ) end end + + local Mission = self:GetMission() + local CommandCenter = Mission:GetCommandCenter() + CommandCenter:SetMenu() return self end @@ -474,8 +478,6 @@ do -- Group Assignment self:ClearGroupAssignment( TaskGroup ) - self:RemoveAssignedMenuForGroup( TaskGroup ) - local TaskUnits = TaskGroup:GetUnits() for UnitID, UnitData in pairs( TaskUnits ) do local TaskUnit = UnitData -- Wrapper.Unit#UNIT @@ -484,8 +486,11 @@ do -- Group Assignment self:UnAssignFromUnit( TaskUnit ) end end + + local Mission = self:GetMission() + local CommandCenter = Mission:GetCommandCenter() + CommandCenter:SetMenu() end - end @@ -611,9 +616,9 @@ end -- @param #number MenuTime -- @return #TASK function TASK:SetMenu( MenuTime ) --R2.1 Mission Reports and Task Reports added. Fixes issue #424. - self:F() + self:F( { self:GetName(), MenuTime } ) - self.SetGroup:Flush() + --self.SetGroup:Flush() for TaskGroupID, TaskGroupData in pairs( self.SetGroup:GetSet() ) do local TaskGroup = TaskGroupData -- Wrapper.Group#GROUP if TaskGroup:IsAlive() and TaskGroup:GetPlayerNames() then @@ -647,10 +652,9 @@ end -- @return #TASK function TASK:SetMenuForGroup( TaskGroup, MenuTime ) + self:SetPlannedMenuForGroup( TaskGroup, MenuTime ) if self:IsGroupAssigned( TaskGroup ) then self:SetAssignedMenuForGroup( TaskGroup, MenuTime ) - else - self:SetPlannedMenuForGroup( TaskGroup, self:GetTaskName(), MenuTime ) end end @@ -661,7 +665,7 @@ end -- @param #string MenuText The menu text. -- @param #number MenuTime -- @return #TASK self -function TASK:SetPlannedMenuForGroup( TaskGroup, MenuText, MenuTime ) +function TASK:SetPlannedMenuForGroup( TaskGroup, MenuTime ) self:E( TaskGroup:GetName() ) local Mission = self:GetMission() @@ -669,14 +673,21 @@ function TASK:SetPlannedMenuForGroup( TaskGroup, MenuText, MenuTime ) local CommandCenter = Mission:GetCommandCenter() local CommandCenterMenu = CommandCenter:GetMenu() + local TaskType = self:GetType() + local TaskText = self:GetName() + local MissionMenu = MENU_GROUP:New( TaskGroup, MissionName, CommandCenterMenu ):SetTime( MenuTime ) - local MissionMenu = Mission:GetMenu( TaskGroup ) - local TaskType = self:GetType() - local TaskTypeMenu = MENU_GROUP:New( TaskGroup, TaskType, MissionMenu ):SetTime( MenuTime ) - local TaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, MenuText, TaskTypeMenu, self.MenuAssignToGroup, { self = self, TaskGroup = TaskGroup } ):SetTime( MenuTime ):SetRemoveParent( true ) + local TaskPlannedMenu = MENU_GROUP:New( TaskGroup, "Planned Tasks", MissionMenu ):SetTime( MenuTime ) + local TaskTypeMenu = MENU_GROUP:New( TaskGroup, TaskType, TaskPlannedMenu ):SetTime( MenuTime ):SetRemoveParent( true ) + local TaskTypeMenu = MENU_GROUP:New( TaskGroup, TaskText, TaskTypeMenu ):SetTime( MenuTime ):SetRemoveParent( true ) + local ReportTaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Report Task %s Status", TaskText ), TaskTypeMenu, self.MenuTaskStatus, self, TaskGroup ):SetTime( MenuTime ):SetRemoveParent( true ) + + if not Mission:IsGroupAssigned( TaskGroup ) then + local JoinTaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Join Task %s", TaskText ), TaskTypeMenu, self.MenuAssignToGroup, { self = self, TaskGroup = TaskGroup } ):SetTime( MenuTime ):SetRemoveParent( true ) + end return self end @@ -687,15 +698,23 @@ end -- @param #number MenuTime -- @return #TASK self function TASK:SetAssignedMenuForGroup( TaskGroup, MenuTime ) - self:E( TaskGroup:GetName() ) + self:F( { TaskGroup:GetName(), MenuTime } ) local Mission = self:GetMission() + local MissionName = Mission:GetName() + local CommandCenter = Mission:GetCommandCenter() + local CommandCenterMenu = CommandCenter:GetMenu() + + local TaskType = self:GetType() + local TaskText = self:GetName() + + local MissionMenu = MENU_GROUP:New( TaskGroup, MissionName, CommandCenterMenu ):SetTime( MenuTime ) local MissionMenu = Mission:GetMenu( TaskGroup ) - self:E( { MissionMenu = MissionMenu } ) - local TaskTypeMenu = MENU_GROUP_COMMAND:New( TaskGroup, "Task Status", MissionMenu, self.MenuTaskStatus, self, TaskGroup ):SetTime( MenuTime ) - local TaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, "Abort Task", MissionMenu, self.MenuTaskAbort, self, TaskGroup ):SetTime( MenuTime ) + local TaskAssignedMenu = MENU_GROUP:New( TaskGroup, string.format( "Assigned Task %s", TaskText ), MissionMenu ):SetTime( MenuTime ) + local TaskTypeMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Report Task %s Status", TaskText ), TaskAssignedMenu, self.MenuTaskStatus, self, TaskGroup ):SetTime( MenuTime ):SetRemoveParent( true ) + local TaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Abort Group from Task %s", TaskText ), TaskAssignedMenu, self.MenuTaskAbort, self, TaskGroup ):SetTime( MenuTime ):SetRemoveParent( true ) return self end @@ -705,14 +724,12 @@ end -- @param #number MenuTime -- @return #TASK function TASK:RemoveMenu( MenuTime ) - self:F() + self:F( { self:GetName(), MenuTime } ) for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do local TaskGroup = TaskGroup -- Wrapper.Group#GROUP if TaskGroup:IsAlive() and TaskGroup:GetPlayerNames() then - if not self:IsGroupAssigned( TaskGroup ) then - self:RemovePlannedMenuForGroup( TaskGroup, MenuTime ) - end + self:RefreshMenus( TaskGroup, MenuTime ) end end end @@ -723,24 +740,26 @@ end -- @param Wrapper.Group#GROUP TaskGroup -- @param #number MenuTime -- @return #TASK self -function TASK:RemovePlannedMenuForGroup( TaskGroup, MenuTime ) - self:F() +function TASK:RefreshMenus( TaskGroup, MenuTime ) + self:F( { TaskGroup:GetName(), MenuTime } ) local Mission = self:GetMission() local MissionName = Mission:GetName() - + local CommandCenter = Mission:GetCommandCenter() + local CommandCenterMenu = CommandCenter:GetMenu() + local MissionMenu = Mission:GetMenu( TaskGroup ) + + local TaskText = self:GetName() + local PlannedMenu = MissionMenu:GetMenu( string.format( "Planned Tasks", TaskText ) ) + local AssignedMenu = MissionMenu:GetMenu( string.format( "Assigned Task %s", TaskText ) ) - if MissionMenu then - local TaskType = self:GetType() - local TypeMenu = MissionMenu:GetMenu( TaskType ) - - if TypeMenu then - local TaskMenu = TypeMenu:GetMenu( self:GetTaskName() ) - if TaskMenu then - TaskMenu:Remove( MenuTime ) - end - end + if PlannedMenu then + PlannedMenu:Remove( MenuTime ) + end + + if AssignedMenu then + AssignedMenu:Remove( MenuTime ) end end diff --git a/Moose Development/Moose/Wrapper/Group.lua b/Moose Development/Moose/Wrapper/Group.lua index 02bbd7722..3be9bc187 100644 --- a/Moose Development/Moose/Wrapper/Group.lua +++ b/Moose Development/Moose/Wrapper/Group.lua @@ -1141,7 +1141,7 @@ do -- Players end end - self:F( PlayerNames ) + self:F2( PlayerNames ) return PlayerNames end From 02e2f21ec6da774b793310be50a9bbbd2e72d4b2 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 10:57:29 +0200 Subject: [PATCH 23/39] test good abort when more than one player is still assigned to the task, the task should not abort, only the player... --- Moose Development/Moose/Tasking/Task.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index be5fb9b0d..e5b69426f 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -287,8 +287,8 @@ function TASK:AbortUnit( PlayerUnit ) -- It will go to hold, if there are no players in the mission... local IsRemaining = false - for GroupName, GroupData in pairs( PlayerGroups ) do - IsRemaining = ( IsRemaining == false ) and self:IsGroupAssigned( PlayerGroup ) or IsRemaining + for GroupName, AssignedGroup in pairs( PlayerGroups ) do + IsRemaining = ( IsRemaining == false ) and self:IsGroupAssigned( AssignedGroup ) or IsRemaining end if IsRemaining == false then From 82477c93d254d20d3ed1f9b584651d09eed82bed Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 11:45:17 +0200 Subject: [PATCH 24/39] Fixed abort logic and trace overhead on menus --- Moose Development/Moose/Core/Menu.lua | 14 ++++++------- Moose Development/Moose/Tasking/Task.lua | 26 ++++++++++-------------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/Moose Development/Moose/Core/Menu.lua b/Moose Development/Moose/Core/Menu.lua index 70028b829..4cbb0f828 100644 --- a/Moose Development/Moose/Core/Menu.lua +++ b/Moose Development/Moose/Core/Menu.lua @@ -810,9 +810,9 @@ do -- @param MenuTime -- @return #MENU_GROUP self function MENU_GROUP:RemoveSubMenus( MenuTime ) - self:F2( { self.MenuPath, MenuTime, self.MenuTime } ) + --self:F2( { self.MenuPath, MenuTime, self.MenuTime } ) - self:T( { "Removing Group SubMenus:", self.MenuGroup:GetName(), self.MenuPath } ) + --self:T( { "Removing Group SubMenus:", self.MenuGroup:GetName(), self.MenuPath } ) for MenuText, Menu in pairs( self.Menus ) do Menu:Remove( MenuTime ) end @@ -825,7 +825,7 @@ do -- @param MenuTime -- @return #nil function MENU_GROUP:Remove( MenuTime ) - self:F( { self.MenuGroupID, self.MenuPath, MenuTime, self.MenuTime } ) + --self:F2( { self.MenuGroupID, self.MenuPath, MenuTime, self.MenuTime } ) self:RemoveSubMenus( MenuTime ) @@ -844,7 +844,7 @@ do end end end - self:T( { "Removing Group Menu:", self.MenuGroup:GetName(), self.MenuGroup._Menus[self.Path].Path } ) + self:T( { "Removing Group Menu:", MenuGroup = self.MenuGroup:GetName(), MenuPath = self.MenuGroup._Menus[self.Path].Path } ) self.MenuGroup._Menus[self.Path] = nil self = nil end @@ -896,7 +896,7 @@ do self.MenuText = MenuText self.ParentMenu = ParentMenu - self:T( { "Adding Group Command Menu:", MenuGroup:GetName(), MenuText, self.MenuParentPath } ) + self:T( { "Adding Group Command Menu:", MenuGroup = MenuGroup:GetName(), MenuText = MenuText, MenuPath = self.MenuParentPath } ) self.MenuPath = missionCommands.addCommandForGroup( self.MenuGroupID, MenuText, self.MenuParentPath, self.MenuCallHandler, arg ) if self.ParentMenu and self.ParentMenu.Menus then @@ -914,14 +914,14 @@ do -- @param MenuTime -- @return #nil function MENU_GROUP_COMMAND:Remove( MenuTime ) - self:F( { self.MenuGroupID, self.MenuPath, MenuTime, self.MenuTime } ) + --self:F2( { self.MenuGroupID, self.MenuPath, MenuTime, self.MenuTime } ) if not MenuTime or self.MenuTime ~= MenuTime then if self.MenuGroup._Menus[self.Path] then self = self.MenuGroup._Menus[self.Path] missionCommands.removeItemForGroup( self.MenuGroupID, self.MenuPath ) - self:T( { "Removing Group Command Menu:", self.MenuGroup:GetName(), self.MenuText, self.Path, self.MenuGroup._Menus[self.Path].Path } ) + self:T( { "Removing Group Command Menu:", MenuGroup = self.MenuGroup:GetName(), MenuText = self.MenuText, MenuPath = self.Path } ) self.ParentMenu.Menus[self.MenuText] = nil self.ParentMenu.MenuCount = self.ParentMenu.MenuCount - 1 diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index e5b69426f..72daf5888 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -261,13 +261,10 @@ end -- @param #TASK self -- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player aborting the Task. -- @return #boolean true if Unit is part of the Task. -function TASK:AbortUnit( PlayerUnit ) - self:F( { PlayerUnit = PlayerUnit } ) - - local PlayerUnitAborted = false +function TASK:AbortGroup( PlayerGroup ) + self:F( { PlayerGroup = PlayerGroup } ) local PlayerGroups = self:GetGroups() - local PlayerGroup = PlayerUnit:GetGroup() -- Is the PlayerGroup part of the PlayerGroups? if PlayerGroups:IsIncludeObject( PlayerGroup ) then @@ -278,7 +275,7 @@ function TASK:AbortUnit( PlayerUnit ) local IsGroupAssigned = self:IsGroupAssigned( PlayerGroup ) self:E( { IsGroupAssigned = IsGroupAssigned } ) if IsGroupAssigned then - local PlayerName = PlayerUnit:GetPlayerName() + local PlayerName = PlayerGroup:GetUnit(1):GetPlayerName() self:MessageToGroups( PlayerName .. " aborted Task " .. self:GetName() ) self:UnAssignFromGroup( PlayerGroup ) --self:Abort() @@ -286,22 +283,24 @@ function TASK:AbortUnit( PlayerUnit ) -- Now check if the task needs to go to hold... -- It will go to hold, if there are no players in the mission... + PlayerGroups:Flush() local IsRemaining = false - for GroupName, AssignedGroup in pairs( PlayerGroups ) do - IsRemaining = ( IsRemaining == false ) and self:IsGroupAssigned( AssignedGroup ) or IsRemaining + for GroupName, AssignedGroup in pairs( PlayerGroups:GetSet() or {} ) do + IsRemaining = ( ( IsRemaining == false ) and self:IsGroupAssigned( AssignedGroup ) ) or IsRemaining + self:F( { Task = self:GetName(), IsRemaining = IsRemaining } ) end if IsRemaining == false then self:Abort() end - self:PlayerAborted( PlayerUnit ) + self:PlayerAborted( PlayerGroup:GetUnit(1) ) end end end - return PlayerUnitAborted + return self end --- A PlayerUnit crashed in a Task. Abort the Player. @@ -369,7 +368,7 @@ do -- Group Assignment local TaskGroupName = TaskGroup:GetName() - if self.AssignedGroups[TaskGroupName] == TaskGroup then + if self.AssignedGroups[TaskGroupName] then self:T( { "Task is assigned to:", TaskGroup:GetName() } ) return true end @@ -808,10 +807,7 @@ end -- @param #TASK self function TASK:MenuTaskAbort( TaskGroup ) - for PlayerUnitName, PlayerUnit in pairs( TaskGroup:GetUnits() ) do - self:AbortUnit( PlayerUnit ) - end - + self:AbortGroup( TaskGroup ) end From 1c4002fb37862a9b57cd5877b47e1d4f1e39af29 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 11:50:24 +0200 Subject: [PATCH 25/39] Fixes abort --- Moose Development/Moose/Tasking/Task.lua | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 72daf5888..75b951382 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -286,10 +286,14 @@ function TASK:AbortGroup( PlayerGroup ) PlayerGroups:Flush() local IsRemaining = false for GroupName, AssignedGroup in pairs( PlayerGroups:GetSet() or {} ) do - IsRemaining = ( ( IsRemaining == false ) and self:IsGroupAssigned( AssignedGroup ) ) or IsRemaining - self:F( { Task = self:GetName(), IsRemaining = IsRemaining } ) + if self:IsGroupAssigned( AssignedGroup ) == true then + IsRemaining = true + self:F( { Task = self:GetName(), IsRemaining = IsRemaining } ) + break + end end - + + self:F( { Task = self:GetName(), IsRemaining = IsRemaining } ) if IsRemaining == false then self:Abort() end From 0b87b265c745488859af400d1d37d45be18708ce Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 12:05:46 +0200 Subject: [PATCH 26/39] Fixing abort --- Moose Development/Moose/Core/Fsm.lua | 8 ++++---- Moose Development/Moose/Core/Menu.lua | 4 ++-- Moose Development/Moose/Tasking/Task.lua | 13 +++++++------ 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Moose Development/Moose/Core/Fsm.lua b/Moose Development/Moose/Core/Fsm.lua index db7a0b40a..51adf9b86 100644 --- a/Moose Development/Moose/Core/Fsm.lua +++ b/Moose Development/Moose/Core/Fsm.lua @@ -1011,12 +1011,12 @@ do -- FSM_PROCESS -- Copy Processes for ProcessID, Process in pairs( self:GetProcesses() ) do self:E( { Process} ) - Process.fsm:Remove() - Process.fsm = nil + if Process.fsm then + Process.fsm:Remove() + Process.fsm = nil + end end - self._Processes = nil - return self end diff --git a/Moose Development/Moose/Core/Menu.lua b/Moose Development/Moose/Core/Menu.lua index 4cbb0f828..b33d8ef2c 100644 --- a/Moose Development/Moose/Core/Menu.lua +++ b/Moose Development/Moose/Core/Menu.lua @@ -882,7 +882,7 @@ do local Path = ( ParentMenu and ( table.concat( ParentMenu.MenuPath or {}, "@" ) .. "@" .. MenuText ) ) or MenuText if MenuGroup._Menus[Path] then self = MenuGroup._Menus[Path] - self:T( { "Re-using Group Command Menu:", MenuGroup:GetName(), MenuText } ) + self:F2( { "Re-using Group Command Menu:", MenuGroup:GetName(), MenuText } ) else self = BASE:Inherit( self, MENU_COMMAND_BASE:New( MenuText, ParentMenu, CommandMenuFunction, arg ) ) @@ -896,7 +896,7 @@ do self.MenuText = MenuText self.ParentMenu = ParentMenu - self:T( { "Adding Group Command Menu:", MenuGroup = MenuGroup:GetName(), MenuText = MenuText, MenuPath = self.MenuParentPath } ) + self:F( { "Adding Group Command Menu:", MenuGroup = MenuGroup:GetName(), MenuText = MenuText, MenuPath = self.MenuParentPath } ) self.MenuPath = missionCommands.addCommandForGroup( self.MenuGroupID, MenuText, self.MenuParentPath, self.MenuCallHandler, arg ) if self.ParentMenu and self.ParentMenu.Menus then diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 75b951382..b23cc8cf7 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -882,13 +882,14 @@ end function TASK:RemoveStateMachine( TaskUnit ) self:F( { TaskUnit, self.Fsm[TaskUnit] ~= nil } ) - self:E( self.Fsm ) - for TaskUnitT, Fsm in pairs( self.Fsm ) do - local Fsm = Fsm -- Core.Fsm#FSM_PROCESS - self:E( TaskUnitT ) - Fsm:Remove() - end + --self:E( self.Fsm ) + --for TaskUnitT, Fsm in pairs( self.Fsm ) do + --local Fsm = Fsm -- Core.Fsm#FSM_PROCESS + --self:E( TaskUnitT ) + --self.Fsm[TaskUnit] = nil + --end + self.Fsm[TaskUnit]:Remove() self.Fsm[TaskUnit] = nil collectgarbage() From 6f9bfc42110bf3b00d68e263727b8655afdbfe3f Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 12:40:16 +0200 Subject: [PATCH 27/39] Abort logic improvements --- Moose Development/Moose/Tasking/Mission.lua | 11 ++++------- Moose Development/Moose/Tasking/Task.lua | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index 54032cda1..c19af3f75 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -289,20 +289,17 @@ end -- If the Unit is part of a Task in the Mission, true is returned. -- @param #MISSION self -- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player joining the Mission. --- @return #boolean true if Unit is part of a Task in the Mission. +-- @return #MISSION function MISSION:AbortUnit( PlayerUnit ) self:F( { PlayerUnit = PlayerUnit } ) - local PlayerUnitRemoved = false - for TaskID, Task in pairs( self:GetTasks() ) do local Task = Task -- Tasking.Task#TASK - if Task:AbortUnit( PlayerUnit ) then - PlayerUnitRemoved = true - end + local PlayerGroup = PlayerUnit:GetGroup() + Task:AbortGroup( PlayerGroup ) end - return PlayerUnitRemoved + return self end --- Handles a crash of a PlayerUnit from the Mission. diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index b23cc8cf7..15c88a013 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -754,7 +754,7 @@ function TASK:RefreshMenus( TaskGroup, MenuTime ) local MissionMenu = Mission:GetMenu( TaskGroup ) local TaskText = self:GetName() - local PlannedMenu = MissionMenu:GetMenu( string.format( "Planned Tasks", TaskText ) ) + local PlannedMenu = MissionMenu:GetMenu( "Planned Tasks" ) local AssignedMenu = MissionMenu:GetMenu( string.format( "Assigned Task %s", TaskText ) ) if PlannedMenu then From 625450ba127936ec64cbe8c1ebafbaaaf45c6fbe Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 13:37:04 +0200 Subject: [PATCH 28/39] Event prefix can be nil, if the event occurs on a non-spawned group with no # tag. --- Moose Development/Moose/Functional/Spawn.lua | 78 +++++++++++--------- 1 file changed, 44 insertions(+), 34 deletions(-) diff --git a/Moose Development/Moose/Functional/Spawn.lua b/Moose Development/Moose/Functional/Spawn.lua index c6faf2ee8..6e9386a7d 100644 --- a/Moose Development/Moose/Functional/Spawn.lua +++ b/Moose Development/Moose/Functional/Spawn.lua @@ -1595,11 +1595,13 @@ function SPAWN:_OnBirth( EventData ) if SpawnGroup then local EventPrefix = self:_GetPrefixFromGroup( SpawnGroup ) - self:T( { "Birth Event:", EventPrefix, self.SpawnTemplatePrefix } ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self.AliveUnits = self.AliveUnits + 1 - self:T( "Alive Units: " .. self.AliveUnits ) - end + if EventPrefix then -- EventPrefix can be nil if no # is found, which means, no spawnable group! + self:T( { "Birth Event:", EventPrefix, self.SpawnTemplatePrefix } ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self.AliveUnits = self.AliveUnits + 1 + self:T( "Alive Units: " .. self.AliveUnits ) + end + end end end @@ -1616,11 +1618,13 @@ function SPAWN:_OnDeadOrCrash( EventData ) if SpawnGroup then local EventPrefix = self:_GetPrefixFromGroup( SpawnGroup ) - self:T( { "Dead event: " .. EventPrefix } ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self.AliveUnits = self.AliveUnits - 1 - self:T( "Alive Units: " .. self.AliveUnits ) - end + if EventPrefix then -- EventPrefix can be nil if no # is found, which means, no spawnable group! + self:T( { "Dead event: " .. EventPrefix } ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self.AliveUnits = self.AliveUnits - 1 + self:T( "Alive Units: " .. self.AliveUnits ) + end + end end end @@ -1634,10 +1638,12 @@ function SPAWN:_OnTakeOff( EventData ) local SpawnGroup = EventData.IniGroup if SpawnGroup then local EventPrefix = self:_GetPrefixFromGroup( SpawnGroup ) - self:T( { "TakeOff event: " .. EventPrefix } ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self:T( "self.Landed = false" ) - SpawnGroup:SetState( SpawnGroup, "Spawn_Landed", false ) + if EventPrefix then -- EventPrefix can be nil if no # is found, which means, no spawnable group! + self:T( { "TakeOff event: " .. EventPrefix } ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + self:T( "self.Landed = false" ) + SpawnGroup:SetState( SpawnGroup, "Spawn_Landed", false ) + end end end end @@ -1652,16 +1658,18 @@ function SPAWN:_OnLand( EventData ) local SpawnGroup = EventData.IniGroup if SpawnGroup then local EventPrefix = self:_GetPrefixFromGroup( SpawnGroup ) - self:T( { "Land event: " .. EventPrefix } ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - -- TODO: Check if this is the last unit of the group that lands. - SpawnGroup:SetState( SpawnGroup, "Spawn_Landed", true ) - if self.RepeatOnLanding then - local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) - self:T( { "Landed:", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) - self:ReSpawn( SpawnGroupIndex ) - end - end + if EventPrefix then -- EventPrefix can be nil if no # is found, which means, no spawnable group! + self:T( { "Land event: " .. EventPrefix } ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + -- TODO: Check if this is the last unit of the group that lands. + SpawnGroup:SetState( SpawnGroup, "Spawn_Landed", true ) + if self.RepeatOnLanding then + local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) + self:T( { "Landed:", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) + self:ReSpawn( SpawnGroupIndex ) + end + end + end end end @@ -1676,16 +1684,18 @@ function SPAWN:_OnEngineShutDown( EventData ) local SpawnGroup = EventData.IniGroup if SpawnGroup then local EventPrefix = self:_GetPrefixFromGroup( SpawnGroup ) - self:T( { "EngineShutdown event: " .. EventPrefix } ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - -- todo: test if on the runway - local Landed = SpawnGroup:GetState( SpawnGroup, "Spawn_Landed" ) - if Landed and self.RepeatOnEngineShutDown then - local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) - self:T( { "EngineShutDown: ", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) - self:ReSpawn( SpawnGroupIndex ) - end - end + if EventPrefix then -- EventPrefix can be nil if no # is found, which means, no spawnable group! + self:T( { "EngineShutdown event: " .. EventPrefix } ) + if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then + -- todo: test if on the runway + local Landed = SpawnGroup:GetState( SpawnGroup, "Spawn_Landed" ) + if Landed and self.RepeatOnEngineShutDown then + local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) + self:T( { "EngineShutDown: ", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) + self:ReSpawn( SpawnGroupIndex ) + end + end + end end end From dac4c48850ef833239ec5c9e596dc428031c76e7 Mon Sep 17 00:00:00 2001 From: entropySG Date: Fri, 5 May 2017 14:32:56 +0200 Subject: [PATCH 29/39] Fix Missile Distance Message in Missile Trainer Menu --- Moose Development/Moose/Functional/MissileTrainer.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Moose Development/Moose/Functional/MissileTrainer.lua b/Moose Development/Moose/Functional/MissileTrainer.lua index 511cbca44..38b2008ae 100644 --- a/Moose Development/Moose/Functional/MissileTrainer.lua +++ b/Moose Development/Moose/Functional/MissileTrainer.lua @@ -442,7 +442,7 @@ function MISSILETRAINER._MenuMessages( MenuParameters ) if MenuParameters.Distance ~= nil then self.Distance = MenuParameters.Distance - MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", 15, "Menu" ):ToAll() + MESSAGE:New( "Hit detection distance set to " .. self.Distance * 1000 .. " meters", 15, "Menu" ):ToAll() end end From 9a5446216424fc7fa3b3275c91d54b7176797121 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 14:37:55 +0200 Subject: [PATCH 30/39] Fixed problem upon mission success. --- Moose Development/Moose/Tasking/Task.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 15c88a013..f30c338fe 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -585,7 +585,9 @@ function TASK:UnAssignFromGroups() self:F2() for TaskGroupName, TaskGroup in pairs( self.SetGroup:GetSet() ) do - self:UnAssignFromGroup( TaskGroup ) + if self:IsGroupAssigned(TaskGroup) then + self:UnAssignFromGroup( TaskGroup ) + end end end From cb7ba702ffa0f6d2b376b845541c7e1f80d2551d Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 15:50:21 +0200 Subject: [PATCH 31/39] Correct handling of crashing player when assigned to a task --- .../Moose/Tasking/CommandCenter.lua | 5 ++- Moose Development/Moose/Tasking/Mission.lua | 12 +++--- Moose Development/Moose/Tasking/Task.lua | 42 ++++++++++++------- 3 files changed, 37 insertions(+), 22 deletions(-) diff --git a/Moose Development/Moose/Tasking/CommandCenter.lua b/Moose Development/Moose/Tasking/CommandCenter.lua index 2a696ead2..248f5fd00 100644 --- a/Moose Development/Moose/Tasking/CommandCenter.lua +++ b/Moose Development/Moose/Tasking/CommandCenter.lua @@ -189,7 +189,10 @@ function COMMANDCENTER:New( CommandCenterPositionable, CommandCenterName ) function( self, EventData ) local PlayerUnit = EventData.IniUnit for MissionID, Mission in pairs( self:GetMissions() ) do - Mission:CrashUnit( PlayerUnit ) + local Mission = Mission -- Tasking.Mission#MISSION + if Mission:IsENGAGED() then + Mission:CrashUnit( PlayerUnit ) + end end end ) diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index c19af3f75..751768130 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -308,19 +308,17 @@ end -- If the Unit is part of a Task in the Mission, true is returned. -- @param #MISSION self -- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player crashing. --- @return #boolean true if Unit is part of a Task in the Mission. +-- @return #MISSION function MISSION:CrashUnit( PlayerUnit ) self:F( { PlayerUnit = PlayerUnit } ) - local PlayerUnitRemoved = false - for TaskID, Task in pairs( self:GetTasks() ) do - if Task:CrashUnit( PlayerUnit ) then - PlayerUnitRemoved = true - end + local Task = Task -- Tasking.Task#TASK + local PlayerGroup = PlayerUnit:GetGroup() + Task:CrashGroup( PlayerGroup ) end - return PlayerUnitRemoved + return self end --- Add a scoring to the mission. diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index f30c338fe..cf306bfee 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -260,7 +260,7 @@ end -- If the Unit is part of the Task, true is returned. -- @param #TASK self -- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player aborting the Task. --- @return #boolean true if Unit is part of the Task. +-- @return #TASK function TASK:AbortGroup( PlayerGroup ) self:F( { PlayerGroup = PlayerGroup } ) @@ -312,14 +312,11 @@ end -- If the Unit is part of the Task, true is returned. -- @param #TASK self -- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player aborting the Task. --- @return #boolean true if Unit is part of the Task. -function TASK:CrashUnit( PlayerUnit ) - self:F( { PlayerUnit = PlayerUnit } ) - - local PlayerUnitCrashed = false +-- @return #TASK +function TASK:CrashGroup( PlayerGroup ) + self:F( { PlayerGroup = PlayerGroup } ) local PlayerGroups = self:GetGroups() - local PlayerGroup = PlayerUnit:GetGroup() -- Is the PlayerGroup part of the PlayerGroups? if PlayerGroups:IsIncludeObject( PlayerGroup ) then @@ -330,18 +327,35 @@ function TASK:CrashUnit( PlayerUnit ) local IsGroupAssigned = self:IsGroupAssigned( PlayerGroup ) self:E( { IsGroupAssigned = IsGroupAssigned } ) if IsGroupAssigned then - self:UnAssignFromUnit( PlayerUnit ) - self:MessageToGroups( PlayerUnit:GetPlayerName() .. " crashed in Task " .. self:GetName() ) - self:E( { TaskGroup = PlayerGroup:GetName(), GetUnits = PlayerGroup:GetUnits() } ) - if #PlayerGroup:GetUnits() == 1 then - self:ClearGroupAssignment( PlayerGroup ) + local PlayerName = PlayerGroup:GetUnit(1):GetPlayerName() + self:MessageToGroups( PlayerName .. " crashed! " ) + self:UnAssignFromGroup( PlayerGroup ) + + -- Now check if the task needs to go to hold... + -- It will go to hold, if there are no players in the mission... + + PlayerGroups:Flush() + local IsRemaining = false + for GroupName, AssignedGroup in pairs( PlayerGroups:GetSet() or {} ) do + if self:IsGroupAssigned( AssignedGroup ) == true then + IsRemaining = true + self:F( { Task = self:GetName(), IsRemaining = IsRemaining } ) + break + end end - self:PlayerCrashed( PlayerUnit ) + + self:F( { Task = self:GetName(), IsRemaining = IsRemaining } ) + if IsRemaining == false then + self:Abort() + end + + self:PlayerCrashed( PlayerGroup:GetUnit(1) ) end + end end - return PlayerUnitCrashed + return self end From c9121ed6726a8fb71e93aedec703933f996312df Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 19:50:17 +0200 Subject: [PATCH 32/39] Menu fixes and Report Fixes -- Added player count to plannes task menus -- Detailed task report only shows the players in the task. -- Added method GetPlayerNames for a Task -- Added method GetPlayerCount for a Task -- Started with a threat level implementation on the menus, but there is a problem with the refresh... --- Moose Development/Moose/Tasking/Task.lua | 85 ++++++++++++++----- .../Moose/Tasking/Task_A2G_Dispatcher.lua | 7 +- 2 files changed, 70 insertions(+), 22 deletions(-) diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index cf306bfee..f006c584f 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -693,7 +693,12 @@ function TASK:SetPlannedMenuForGroup( TaskGroup, MenuTime ) local CommandCenterMenu = CommandCenter:GetMenu() local TaskType = self:GetType() - local TaskText = self:GetName() +-- local TaskThreatLevel = self.TaskInfo["ThreatLevel"] +-- local TaskThreatLevelString = TaskThreatLevel and " [" .. string.rep( "■", TaskThreatLevel ) .. "]" or " []" + local TaskPlayerCount = self:GetPlayerCount() + local TaskPlayerString = string.format( " (%dp)", TaskPlayerCount ) + local TaskText = string.format( "%s%s", self:GetName(), TaskPlayerString ) --, TaskThreatLevelString ) + local TaskName = string.format( "%s", self:GetName() ) local MissionMenu = MENU_GROUP:New( TaskGroup, MissionName, CommandCenterMenu ):SetTime( MenuTime ) @@ -702,10 +707,10 @@ function TASK:SetPlannedMenuForGroup( TaskGroup, MenuTime ) local TaskPlannedMenu = MENU_GROUP:New( TaskGroup, "Planned Tasks", MissionMenu ):SetTime( MenuTime ) local TaskTypeMenu = MENU_GROUP:New( TaskGroup, TaskType, TaskPlannedMenu ):SetTime( MenuTime ):SetRemoveParent( true ) local TaskTypeMenu = MENU_GROUP:New( TaskGroup, TaskText, TaskTypeMenu ):SetTime( MenuTime ):SetRemoveParent( true ) - local ReportTaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Report Task %s Status", TaskText ), TaskTypeMenu, self.MenuTaskStatus, self, TaskGroup ):SetTime( MenuTime ):SetRemoveParent( true ) + local ReportTaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Report Task Status" ), TaskTypeMenu, self.MenuTaskStatus, self, TaskGroup ):SetTime( MenuTime ):SetRemoveParent( true ) if not Mission:IsGroupAssigned( TaskGroup ) then - local JoinTaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Join Task %s", TaskText ), TaskTypeMenu, self.MenuAssignToGroup, { self = self, TaskGroup = TaskGroup } ):SetTime( MenuTime ):SetRemoveParent( true ) + local JoinTaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Join Task" ), TaskTypeMenu, self.MenuAssignToGroup, { self = self, TaskGroup = TaskGroup } ):SetTime( MenuTime ):SetRemoveParent( true ) end return self @@ -725,15 +730,19 @@ function TASK:SetAssignedMenuForGroup( TaskGroup, MenuTime ) local CommandCenterMenu = CommandCenter:GetMenu() local TaskType = self:GetType() - local TaskText = self:GetName() +-- local TaskThreatLevel = self.TaskInfo["ThreatLevel"] +-- local TaskThreatLevelString = TaskThreatLevel and " [" .. string.rep( "■", TaskThreatLevel ) .. "]" or " []" + local TaskPlayerCount = self:GetPlayerCount() + local TaskPlayerString = string.format( " (%dp)", TaskPlayerCount ) + local TaskText = string.format( "%s%s", self:GetName(), TaskPlayerString ) --, TaskThreatLevelString ) + local TaskName = string.format( "%s", self:GetName() ) local MissionMenu = MENU_GROUP:New( TaskGroup, MissionName, CommandCenterMenu ):SetTime( MenuTime ) local MissionMenu = Mission:GetMenu( TaskGroup ) - - local TaskAssignedMenu = MENU_GROUP:New( TaskGroup, string.format( "Assigned Task %s", TaskText ), MissionMenu ):SetTime( MenuTime ) - local TaskTypeMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Report Task %s Status", TaskText ), TaskAssignedMenu, self.MenuTaskStatus, self, TaskGroup ):SetTime( MenuTime ):SetRemoveParent( true ) - local TaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Abort Group from Task %s", TaskText ), TaskAssignedMenu, self.MenuTaskAbort, self, TaskGroup ):SetTime( MenuTime ):SetRemoveParent( true ) + local TaskAssignedMenu = MENU_GROUP:New( TaskGroup, string.format( "Assigned Task %s", TaskName ), MissionMenu ):SetTime( MenuTime ) + local TaskTypeMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Report Task Status" ), TaskAssignedMenu, self.MenuTaskStatus, self, TaskGroup ):SetTime( MenuTime ):SetRemoveParent( true ) + local TaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Abort Group from Task" ), TaskAssignedMenu, self.MenuTaskAbort, self, TaskGroup ):SetTime( MenuTime ):SetRemoveParent( true ) return self end @@ -769,9 +778,9 @@ function TASK:RefreshMenus( TaskGroup, MenuTime ) local MissionMenu = Mission:GetMenu( TaskGroup ) - local TaskText = self:GetName() + local TaskName = self:GetName() local PlannedMenu = MissionMenu:GetMenu( "Planned Tasks" ) - local AssignedMenu = MissionMenu:GetMenu( string.format( "Assigned Task %s", TaskText ) ) + local AssignedMenu = MissionMenu:GetMenu( string.format( "Assigned Task %s", TaskName ) ) if PlannedMenu then PlannedMenu:Remove( MenuTime ) @@ -1300,6 +1309,47 @@ function TASK:ReportOverview() --R2.1 fixed report. Now nicely formatted and con return Report:Text() end +--- Create a count of the players in the Task. +-- @param #TASK self +-- @return #number The total number of players in the task. +function TASK:GetPlayerCount() --R2.1 Get a count of the players. + + local PlayerCount = 0 + + -- Loop each Unit active in the Task, and find Player Names. + for TaskGroupID, PlayerGroup in pairs( self:GetGroups():GetSet() ) do + local PlayerGroup = PlayerGroup -- Wrapper.Group#GROUP + if self:IsGroupAssigned( PlayerGroup ) then + local PlayerNames = PlayerGroup:GetPlayerNames() + PlayerCount = PlayerCount + #PlayerNames + end + end + + return PlayerCount +end + + +--- Create a list of the players in the Task. +-- @param #TASK self +-- @return #map<#string,Wrapper.Group#GROUP> A map of the players +function TASK:GetPlayerNames() --R2.1 Get a map of the players. + + local PlayerNameMap = {} + + -- Loop each Unit active in the Task, and find Player Names. + for TaskGroupID, PlayerGroup in pairs( self:GetGroups():GetSet() ) do + local PlayerGroup = PlayerGroup -- Wrapper.Group#GROUP + if self:IsGroupAssigned( PlayerGroup ) then + local PlayerNames = PlayerGroup:GetPlayerNames() + for PlayerNameID, PlayerName in pairs( PlayerNames ) do + PlayerNameMap[PlayerName] = PlayerGroup + end + end + end + + return PlayerNameMap +end + --- Create a detailed report of the Task. -- List the Task Status, and the Players assigned to the Task. @@ -1314,18 +1364,13 @@ function TASK:ReportDetails() --R2.1 fixed report. Now nicely formatted and cont -- Determine the status of the Task. local State = self:GetState() - + -- Loop each Unit active in the Task, and find Player Names. - local PlayerNames = {} + local PlayerNames = self:GetPlayerNames() + local PlayerReport = REPORT:New() - for PlayerGroupID, PlayerGroupData in pairs( self:GetGroups():GetSet() ) do - - local PlayerGroup = PlayerGroupData -- Wrapper.Group#GROUP - - PlayerNames = PlayerGroup:GetPlayerNames() - if PlayerNames then - PlayerReport:Add( "Group " .. PlayerGroup:GetCallsign() .. ": " .. table.concat( PlayerNames, ", " ) ) - end + for PlayerName, PlayerGroup in pairs( PlayerNames ) do + PlayerReport:Add( "Group " .. PlayerGroup:GetCallsign() .. ": " .. PlayerName ) end local Players = PlayerReport:Text() diff --git a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua index b1a6e4348..f7101eea4 100644 --- a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua +++ b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua @@ -220,7 +220,7 @@ do -- TASK_A2G_DISPATCHER for DetectedItemID, DetectedItem in pairs( Detection:GetDetectedItems() ) do local DetectedItem = DetectedItem -- Functional.Detection#DETECTION_BASE.DetectedItem - local DetectedSet = DetectedItem.Set -- Functional.Detection#DETECTION_BASE.DetectedSet + local DetectedSet = DetectedItem.Set -- Core.Set#SET_UNIT local DetectedZone = DetectedItem.Zone self:E( { "Targets in DetectedItem", DetectedItem.ItemID, DetectedSet:Count(), tostring( DetectedItem ) } ) DetectedSet:Flush() @@ -258,6 +258,7 @@ do -- TASK_A2G_DISPATCHER self.Tasks[DetectedItemID] = Task Task:SetTargetZone( DetectedZone ) Task:SetDispatcher( self ) + Task:SetInfo( "ThreatLevel", DetectedSet:CalculateThreatLevelA2G() ) Task:SetInfo( "Detection", Detection:DetectedItemReportSummary( DetectedItemID ) ) Task:SetInfo( "Changes", Detection:GetChangeText( DetectedItem ) ) Mission:AddTask( Task ) @@ -277,7 +278,9 @@ do -- TASK_A2G_DISPATCHER Mission:GetCommandCenter():SetMenu() for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do - 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 ) + if not Mission:IsGroupAssigned(TaskGroup) then + 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 end From 192dbadd51f46516301407f21a4e803dcbdd5727 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 23:16:57 +0200 Subject: [PATCH 33/39] Cargo and smoke --- Moose Development/Moose/Tasking/Task_CARGO.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Moose Development/Moose/Tasking/Task_CARGO.lua b/Moose Development/Moose/Tasking/Task_CARGO.lua index 7ad7013e9..b3c7b64a9 100644 --- a/Moose Development/Moose/Tasking/Task_CARGO.lua +++ b/Moose Development/Moose/Tasking/Task_CARGO.lua @@ -312,7 +312,7 @@ do -- TASK_CARGO self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) - self.Cargo = Cargo + self.Cargo = Cargo -- Core.Cargo#CARGO Task:SetCargoPickup( self.Cargo, TaskUnit ) self:__RouteToPickupPoint( -0.1 ) end @@ -326,6 +326,7 @@ do -- TASK_CARGO self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) if TaskUnit:IsAir() then + self.Cargo.CargoObject:GetUnit(1):SmokeRed() self:__Land( -0.1, "Pickup" ) else self:__SelectAction( -0.1 ) From 11c20d57fd2aaab48972df29e6d17820333ddcdc Mon Sep 17 00:00:00 2001 From: FlightControl Date: Sat, 6 May 2017 10:11:22 +0200 Subject: [PATCH 34/39] Fixes -- Cargo deployment -- Mission text in menu -- Event log decrease --- Moose Development/Moose/Core/Cargo.lua | 90 +++++++++---------- Moose Development/Moose/Core/Event.lua | 2 +- Moose Development/Moose/Tasking/Mission.lua | 25 +++--- .../Moose/Tasking/Task_CARGO.lua | 26 ++++-- 4 files changed, 77 insertions(+), 66 deletions(-) diff --git a/Moose Development/Moose/Core/Cargo.lua b/Moose Development/Moose/Core/Cargo.lua index 825bb5084..f5b47b085 100644 --- a/Moose Development/Moose/Core/Cargo.lua +++ b/Moose Development/Moose/Core/Cargo.lua @@ -234,7 +234,7 @@ do -- CARGO function CARGO:New( Type, Name, Weight ) --R2.1 local self = BASE:Inherit( self, FSM:New() ) -- #CARGO - self:F( { Type, Name, Weight } ) + self:E( { Type, Name, Weight } ) self:SetStartState( "UnLoaded" ) self:AddTransition( { "UnLoaded", "Boarding" }, "Board", "Boarding" ) @@ -299,7 +299,7 @@ end -- @param #CARGO self -- @return #CARGO function CARGO:Spawn( PointVec2 ) - self:F() + self:E() end @@ -310,7 +310,7 @@ end -- @param Core.Zone#ZONE_BASE Zone -- @return #boolean **true** if cargo is in the Zone, **false** if cargo is not in the Zone. function CARGO:IsInZone( Zone ) - self:F( { Zone } ) + self:E( { Zone } ) if self:IsLoaded() then return Zone:IsPointVec2InZone( self.CargoCarrier:GetPointVec2() ) @@ -329,7 +329,7 @@ end -- @param #number NearRadius The radius when the cargo will board the Carrier (to avoid collision). -- @return #boolean function CARGO:IsNear( PointVec2, NearRadius ) - self:F( { PointVec2 } ) + self:E( { PointVec2 } ) local Distance = PointVec2:DistanceFromPointVec2( self.CargoObject:GetPointVec2() ) self:T( Distance ) @@ -382,7 +382,7 @@ do -- CARGO_REPRESENTABLE -- @return #CARGO_REPRESENTABLE function CARGO_REPRESENTABLE:New( CargoObject, Type, Name, Weight, ReportRadius, NearRadius ) local self = BASE:Inherit( self, CARGO:New( Type, Name, Weight, ReportRadius, NearRadius ) ) -- #CARGO_REPRESENTABLE - self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) + self:E( { Type, Name, Weight, ReportRadius, NearRadius } ) return self end @@ -393,7 +393,7 @@ do -- CARGO_REPRESENTABLE -- @param #number Speed -- @return #CARGO_REPRESENTABLE function CARGO_REPRESENTABLE:RouteTo( ToPointVec2, Speed ) - self:F2( ToPointVec2 ) + self:E2( ToPointVec2 ) local Points = {} @@ -429,7 +429,7 @@ end -- CARGO_REPRESENTABLE -- @return #CARGO_REPORTABLE function CARGO_REPORTABLE:New( CargoObject, Type, Name, Weight, ReportRadius ) local self = BASE:Inherit( self, CARGO:New( Type, Name, Weight ) ) -- #CARGO_REPORTABLE - self:F( { Type, Name, Weight, ReportRadius } ) + self:E( { Type, Name, Weight, ReportRadius } ) self.ReportRadius = ReportRadius or 1000 self.CargoObject = CargoObject @@ -442,7 +442,7 @@ end -- CARGO_REPRESENTABLE -- @param Core.Point#POINT_VEC2 PointVec2 -- @return #boolean function CARGO_REPORTABLE:IsInRadius( PointVec2 ) - self:F( { PointVec2 } ) + self:E( { PointVec2 } ) local Distance = 0 if self:IsLoaded() then @@ -513,7 +513,7 @@ do -- CARGO_UNIT -- @return #CARGO_UNIT function CARGO_UNIT:New( CargoUnit, Type, Name, Weight, NearRadius ) local self = BASE:Inherit( self, CARGO_REPRESENTABLE:New( CargoUnit, Type, Name, Weight, NearRadius ) ) -- #CARGO_UNIT - self:F( { Type, Name, Weight, NearRadius } ) + self:E( { Type, Name, Weight, NearRadius } ) self:T( CargoUnit ) self.CargoObject = CargoUnit @@ -542,7 +542,7 @@ end -- @param #string To -- @param Core.Point#POINT_VEC2 ToPointVec2 function CARGO_UNIT:onenterUnBoarding( From, Event, To, ToPointVec2, NearRadius ) - self:F() + self:E() NearRadius = NearRadius or 25 @@ -599,9 +599,9 @@ end -- @param #string To -- @param Core.Point#POINT_VEC2 ToPointVec2 function CARGO_UNIT:onleaveUnBoarding( From, Event, To, ToPointVec2, NearRadius ) - self:F( { ToPointVec2, From, Event, To } ) + self:E( { From, Event, To, ToPointVec2, NearRadius } ) - NearRadius = NearRadius or 25 + local NearRadius = NearRadius or 25 local Angle = 180 local Speed = 10 @@ -625,9 +625,9 @@ end -- @param #string To -- @param Core.Point#POINT_VEC2 ToPointVec2 function CARGO_UNIT:onafterUnBoarding( From, Event, To, ToPointVec2, NearRadius ) - self:F( { ToPointVec2, From, Event, To } ) + self:E( { ToPointVec2, From, Event, To } ) - NearRadius = NearRadius or 25 + local NearRadius = NearRadius or 25 self.CargoInAir = self.CargoObject:InAir() @@ -652,7 +652,7 @@ end -- @param #string To -- @param Core.Point#POINT_VEC2 function CARGO_UNIT:onenterUnLoaded( From, Event, To, ToPointVec2 ) - self:F( { ToPointVec2, From, Event, To } ) + self:E( { ToPointVec2, From, Event, To } ) local Angle = 180 local Speed = 10 @@ -687,9 +687,9 @@ end -- @param #string From -- @param #string To function CARGO_UNIT:onafterBoard( From, Event, To, CargoCarrier, NearRadius, ... ) - self:F() + self:E() - NearRadius = NearRadius or 25 + local NearRadius = NearRadius or 25 self.CargoInAir = self.CargoObject:InAir() @@ -735,9 +735,9 @@ end -- @param #string To -- @param Wrapper.Unit#UNIT CargoCarrier function CARGO_UNIT:onleaveBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) - self:F( { From, Event, To, CargoCarrier.UnitName, NearRadius } ) + self:E( { From, Event, To, CargoCarrier.UnitName, NearRadius } ) - NearRadius = NearRadius or 25 + local NearRadius = NearRadius or 25 if self:IsNear( CargoCarrier:GetPointVec2(), NearRadius ) then self:__Load( 1, CargoCarrier, ... ) @@ -756,11 +756,11 @@ end -- @param Wrapper.Unit#UNIT CargoCarrier -- @param #number NearRadius function CARGO_UNIT:onafterBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) - self:F( { From, Event, To, CargoCarrier.UnitName, NearRadius } ) + self:E( { From, Event, To, CargoCarrier.UnitName, NearRadius } ) self:__Boarding( -1, CargoCarrier, NearRadius, ... ) - self:__Board( -15, CargoCarrier, NearRadius, ... ) + self:__Board( -10, CargoCarrier, NearRadius, ... ) end @@ -772,13 +772,13 @@ end -- @param #string To -- @param Wrapper.Unit#UNIT CargoCarrier function CARGO_UNIT:onenterBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) - self:F( { From, Event, To, CargoCarrier.UnitName, NearRadius } ) + self:E( { From, Event, To, CargoCarrier.UnitName, NearRadius } ) local Speed = 90 local Angle = 180 local Distance = 5 - NearRadius = NearRadius or 25 + local NearRadius = NearRadius or 25 if From == "UnLoaded" or From == "Boarding" then @@ -793,7 +793,7 @@ end -- @param #string To -- @param Wrapper.Unit#UNIT CargoCarrier function CARGO_UNIT:onenterLoaded( From, Event, To, CargoCarrier ) - self:F() + self:E( { From, Event, To, CargoCarrier } ) self.CargoCarrier = CargoCarrier @@ -827,7 +827,7 @@ do -- CARGO_PACKAGE -- @return #CARGO_PACKAGE function CARGO_PACKAGE:New( CargoCarrier, Type, Name, Weight, ReportRadius, NearRadius ) local self = BASE:Inherit( self, CARGO_REPRESENTABLE:New( CargoCarrier, Type, Name, Weight, ReportRadius, NearRadius ) ) -- #CARGO_PACKAGE - self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) + self:E( { Type, Name, Weight, ReportRadius, NearRadius } ) self:T( CargoCarrier ) self.CargoCarrier = CargoCarrier @@ -845,7 +845,7 @@ end -- @param #number BoardDistance -- @param #number Angle function CARGO_PACKAGE:onafterOnBoard( From, Event, To, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) - self:F() + self:E() self.CargoInAir = self.CargoCarrier:InAir() @@ -878,7 +878,7 @@ end -- @param Wrapper.Unit#UNIT CargoCarrier -- @return #boolean function CARGO_PACKAGE:IsNear( CargoCarrier ) - self:F() + self:E() local CargoCarrierPoint = CargoCarrier:GetPointVec2() @@ -899,7 +899,7 @@ end -- @param #string To -- @param Wrapper.Unit#UNIT CargoCarrier function CARGO_PACKAGE:onafterOnBoarded( From, Event, To, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) - self:F() + self:E() if self:IsNear( CargoCarrier ) then self:__Load( 1, CargoCarrier, Speed, LoadDistance, Angle ) @@ -919,7 +919,7 @@ end -- @param #number Radius -- @param #number Angle function CARGO_PACKAGE:onafterUnBoard( From, Event, To, CargoCarrier, Speed, UnLoadDistance, UnBoardDistance, Radius, Angle ) - self:F() + self:E() self.CargoInAir = self.CargoCarrier:InAir() @@ -957,7 +957,7 @@ end -- @param #string To -- @param Wrapper.Unit#UNIT CargoCarrier function CARGO_PACKAGE:onafterUnBoarded( From, Event, To, CargoCarrier, Speed ) - self:F() + self:E() if self:IsNear( CargoCarrier ) then self:__UnLoad( 1, CargoCarrier, Speed ) @@ -976,7 +976,7 @@ end -- @param #number LoadDistance -- @param #number Angle function CARGO_PACKAGE:onafterLoad( From, Event, To, CargoCarrier, Speed, LoadDistance, Angle ) - self:F() + self:E() self.CargoCarrier = CargoCarrier @@ -1002,7 +1002,7 @@ end -- @param #number Distance -- @param #number Angle function CARGO_PACKAGE:onafterUnLoad( From, Event, To, CargoCarrier, Speed, Distance, Angle ) - self:F() + self:E() local StartPointVec2 = self.CargoCarrier:GetPointVec2() local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. @@ -1049,7 +1049,7 @@ do -- CARGO_GROUP -- @return #CARGO_GROUP function CARGO_GROUP:New( CargoGroup, Type, Name, ReportRadius ) local self = BASE:Inherit( self, CARGO_REPORTABLE:New( CargoGroup, Type, Name, 0, ReportRadius ) ) -- #CARGO_GROUP - self:F( { Type, Name, ReportRadius } ) + self:E( { Type, Name, ReportRadius } ) self.CargoSet = SET_CARGO:New() @@ -1082,9 +1082,9 @@ end -- @param #string From -- @param #string To function CARGO_GROUP:onenterBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) - self:F( { CargoCarrier.UnitName, From, Event, To } ) + self:E( { CargoCarrier.UnitName, From, Event, To } ) - NearRadius = NearRadius or 25 + local NearRadius = NearRadius or 25 if From == "UnLoaded" then @@ -1107,7 +1107,7 @@ end -- @param #string From -- @param #string To function CARGO_GROUP:onenterLoaded( From, Event, To, CargoCarrier, ... ) - self:F( { CargoCarrier.UnitName, From, Event, To } ) + self:E( { CargoCarrier.UnitName, From, Event, To } ) if From == "UnLoaded" then -- For each Cargo object within the CARGO_GROUP, load each cargo to the CargoCarrier. @@ -1128,9 +1128,9 @@ end -- @param #string From -- @param #string To function CARGO_GROUP:onleaveBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) - self:F( { CargoCarrier.UnitName, From, Event, To } ) + self:E( { CargoCarrier.UnitName, From, Event, To } ) - NearRadius = NearRadius or 25 + local NearRadius = NearRadius or 25 local Boarded = true @@ -1159,9 +1159,9 @@ end -- @param #string From -- @param #string To function CARGO_GROUP:onenterUnBoarding( From, Event, To, ToPointVec2, NearRadius, ... ) - self:F({From, Event, To, ToPointVec2, NearRadius}) + self:E( {From, Event, To, ToPointVec2, NearRadius } ) - NearRadius = NearRadius or 25 + local NearRadius = NearRadius or 25 local Timer = 1 @@ -1187,9 +1187,9 @@ end -- @param #string From -- @param #string To function CARGO_GROUP:onleaveUnBoarding( From, Event, To, ToPointVec2, NearRadius, ... ) - self:F( { From, Event, To, ToPointVec2, NearRadius } ) + self:E( { From, Event, To, ToPointVec2, NearRadius } ) - NearRadius = NearRadius or 25 + local NearRadius = NearRadius or 25 local Angle = 180 local Speed = 10 @@ -1224,9 +1224,9 @@ end -- @param #string From -- @param #string To function CARGO_GROUP:onafterUnBoarding( From, Event, To, ToPointVec2, NearRadius, ... ) - self:F( { From, Event, To, ToPointVec2, NearRadius } ) + self:E( { From, Event, To, ToPointVec2, NearRadius } ) - NearRadius = NearRadius or 25 + local NearRadius = NearRadius or 25 self:__UnLoad( 1, ToPointVec2, ... ) end @@ -1240,7 +1240,7 @@ end -- @param #string From -- @param #string To function CARGO_GROUP:onenterUnLoaded( From, Event, To, ToPointVec2, ... ) - self:F( { From, Event, To, ToPointVec2 } ) + self:E( { From, Event, To, ToPointVec2 } ) if From == "Loaded" then diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index f37e590df..f9da8ec67 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -890,7 +890,7 @@ function EVENT:onEvent( Event ) for EventClass, EventData in pairs( self.Events[Event.id][EventPriority] ) do if Event.IniObjectCategory ~= Object.Category.STATIC then - self:E( { "Evaluating: ", EventClass:GetClassNameAndID() } ) + --self:E( { "Evaluating: ", EventClass:GetClassNameAndID() } ) end Event.IniGroup = GROUP:FindByName( Event.IniDCSGroupName ) diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index 751768130..73d7a84fa 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -27,6 +27,18 @@ function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefi local self = BASE:Inherit( self, FSM:New() ) -- Core.Fsm#FSM + self:T( { MissionName, MissionPriority, MissionBriefing, MissionCoalition } ) + + self.CommandCenter = CommandCenter + CommandCenter:AddMission( self ) + + self.Name = MissionName + self.MissionPriority = MissionPriority + self.MissionBriefing = MissionBriefing + self.MissionCoalition = MissionCoalition + + self.Tasks = {} + self:SetStartState( "IDLE" ) self:AddTransition( "IDLE", "Start", "ENGAGED" ) @@ -208,17 +220,6 @@ function MISSION:New( CommandCenter, MissionName, MissionPriority, MissionBriefi -- @param #MISSION self -- @param #number Delay The delay in seconds. - self:T( { MissionName, MissionPriority, MissionBriefing, MissionCoalition } ) - - self.CommandCenter = CommandCenter - CommandCenter:AddMission( self ) - - self.Name = MissionName - self.MissionPriority = MissionPriority - self.MissionBriefing = MissionBriefing - self.MissionCoalition = MissionCoalition - - self.Tasks = {} -- Private implementations @@ -257,7 +258,7 @@ end -- @param #MISSION self -- @return #MISSION self function MISSION:GetName() - return self.Name + return string.format( "Mission %s (%s)", self.Name, self.MissionPriority ) end --- Add a Unit to join the Mission. diff --git a/Moose Development/Moose/Tasking/Task_CARGO.lua b/Moose Development/Moose/Tasking/Task_CARGO.lua index b3c7b64a9..d80324af6 100644 --- a/Moose Development/Moose/Tasking/Task_CARGO.lua +++ b/Moose Development/Moose/Tasking/Task_CARGO.lua @@ -211,7 +211,7 @@ do -- TASK_CARGO --- -- @param #FSM_PROCESS self -- @param Wrapper.Unit#UNIT TaskUnit - -- @param Tasking.Task_Cargo#TASK_CARGO Task + -- @param Tasking.Task_CARGO#TASK_CARGO Task function Fsm:onenterWaitingForCommand( TaskUnit, Task ) self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) @@ -472,31 +472,41 @@ do -- TASK_CARGO -- @param #FSM_PROCESS self -- @param Wrapper.Unit#UNIT TaskUnit -- @param Tasking.Task_Cargo#TASK_CARGO Task + -- @param From + -- @param Event + -- @param To + -- @param Cargo + -- @param Core.Zone#ZONE_BASE DeployZone function Fsm:onafterPrepareUnBoarding( TaskUnit, Task, From, Event, To, Cargo, DeployZone ) - self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) + self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID(), From, Event, To, Cargo, DeployZone } ) self.Cargo = Cargo - self.DeployZone = DeployZone - self:__UnBoard( -0.1 ) + self.DeployZone = DeployZone -- Core.Zone#ZONE_BASE + self:__UnBoard( -0.1, Cargo, DeployZone ) end --- -- @param #FSM_PROCESS self -- @param Wrapper.Unit#UNIT TaskUnit -- @param Tasking.Task_Cargo#TASK_CARGO Task - function Fsm:onafterUnBoard( TaskUnit, Task ) - self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) + -- @param From + -- @param Event + -- @param To + -- @param Cargo + -- @param Core.Zone#ZONE_BASE DeployZone + function Fsm:onafterUnBoard( TaskUnit, Task, From, Event, To, Cargo, DeployZone ) + self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID(), From, Event, To, Cargo, DeployZone } ) function self.Cargo:OnEnterUnLoaded( From, Event, To, DeployZone, TaskProcess ) - self:E({From, Event, To, TaskUnit, TaskProcess }) + self:E({From, Event, To, DeployZone, TaskProcess }) TaskProcess:__UnBoarded( -0.1 ) end self.Cargo:MessageToGroup( "UnBoarding ...", TaskUnit:GetGroup() ) - self.Cargo:UnBoard( self.DeployZone:GetPointVec2(), 20, self ) + self.Cargo:UnBoard( DeployZone:GetPointVec2(), 400, self ) end From d2d59a7ba337d617f72a7e52f78f7ea59fd56d4a Mon Sep 17 00:00:00 2001 From: FlightControl Date: Sat, 6 May 2017 23:06:21 +0200 Subject: [PATCH 35/39] Fixes cargo --- Moose Development/Moose/Core/Cargo.lua | 92 ++++++++++++++------------ 1 file changed, 48 insertions(+), 44 deletions(-) diff --git a/Moose Development/Moose/Core/Cargo.lua b/Moose Development/Moose/Core/Cargo.lua index f5b47b085..65414e1f8 100644 --- a/Moose Development/Moose/Core/Cargo.lua +++ b/Moose Development/Moose/Core/Cargo.lua @@ -234,7 +234,7 @@ do -- CARGO function CARGO:New( Type, Name, Weight ) --R2.1 local self = BASE:Inherit( self, FSM:New() ) -- #CARGO - self:E( { Type, Name, Weight } ) + self:F( { Type, Name, Weight } ) self:SetStartState( "UnLoaded" ) self:AddTransition( { "UnLoaded", "Boarding" }, "Board", "Boarding" ) @@ -299,7 +299,7 @@ end -- @param #CARGO self -- @return #CARGO function CARGO:Spawn( PointVec2 ) - self:E() + self:F() end @@ -310,7 +310,7 @@ end -- @param Core.Zone#ZONE_BASE Zone -- @return #boolean **true** if cargo is in the Zone, **false** if cargo is not in the Zone. function CARGO:IsInZone( Zone ) - self:E( { Zone } ) + self:F( { Zone } ) if self:IsLoaded() then return Zone:IsPointVec2InZone( self.CargoCarrier:GetPointVec2() ) @@ -329,7 +329,7 @@ end -- @param #number NearRadius The radius when the cargo will board the Carrier (to avoid collision). -- @return #boolean function CARGO:IsNear( PointVec2, NearRadius ) - self:E( { PointVec2 } ) + self:F( { PointVec2, NearRadius } ) local Distance = PointVec2:DistanceFromPointVec2( self.CargoObject:GetPointVec2() ) self:T( Distance ) @@ -382,7 +382,7 @@ do -- CARGO_REPRESENTABLE -- @return #CARGO_REPRESENTABLE function CARGO_REPRESENTABLE:New( CargoObject, Type, Name, Weight, ReportRadius, NearRadius ) local self = BASE:Inherit( self, CARGO:New( Type, Name, Weight, ReportRadius, NearRadius ) ) -- #CARGO_REPRESENTABLE - self:E( { Type, Name, Weight, ReportRadius, NearRadius } ) + self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) return self end @@ -393,7 +393,7 @@ do -- CARGO_REPRESENTABLE -- @param #number Speed -- @return #CARGO_REPRESENTABLE function CARGO_REPRESENTABLE:RouteTo( ToPointVec2, Speed ) - self:E2( ToPointVec2 ) + self:F2( ToPointVec2 ) local Points = {} @@ -429,7 +429,7 @@ end -- CARGO_REPRESENTABLE -- @return #CARGO_REPORTABLE function CARGO_REPORTABLE:New( CargoObject, Type, Name, Weight, ReportRadius ) local self = BASE:Inherit( self, CARGO:New( Type, Name, Weight ) ) -- #CARGO_REPORTABLE - self:E( { Type, Name, Weight, ReportRadius } ) + self:F( { Type, Name, Weight, ReportRadius } ) self.ReportRadius = ReportRadius or 1000 self.CargoObject = CargoObject @@ -442,7 +442,7 @@ end -- CARGO_REPRESENTABLE -- @param Core.Point#POINT_VEC2 PointVec2 -- @return #boolean function CARGO_REPORTABLE:IsInRadius( PointVec2 ) - self:E( { PointVec2 } ) + self:F( { PointVec2 } ) local Distance = 0 if self:IsLoaded() then @@ -513,7 +513,7 @@ do -- CARGO_UNIT -- @return #CARGO_UNIT function CARGO_UNIT:New( CargoUnit, Type, Name, Weight, NearRadius ) local self = BASE:Inherit( self, CARGO_REPRESENTABLE:New( CargoUnit, Type, Name, Weight, NearRadius ) ) -- #CARGO_UNIT - self:E( { Type, Name, Weight, NearRadius } ) + self:F( { Type, Name, Weight, NearRadius } ) self:T( CargoUnit ) self.CargoObject = CargoUnit @@ -542,7 +542,7 @@ end -- @param #string To -- @param Core.Point#POINT_VEC2 ToPointVec2 function CARGO_UNIT:onenterUnBoarding( From, Event, To, ToPointVec2, NearRadius ) - self:E() + self:F( { From, Event, To, ToPointVec2, NearRadius } ) NearRadius = NearRadius or 25 @@ -575,7 +575,7 @@ function CARGO_UNIT:onenterUnBoarding( From, Event, To, ToPointVec2, NearRadius -- Respawn the group... if self.CargoObject then self.CargoObject:ReSpawn( CargoDeployPointVec2:GetVec3(), CargoDeployHeading ) - self:E( { "CargoUnits:", self.CargoObject:GetGroup():GetName() } ) + self:F( { "CargoUnits:", self.CargoObject:GetGroup():GetName() } ) self.CargoCarrier = nil local Points = {} @@ -586,7 +586,8 @@ function CARGO_UNIT:onenterUnBoarding( From, Event, To, ToPointVec2, NearRadius local TaskRoute = self.CargoObject:TaskRoute( Points ) self.CargoObject:SetTask( TaskRoute, 1 ) - self:__UnBoarding( -1, ToPointVec2, NearRadius ) + + self:__UnBoarding( 1, ToPointVec2, NearRadius ) end end @@ -599,9 +600,9 @@ end -- @param #string To -- @param Core.Point#POINT_VEC2 ToPointVec2 function CARGO_UNIT:onleaveUnBoarding( From, Event, To, ToPointVec2, NearRadius ) - self:E( { From, Event, To, ToPointVec2, NearRadius } ) + self:F( { From, Event, To, ToPointVec2, NearRadius } ) - local NearRadius = NearRadius or 25 + NearRadius = NearRadius or 25 local Angle = 180 local Speed = 10 @@ -611,6 +612,7 @@ function CARGO_UNIT:onleaveUnBoarding( From, Event, To, ToPointVec2, NearRadius if self:IsNear( ToPointVec2, NearRadius ) then return true else + self:__UnBoarding( 1, ToPointVec2, NearRadius ) end return false @@ -625,9 +627,9 @@ end -- @param #string To -- @param Core.Point#POINT_VEC2 ToPointVec2 function CARGO_UNIT:onafterUnBoarding( From, Event, To, ToPointVec2, NearRadius ) - self:E( { ToPointVec2, From, Event, To } ) + self:F( { From, Event, To, ToPointVec2, NearRadius } ) - local NearRadius = NearRadius or 25 + NearRadius = NearRadius or 25 self.CargoInAir = self.CargoObject:InAir() @@ -639,7 +641,7 @@ function CARGO_UNIT:onafterUnBoarding( From, Event, To, ToPointVec2, NearRadius end - self:__UnLoad( 1, ToPointVec2 ) + self:__UnLoad( 1, ToPointVec2, NearRadius ) end @@ -652,7 +654,7 @@ end -- @param #string To -- @param Core.Point#POINT_VEC2 function CARGO_UNIT:onenterUnLoaded( From, Event, To, ToPointVec2 ) - self:E( { ToPointVec2, From, Event, To } ) + self:F( { ToPointVec2, From, Event, To } ) local Angle = 180 local Speed = 10 @@ -687,7 +689,7 @@ end -- @param #string From -- @param #string To function CARGO_UNIT:onafterBoard( From, Event, To, CargoCarrier, NearRadius, ... ) - self:E() + self:F( { From, Event, To, CargoCarrier, NearRadius } ) local NearRadius = NearRadius or 25 @@ -735,7 +737,7 @@ end -- @param #string To -- @param Wrapper.Unit#UNIT CargoCarrier function CARGO_UNIT:onleaveBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) - self:E( { From, Event, To, CargoCarrier.UnitName, NearRadius } ) + self:F( { From, Event, To, CargoCarrier.UnitName, NearRadius } ) local NearRadius = NearRadius or 25 @@ -756,7 +758,7 @@ end -- @param Wrapper.Unit#UNIT CargoCarrier -- @param #number NearRadius function CARGO_UNIT:onafterBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) - self:E( { From, Event, To, CargoCarrier.UnitName, NearRadius } ) + self:F( { From, Event, To, CargoCarrier.UnitName, NearRadius } ) self:__Boarding( -1, CargoCarrier, NearRadius, ... ) @@ -772,7 +774,7 @@ end -- @param #string To -- @param Wrapper.Unit#UNIT CargoCarrier function CARGO_UNIT:onenterBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) - self:E( { From, Event, To, CargoCarrier.UnitName, NearRadius } ) + self:F( { From, Event, To, CargoCarrier.UnitName, NearRadius } ) local Speed = 90 local Angle = 180 @@ -793,7 +795,7 @@ end -- @param #string To -- @param Wrapper.Unit#UNIT CargoCarrier function CARGO_UNIT:onenterLoaded( From, Event, To, CargoCarrier ) - self:E( { From, Event, To, CargoCarrier } ) + self:F( { From, Event, To, CargoCarrier } ) self.CargoCarrier = CargoCarrier @@ -827,7 +829,7 @@ do -- CARGO_PACKAGE -- @return #CARGO_PACKAGE function CARGO_PACKAGE:New( CargoCarrier, Type, Name, Weight, ReportRadius, NearRadius ) local self = BASE:Inherit( self, CARGO_REPRESENTABLE:New( CargoCarrier, Type, Name, Weight, ReportRadius, NearRadius ) ) -- #CARGO_PACKAGE - self:E( { Type, Name, Weight, ReportRadius, NearRadius } ) + self:F( { Type, Name, Weight, ReportRadius, NearRadius } ) self:T( CargoCarrier ) self.CargoCarrier = CargoCarrier @@ -845,7 +847,7 @@ end -- @param #number BoardDistance -- @param #number Angle function CARGO_PACKAGE:onafterOnBoard( From, Event, To, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) - self:E() + self:F() self.CargoInAir = self.CargoCarrier:InAir() @@ -878,7 +880,7 @@ end -- @param Wrapper.Unit#UNIT CargoCarrier -- @return #boolean function CARGO_PACKAGE:IsNear( CargoCarrier ) - self:E() + self:F() local CargoCarrierPoint = CargoCarrier:GetPointVec2() @@ -899,7 +901,7 @@ end -- @param #string To -- @param Wrapper.Unit#UNIT CargoCarrier function CARGO_PACKAGE:onafterOnBoarded( From, Event, To, CargoCarrier, Speed, BoardDistance, LoadDistance, Angle ) - self:E() + self:F() if self:IsNear( CargoCarrier ) then self:__Load( 1, CargoCarrier, Speed, LoadDistance, Angle ) @@ -919,7 +921,7 @@ end -- @param #number Radius -- @param #number Angle function CARGO_PACKAGE:onafterUnBoard( From, Event, To, CargoCarrier, Speed, UnLoadDistance, UnBoardDistance, Radius, Angle ) - self:E() + self:F() self.CargoInAir = self.CargoCarrier:InAir() @@ -957,7 +959,7 @@ end -- @param #string To -- @param Wrapper.Unit#UNIT CargoCarrier function CARGO_PACKAGE:onafterUnBoarded( From, Event, To, CargoCarrier, Speed ) - self:E() + self:F() if self:IsNear( CargoCarrier ) then self:__UnLoad( 1, CargoCarrier, Speed ) @@ -976,7 +978,7 @@ end -- @param #number LoadDistance -- @param #number Angle function CARGO_PACKAGE:onafterLoad( From, Event, To, CargoCarrier, Speed, LoadDistance, Angle ) - self:E() + self:F() self.CargoCarrier = CargoCarrier @@ -1002,7 +1004,7 @@ end -- @param #number Distance -- @param #number Angle function CARGO_PACKAGE:onafterUnLoad( From, Event, To, CargoCarrier, Speed, Distance, Angle ) - self:E() + self:F() local StartPointVec2 = self.CargoCarrier:GetPointVec2() local CargoCarrierHeading = self.CargoCarrier:GetHeading() -- Get Heading of object in degrees. @@ -1049,7 +1051,7 @@ do -- CARGO_GROUP -- @return #CARGO_GROUP function CARGO_GROUP:New( CargoGroup, Type, Name, ReportRadius ) local self = BASE:Inherit( self, CARGO_REPORTABLE:New( CargoGroup, Type, Name, 0, ReportRadius ) ) -- #CARGO_GROUP - self:E( { Type, Name, ReportRadius } ) + self:F( { Type, Name, ReportRadius } ) self.CargoSet = SET_CARGO:New() @@ -1082,7 +1084,7 @@ end -- @param #string From -- @param #string To function CARGO_GROUP:onenterBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) - self:E( { CargoCarrier.UnitName, From, Event, To } ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) local NearRadius = NearRadius or 25 @@ -1107,7 +1109,7 @@ end -- @param #string From -- @param #string To function CARGO_GROUP:onenterLoaded( From, Event, To, CargoCarrier, ... ) - self:E( { CargoCarrier.UnitName, From, Event, To } ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) if From == "UnLoaded" then -- For each Cargo object within the CARGO_GROUP, load each cargo to the CargoCarrier. @@ -1128,7 +1130,7 @@ end -- @param #string From -- @param #string To function CARGO_GROUP:onleaveBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) - self:E( { CargoCarrier.UnitName, From, Event, To } ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) local NearRadius = NearRadius or 25 @@ -1159,9 +1161,9 @@ end -- @param #string From -- @param #string To function CARGO_GROUP:onenterUnBoarding( From, Event, To, ToPointVec2, NearRadius, ... ) - self:E( {From, Event, To, ToPointVec2, NearRadius } ) + self:F( {From, Event, To, ToPointVec2, NearRadius } ) - local NearRadius = NearRadius or 25 + NearRadius = NearRadius or 25 local Timer = 1 @@ -1169,12 +1171,14 @@ function CARGO_GROUP:onenterUnBoarding( From, Event, To, ToPointVec2, NearRadius -- For each Cargo object within the CARGO_GROUP, route each object to the CargoLoadPointVec2 self.CargoSet:ForEach( - function( Cargo ) + function( Cargo, NearRadius ) + Cargo:__UnBoard( Timer, ToPointVec2, NearRadius ) Timer = Timer + 10 - end + end, { NearRadius } ) + self:__UnBoarding( 1, ToPointVec2, NearRadius, ... ) end @@ -1187,9 +1191,9 @@ end -- @param #string From -- @param #string To function CARGO_GROUP:onleaveUnBoarding( From, Event, To, ToPointVec2, NearRadius, ... ) - self:E( { From, Event, To, ToPointVec2, NearRadius } ) + self:F( { From, Event, To, ToPointVec2, NearRadius } ) - local NearRadius = NearRadius or 25 + --local NearRadius = NearRadius or 25 local Angle = 180 local Speed = 10 @@ -1224,9 +1228,9 @@ end -- @param #string From -- @param #string To function CARGO_GROUP:onafterUnBoarding( From, Event, To, ToPointVec2, NearRadius, ... ) - self:E( { From, Event, To, ToPointVec2, NearRadius } ) + self:F( { From, Event, To, ToPointVec2, NearRadius } ) - local NearRadius = NearRadius or 25 + --local NearRadius = NearRadius or 25 self:__UnLoad( 1, ToPointVec2, ... ) end @@ -1240,7 +1244,7 @@ end -- @param #string From -- @param #string To function CARGO_GROUP:onenterUnLoaded( From, Event, To, ToPointVec2, ... ) - self:E( { From, Event, To, ToPointVec2 } ) + self:F( { From, Event, To, ToPointVec2 } ) if From == "Loaded" then From 2fadd949a6f841e7bf5bd2aea781d75f023bb894 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Sun, 7 May 2017 15:37:27 +0200 Subject: [PATCH 36/39] Fixes --- .../Moose/Actions/Act_Assign.lua | 2 - Moose Development/Moose/Core/Cargo.lua | 8 ++ Moose Development/Moose/Core/Set.lua | 5 + .../Moose/Tasking/CommandCenter.lua | 44 +++++-- Moose Development/Moose/Tasking/Mission.lua | 117 +++++++++++++++++- Moose Development/Moose/Tasking/Task.lua | 50 +++++--- Moose Development/Moose/Tasking/Task_A2G.lua | 71 ++++++++--- .../Moose/Tasking/Task_CARGO.lua | 36 ++++-- .../Moose/Wrapper/Positionable.lua | 13 +- 9 files changed, 280 insertions(+), 66 deletions(-) diff --git a/Moose Development/Moose/Actions/Act_Assign.lua b/Moose Development/Moose/Actions/Act_Assign.lua index 7d45ad21a..e04139698 100644 --- a/Moose Development/Moose/Actions/Act_Assign.lua +++ b/Moose Development/Moose/Actions/Act_Assign.lua @@ -173,8 +173,6 @@ do -- ACT_ASSIGN_ACCEPT local ProcessGroup = ProcessUnit:GetGroup() - self:Message( "You are assigned to the task " .. self.Task:GetName() ) - self.Task:Assign( ProcessUnit, ProcessUnit:GetPlayerName() ) end diff --git a/Moose Development/Moose/Core/Cargo.lua b/Moose Development/Moose/Core/Cargo.lua index 65414e1f8..f984fe542 100644 --- a/Moose Development/Moose/Core/Cargo.lua +++ b/Moose Development/Moose/Core/Cargo.lua @@ -280,6 +280,14 @@ function CARGO:GetType() return self.Type end +--- Get the current coordinates of the Cargo. +-- @param #CARGO self +-- @return Core.Point#COORDINATE The coordinates of the Cargo. +function CARGO:GetCoordinate() + return self.CargoObject:GetCoordinate() +end + + --- Check if cargo is loaded. -- @param #CARGO self -- @return #boolean true if loaded diff --git a/Moose Development/Moose/Core/Set.lua b/Moose Development/Moose/Core/Set.lua index aaa06e3a8..6ca7f6d5d 100644 --- a/Moose Development/Moose/Core/Set.lua +++ b/Moose Development/Moose/Core/Set.lua @@ -1336,6 +1336,11 @@ SET_UNIT = { } +--- Get the first unit from the set. +-- @function [parent=#SET_UNIT] GetFirst +-- @param #SET_UNIT self +-- @return Wrapper.Unit#UNIT The UNIT object. + --- Creates a new SET_UNIT object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. -- @param #SET_UNIT self -- @return #SET_UNIT diff --git a/Moose Development/Moose/Tasking/CommandCenter.lua b/Moose Development/Moose/Tasking/CommandCenter.lua index 248f5fd00..93fd01162 100644 --- a/Moose Development/Moose/Tasking/CommandCenter.lua +++ b/Moose Development/Moose/Tasking/CommandCenter.lua @@ -112,9 +112,9 @@ function COMMANDCENTER:New( CommandCenterPositionable, CommandCenterName ) if EventData.IniObjectCategory == 1 then local EventGroup = GROUP:Find( EventData.IniDCSGroup ) if EventGroup and self:HasGroup( EventGroup ) then - local MenuReporting = MENU_GROUP:New( EventGroup, "Reporting", self.CommandCenterMenu ) - local MenuMissionsSummary = MENU_GROUP_COMMAND:New( EventGroup, "Missions Summary Report", MenuReporting, self.ReportSummary, self, EventGroup ) - local MenuMissionsDetails = MENU_GROUP_COMMAND:New( EventGroup, "Missions Details Report", MenuReporting, self.ReportDetails, self, EventGroup ) + local MenuReporting = MENU_GROUP:New( EventGroup, "Missions Reports", self.CommandCenterMenu ) + local MenuMissionsSummary = MENU_GROUP_COMMAND:New( EventGroup, "Missions Status Report", MenuReporting, self.ReportMissionsStatus, self, EventGroup ) + local MenuMissionsDetails = MENU_GROUP_COMMAND:New( EventGroup, "Missions Players Report", MenuReporting, self.ReportMissionsPlayers, self, EventGroup ) self:ReportSummary( EventGroup ) end local PlayerUnit = EventData.IniUnit @@ -307,11 +307,9 @@ end -- @param #string Message -- @param Wrapper.Group#GROUP TaskGroup -- @param #sring Name (optional) The name of the Group used as a prefix for the message to the Group. If not provided, there will be nothing shown. -function COMMANDCENTER:MessageToGroup( Message, TaskGroup, Name ) +function COMMANDCENTER:MessageToGroup( Message, TaskGroup ) - local Prefix = Name and "@ " .. Name .. ": " or "@ " .. TaskGroup:GetCallsign() .. ": " - Message = Prefix .. Message - self:GetPositionable():MessageToGroup( Message , 20, TaskGroup, self:GetName() ) + self:GetPositionable():MessageToGroup( Message , 15, TaskGroup, self:GetName() ) end @@ -321,7 +319,8 @@ function COMMANDCENTER:MessageToCoalition( Message ) local CCCoalition = self:GetPositionable():GetCoalition() --TODO: Fix coalition bug! - self:GetPositionable():MessageToCoalition( Message, 20, CCCoalition, self:GetName() ) + + self:GetPositionable():MessageToCoalition( Message, 15, CCCoalition ) end @@ -329,18 +328,37 @@ end --- Report the status of all MISSIONs to a GROUP. -- Each Mission is listed, with an indication how many Tasks are still to be completed. -- @param #COMMANDCENTER self -function COMMANDCENTER:ReportSummary( ReportGroup ) +function COMMANDCENTER:ReportMissionsStatus( ReportGroup ) + self:E( ReportGroup ) + + local Report = REPORT:New() + + Report:Add( "Status report of all missions." ) + + for MissionID, Mission in pairs( self.Missions ) do + local Mission = Mission -- Tasking.Mission#MISSION + Report:Add( " - " .. Mission:ReportStatus() ) + end + + self:MessageToGroup( Report:Text(), ReportGroup ) +end + +--- Report the players of all MISSIONs to a GROUP. +-- Each Mission is listed, with an indication how many Tasks are still to be completed. +-- @param #COMMANDCENTER self +function COMMANDCENTER:ReportMissionsPlayers( ReportGroup ) self:E( ReportGroup ) local Report = REPORT:New() + Report:Add( "Players active in all missions." ) + for MissionID, Mission in pairs( self.Missions ) do local Mission = Mission -- Tasking.Mission#MISSION - Report:Add( " - " .. Mission:ReportOverview() ) + Report:Add( " - " .. Mission:ReportPlayers() ) end - self:GetPositionable():MessageToGroup( Report:Text(), 30, ReportGroup ) - + self:MessageToGroup( Report:Text(), ReportGroup ) end --- Report the status of a Task to a Group. @@ -356,6 +374,6 @@ function COMMANDCENTER:ReportDetails( ReportGroup, Task ) Report:Add( " - " .. Mission:ReportDetails() ) end - self:GetPositionable():MessageToGroup( Report:Text(), 30, ReportGroup ) + self:MessageToGroup( Report:Text(), ReportGroup ) end diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index 73d7a84fa..47563623e 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -258,7 +258,7 @@ end -- @param #MISSION self -- @return #MISSION self function MISSION:GetName() - return string.format( "Mission %s (%s)", self.Name, self.MissionPriority ) + return string.format( 'Mission "%s (%s)"', self.Name, self.MissionPriority ) end --- Add a Unit to join the Mission. @@ -606,6 +606,117 @@ function MISSION:GetTasksRemaining() return TasksRemaining end +--- @param #MISSION self +-- @return #number +function MISSION:GetTaskTypes() + -- Determine how many tasks are remaining. + local TaskTypeList = {} + local TasksRemaining = 0 + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + local TaskType = Task:GetType() + TaskTypeList[TaskType] = TaskType + end + return TaskTypeList +end + + +--- Create a status report of the Mission. +-- This reports provides a one liner of the mission status. It indicates how many players and how many Tasks. +-- +-- Mission "" - Status "" +-- - Task Types: , +-- - Planned Tasks (xp) +-- - Assigned Tasks(xp) +-- - Success Tasks (xp) +-- - Hold Tasks (xp) +-- - Cancelled Tasks (xp) +-- - Aborted Tasks (xp) +-- - Failed Tasks (xp) +-- +-- @param #MISSION self +-- @return #string +function MISSION:ReportStatus() + + local Report = REPORT:New() + + -- List the name of the mission. + local Name = self:GetName() + + -- Determine the status of the mission. + local Status = self:GetState() + local TasksRemaining = self:GetTasksRemaining() + + Report:Add( string.format( '%s - Status "%s"', Name, Status ) ) + + local TaskTypes = self:GetTaskTypes() + + Report:Add( string.format( " - Task Types: %s", table.concat(TaskTypes, ", " ) ) ) + + local TaskStatusList = { "Planned", "Assigned", "Success", "Hold", "Cancelled", "Aborted", "Failed" } + + for TaskStatusID, TaskStatus in pairs( TaskStatusList ) do + local TaskCount = 0 + local TaskPlayerCount = 0 + -- Determine how many tasks are remaining. + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + if Task:Is( TaskStatus ) then + TaskCount = TaskCount + 1 + TaskPlayerCount = TaskPlayerCount + Task:GetPlayerCount() + end + end + if TaskCount > 0 then + Report:Add( string.format( " - %02d %s Tasks (%dp)", TaskCount, TaskStatus, TaskPlayerCount ) ) + end + end + + return Report:Text() +end + +--- Create a player report of the Mission. +-- This reports provides a one liner of the mission status. It indicates how many players and how many Tasks. +-- +-- Mission "" - Status "" +-- - Player ": Task , Task +-- - Player : Task , Task +-- - .. +-- +-- @param #MISSION self +-- @return #string +function MISSION:ReportPlayers() + + local Report = REPORT:New() + + -- List the name of the mission. + local Name = self:GetName() + + -- Determine the status of the mission. + local Status = self:GetState() + local TasksRemaining = self:GetTasksRemaining() + + Report:Add( string.format( '%s - Status "%s"', Name, Status ) ) + + local PlayerList = {} + + -- Determine how many tasks are remaining. + for TaskID, Task in pairs( self:GetTasks() ) do + local Task = Task -- Tasking.Task#TASK + local PlayerNames = Task:GetPlayerNames() + for PlayerID, PlayerName in pairs( PlayerNames ) do + PlayerList[PlayerName] = Task:GetName() + end + + end + + for PlayerName, TaskName in pairs( PlayerList ) do + Report:Add( string.format( ' - Player (%s): Task "%s"', PlayerName, TaskName ) ) + end + + return Report:Text() +end + + --- Create a summary report of the Mission (one line). -- @param #MISSION self -- @return #string @@ -645,7 +756,7 @@ function MISSION:ReportOverview( TaskStatus ) local Status = self:GetState() local TasksRemaining = self:GetTasksRemaining() - Report:Add( "Mission " .. Name .. " - " .. Status .. " Task Report ") + Report:Add( string.format( '%s - Status "%s"', Name, Status ) ) -- Determine how many tasks are remaining. local TasksRemaining = 0 @@ -672,7 +783,7 @@ function MISSION:ReportDetails() -- Determine the status of the mission. local Status = self:GetState() - Report:Add( "Mission " .. Name .. " - " .. Status ) + Report:Add( string.format( '%s - Status "%s"', Name, Status ) ) -- Determine how many tasks are remaining. local TasksRemaining = 0 diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index f006c584f..e2ae85c64 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -157,9 +157,9 @@ TASK = { -- @param #string TaskName The name of the Task -- @param #string TaskType The type of the Task -- @return #TASK self -function TASK:New( Mission, SetGroupAssign, TaskName, TaskType ) +function TASK:New( Mission, SetGroupAssign, TaskName, TaskType, TaskBriefing ) - local self = BASE:Inherit( self, FSM_TASK:New() ) -- Core.Fsm#FSM_TASK + local self = BASE:Inherit( self, FSM_TASK:New() ) -- Tasking.Task#TASK self:SetStartState( "Planned" ) self:AddTransition( "Planned", "Assign", "Assigned" ) @@ -189,7 +189,7 @@ function TASK:New( Mission, SetGroupAssign, TaskName, TaskType ) self:SetName( TaskName ) self:SetID( Mission:GetNextTaskID( self ) ) -- The Mission orchestrates the task sequences .. - self.TaskBriefing = "You are invited for the task: " .. self.TaskName .. "." + self:SetBriefing( TaskBriefing ) self.FsmTemplate = self.FsmTemplate or FSM_PROCESS:New() @@ -413,15 +413,15 @@ do -- Group Assignment local SetAssignedGroups = self:GetGroups() - SetAssignedGroups:ForEachGroup( - function( AssignedGroup ) - if self:IsGroupAssigned(AssignedGroup) then - self:GetMission():GetCommandCenter():MessageToGroup( string.format( "Task %s is assigned to group %s.", TaskName, TaskGroupName ), AssignedGroup ) - else - self:GetMission():GetCommandCenter():MessageToGroup( string.format( "Task %s is assigned to your group.", TaskName ), AssignedGroup ) - end - end - ) +-- SetAssignedGroups:ForEachGroup( +-- function( AssignedGroup ) +-- if self:IsGroupAssigned(AssignedGroup) then +-- self:GetMission():GetCommandCenter():MessageToGroup( string.format( "Task %s is assigned to group %s.", TaskName, TaskGroupName ), AssignedGroup ) +-- else +-- self:GetMission():GetCommandCenter():MessageToGroup( string.format( "Task %s is assigned to your group.", TaskName ), AssignedGroup ) +-- end +-- end +-- ) return self end @@ -468,6 +468,8 @@ do -- Group Assignment self:F( TaskGroup:GetName() ) local TaskGroupName = TaskGroup:GetName() + local Mission = self:GetMission() + local CommandCenter = Mission:GetCommandCenter() self:SetGroupAssigned( TaskGroup ) @@ -478,11 +480,16 @@ do -- Group Assignment self:E(PlayerName) if PlayerName ~= nil or PlayerName ~= "" then self:AssignToUnit( TaskUnit ) + CommandCenter:MessageToGroup( + string.format( 'Task "%s": Briefing for player (%s):\n%s', + self:GetName(), + PlayerName, + self:GetBriefing() + ), TaskGroup + ) end end - local Mission = self:GetMission() - local CommandCenter = Mission:GetCommandCenter() CommandCenter:SetMenu() return self @@ -848,6 +855,13 @@ function TASK:GetTaskName() return self.TaskName end +--- Returns the @{Task} briefing. +-- @param #TASK self +-- @return #string Task briefing. +function TASK:GetTaskBriefing() + return self.TaskBriefing +end + @@ -1117,10 +1131,18 @@ end -- @param #string TaskBriefing -- @return #TASK self function TASK:SetBriefing( TaskBriefing ) + self:E(TaskBriefing) self.TaskBriefing = TaskBriefing return self end +--- Gets the @{Task} briefing. +-- @param #TASK self +-- @return #string The briefing text. +function TASK:GetBriefing() + return self.TaskBriefing +end + diff --git a/Moose Development/Moose/Tasking/Task_A2G.lua b/Moose Development/Moose/Tasking/Task_A2G.lua index 17162ca7f..8c99d85f1 100644 --- a/Moose Development/Moose/Tasking/Task_A2G.lua +++ b/Moose Development/Moose/Tasking/Task_A2G.lua @@ -86,8 +86,8 @@ do -- TASK_A2G -- @param Core.Zone#ZONE_BASE TargetZone The target zone, if known. -- If the TargetZone parameter is specified, the player will be routed to the center of the zone where all the targets are assumed to be. -- @return #TASK_A2G self - function TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, TaskType ) - local self = BASE:Inherit( self, TASK:New( Mission, SetGroup, TaskName, TaskType ) ) -- Tasking.Task#TASK_A2G + function TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, TaskType, TaskBriefing ) + local self = BASE:Inherit( self, TASK:New( Mission, SetGroup, TaskName, TaskType, TaskBriefing ) ) -- Tasking.Task#TASK_A2G self:F() self.TargetSetUnit = TargetSetUnit @@ -364,16 +364,28 @@ do -- TASK_SEAD --- Instantiates a new TASK_SEAD. -- @param #TASK_SEAD self -- @param Tasking.Mission#MISSION Mission - -- @param Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. + -- @param Core.Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. -- @param #string TaskName The name of the Task. - -- @param Set#SET_UNIT TargetSetUnit + -- @param Core.Set#SET_UNIT TargetSetUnit + -- @param #string TaskBriefing The briefing of the task. -- @return #TASK_SEAD self - function TASK_SEAD:New( Mission, SetGroup, TaskName, TargetSetUnit ) - local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "SEAD" ) ) -- #TASK_SEAD + function TASK_SEAD:New( Mission, SetGroup, TaskName, TargetSetUnit, TaskBriefing ) + local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "SEAD", TaskBriefing ) ) -- #TASK_SEAD self:F() Mission:AddTask( self ) + local TargetCoord = TargetSetUnit:GetFirst():GetCoordinate() + local TargetPositionText = TargetCoord:ToString() + local TargetThreatLevel = TargetSetUnit:CalculateThreatLevelA2G() + + self:SetBriefing( + TaskBriefing or + "Execute a Suppression of Enemy Air Defenses.\n" .. + "Initial Coordinates: " .. TargetPositionText .. "\n" .. + "Threat Level: [" .. string.rep( "■", TargetThreatLevel ) .. "]" + ) + return self end @@ -392,19 +404,28 @@ do -- TASK_BAI --- Instantiates a new TASK_BAI. -- @param #TASK_BAI self -- @param Tasking.Mission#MISSION Mission - -- @param Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. + -- @param Core.Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. -- @param #string TaskName The name of the Task. - -- @param Set#SET_UNIT UnitSetTargets - -- @param #number TargetDistance The distance to Target when the Player is considered to have "arrived" at the engagement range. - -- @param Core.Zone#ZONE_BASE TargetZone The target zone, if known. - -- If the TargetZone parameter is specified, the player will be routed to the center of the zone where all the targets are assumed to be. + -- @param Core.Set#SET_UNIT TargetSetUnit + -- @param #string TaskBriefing The briefing of the task. -- @return #TASK_BAI self - function TASK_BAI:New( Mission, SetGroup, TaskName, TargetSetUnit ) - local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "BAI" ) ) -- #TASK_BAI + function TASK_BAI:New( Mission, SetGroup, TaskName, TargetSetUnit, TaskBriefing ) + local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "BAI", TaskBriefing ) ) -- #TASK_BAI self:F() Mission:AddTask( self ) + local TargetCoord = TargetSetUnit:GetFirst():GetCoordinate() + local TargetPositionText = TargetCoord:ToString() + local TargetThreatLevel = TargetSetUnit:CalculateThreatLevelA2G() + + self:SetBriefing( + TaskBriefing or + "Execute a Battleground Air Interdiction of a group of enemy targets.\n" .. + "Initial Coordinates: " .. TargetPositionText .. "\n" .. + "Threat Level: [" .. string.rep( "■", TargetThreatLevel ) .. "]" + ) + return self end @@ -423,19 +444,29 @@ do -- TASK_CAS --- Instantiates a new TASK_CAS. -- @param #TASK_CAS self -- @param Tasking.Mission#MISSION Mission - -- @param Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. + -- @param Core.Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. -- @param #string TaskName The name of the Task. - -- @param Set#SET_UNIT UnitSetTargets - -- @param #number TargetDistance The distance to Target when the Player is considered to have "arrived" at the engagement range. - -- @param Core.Zone#ZONE_BASE TargetZone The target zone, if known. - -- If the TargetZone parameter is specified, the player will be routed to the center of the zone where all the targets are assumed to be. + -- @param Core.Set#SET_UNIT TargetSetUnit + -- @param #string TaskBriefing The briefing of the task. -- @return #TASK_CAS self - function TASK_CAS:New( Mission, SetGroup, TaskName, TargetSetUnit ) - local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "CAS" ) ) -- #TASK_CAS + function TASK_CAS:New( Mission, SetGroup, TaskName, TargetSetUnit, TaskBriefing ) + local self = BASE:Inherit( self, TASK_A2G:New( Mission, SetGroup, TaskName, TargetSetUnit, "CAS", TaskBriefing ) ) -- #TASK_CAS self:F() Mission:AddTask( self ) + local TargetCoord = TargetSetUnit:GetFirst():GetCoordinate() + local TargetPositionText = TargetCoord:ToString() + local TargetThreatLevel = TargetSetUnit:CalculateThreatLevelA2G() + + self:SetBriefing( + TaskBriefing or + "Execute a Close Air Support for a group of enemy targets.\n" .. + "Beware of friendlies at the vicinity!\n" .. + "Initial Coordinates: " .. TargetPositionText .. "\n" .. + "Threat Level: [" .. string.rep( "■", TargetThreatLevel ) .. "]" + ) + return self end diff --git a/Moose Development/Moose/Tasking/Task_CARGO.lua b/Moose Development/Moose/Tasking/Task_CARGO.lua index d80324af6..38d5c2316 100644 --- a/Moose Development/Moose/Tasking/Task_CARGO.lua +++ b/Moose Development/Moose/Tasking/Task_CARGO.lua @@ -153,7 +153,7 @@ do -- TASK_CARGO -- -- === -- - -- @field #TASK_CARGO TASK_CARGO + -- @field #TASK_CARGO -- TASK_CARGO = { ClassName = "TASK_CARGO", @@ -166,9 +166,10 @@ do -- TASK_CARGO -- @param #string TaskName The name of the Task. -- @param Core.Set#SET_CARGO SetCargo The scope of the cargo to be transported. -- @param #string TaskType The type of Cargo task. + -- @param #string TaskBriefing The Cargo Task briefing. -- @return #TASK_CARGO self - function TASK_CARGO:New( Mission, SetGroup, TaskName, SetCargo, TaskType ) - local self = BASE:Inherit( self, TASK:New( Mission, SetGroup, TaskName, TaskType ) ) -- #TASK_CARGO + function TASK_CARGO:New( Mission, SetGroup, TaskName, SetCargo, TaskType, TaskBriefing ) + local self = BASE:Inherit( self, TASK:New( Mission, SetGroup, TaskName, TaskType, TaskBriefing ) ) -- #TASK_CARGO self:F( {Mission, SetGroup, TaskName, SetCargo, TaskType}) self.SetCargo = SetCargo @@ -696,9 +697,10 @@ do -- TASK_CARGO_TRANSPORT -- @param Set#SET_GROUP SetGroup The set of groups for which the Task can be assigned. -- @param #string TaskName The name of the Task. -- @param Core.Set#SET_CARGO SetCargo The scope of the cargo to be transported. + -- @param #string TaskBriefing The Cargo Task briefing. -- @return #TASK_CARGO_TRANSPORT self - function TASK_CARGO_TRANSPORT:New( Mission, SetGroup, TaskName, SetCargo ) - local self = BASE:Inherit( self, TASK_CARGO:New( Mission, SetGroup, TaskName, SetCargo, "Transport" ) ) -- #TASK_CARGO_TRANSPORT + function TASK_CARGO_TRANSPORT:New( Mission, SetGroup, TaskName, SetCargo, TaskBriefing ) + local self = BASE:Inherit( self, TASK_CARGO:New( Mission, SetGroup, TaskName, SetCargo, "Transport", TaskBriefing ) ) -- #TASK_CARGO_TRANSPORT self:F() Mission:AddTask( self ) @@ -709,8 +711,6 @@ do -- TASK_CARGO_TRANSPORT self:AddTransition( "*", "CargoPickedUp", "*" ) self:AddTransition( "*", "CargoDeployed", "*" ) - do - --- OnBefore Transition Handler for Event CargoPickedUp. -- @function [parent=#TASK_CARGO_TRANSPORT] OnBeforeCargoPickedUp -- @param #TASK_CARGO_TRANSPORT self @@ -742,9 +742,7 @@ do -- TASK_CARGO_TRANSPORT -- @param #number Delay The delay in seconds. -- @param Wrapper.Unit#UNIT TaskUnit The Unit (Client) that PickedUp the cargo. You can use this to retrieve the PlayerName etc. -- @param Core.Cargo#CARGO Cargo The Cargo that got PickedUp by the TaskUnit. You can use this to check Cargo Status. - end - do --- OnBefore Transition Handler for Event CargoDeployed. -- @function [parent=#TASK_CARGO_TRANSPORT] OnBeforeCargoDeployed -- @param #TASK_CARGO_TRANSPORT self @@ -780,10 +778,26 @@ do -- TASK_CARGO_TRANSPORT -- @param Wrapper.Unit#UNIT TaskUnit The Unit (Client) that Deployed the cargo. You can use this to retrieve the PlayerName etc. -- @param Core.Cargo#CARGO Cargo The Cargo that got PickedUp by the TaskUnit. You can use this to check Cargo Status. -- @param Core.Zone#ZONE DeployZone The zone where the Cargo got Deployed or UnBoarded. - end local Fsm = self:GetUnitProcess() + local CargoReport = REPORT:New( "Transport Cargo. The following cargo needs to be transported including initial positions:") + + SetCargo:ForEachCargo( + --- @param Core.Cargo#CARGO Cargo + function( Cargo ) + local CargoType = Cargo:GetType() + local CargoName = Cargo:GetName() + local CargoCoordinate = Cargo:GetCoordinate() + CargoReport:Add( string.format( '- "%s" (%s) at %s', CargoName, CargoType, CargoCoordinate:ToString() ) ) + end + ) + + self:SetBriefing( + TaskBriefing or + CargoReport:Text() + ) + return self end @@ -815,7 +829,7 @@ do -- TASK_CARGO_TRANSPORT end end end - + return CargoDeployed end diff --git a/Moose Development/Moose/Wrapper/Positionable.lua b/Moose Development/Moose/Wrapper/Positionable.lua index 7a192ba64..c815b7bfb 100644 --- a/Moose Development/Moose/Wrapper/Positionable.lua +++ b/Moose Development/Moose/Wrapper/Positionable.lua @@ -334,7 +334,7 @@ function POSITIONABLE:GetMessageText( Message, Name ) --R2.1 added local DCSObject = self:GetDCSObject() if DCSObject then Name = Name and ( " (" .. Name .. ")" ) or "" - local Callsign = self:GetCallsign() ~= "" and self:GetCallsign() or self:GetName() + local Callsign = string.format( "[%s]", self:GetCallsign() ~= "" and self:GetCallsign() or self:GetName() ) local MessageText = Callsign .. Name .. ": " .. Message return MessageText end @@ -383,12 +383,19 @@ end -- @param #string Message The message text -- @param Dcs.DCSTYpes#Duration Duration The duration of the message. -- @param Dcs.DCScoalition#coalition MessageCoalition The Coalition receiving the message. --- @param #string Name (optional) The Name of the sender. If not provided, the Name is the type of the Positionable. -function POSITIONABLE:MessageToCoalition( Message, Duration, MessageCoalition, Name ) +function POSITIONABLE:MessageToCoalition( Message, Duration, MessageCoalition ) self:F2( { Message, Duration } ) + local Name = "" + local DCSObject = self:GetDCSObject() if DCSObject then + if MessageCoalition == coalition.side.BLUE then + Name = "Blue coalition" + end + if MessageCoalition == coalition.side.RED then + Name = "Red coalition" + end self:GetMessage( Message, Duration, Name ):ToCoalition( MessageCoalition ) end From 3329465fd313c70453b5f05b405e890b2f6fc072 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Mon, 8 May 2017 14:57:16 +0200 Subject: [PATCH 37/39] Improved boarding process Fixed boarding process when a carrier would ascend while boarding, the boarding process would be cancelled by the cargo. the carrier is notified of that event. When the carrier lands again, he can again board the cargo using the cargo menu options. --- Moose Development/Moose/Core/Cargo.lua | 548 +++++++++--------- .../Moose/Tasking/Task_CARGO.lua | 6 +- 2 files changed, 291 insertions(+), 263 deletions(-) diff --git a/Moose Development/Moose/Core/Cargo.lua b/Moose Development/Moose/Core/Cargo.lua index f984fe542..281d81224 100644 --- a/Moose Development/Moose/Core/Cargo.lua +++ b/Moose Development/Moose/Core/Cargo.lua @@ -239,6 +239,7 @@ function CARGO:New( Type, Name, Weight ) --R2.1 self:SetStartState( "UnLoaded" ) self:AddTransition( { "UnLoaded", "Boarding" }, "Board", "Boarding" ) self:AddTransition( "Boarding" , "Boarding", "Boarding" ) + self:AddTransition( "Boarding", "CancelBoarding", "UnLoaded" ) self:AddTransition( "Boarding", "Load", "Loaded" ) self:AddTransition( "UnLoaded", "Load", "Loaded" ) self:AddTransition( "Loaded", "UnBoard", "UnBoarding" ) @@ -732,32 +733,13 @@ function CARGO_UNIT:onafterBoard( From, Event, To, CargoCarrier, NearRadius, ... local TaskRoute = self.CargoObject:TaskRoute( Points ) self.CargoObject:SetTask( TaskRoute, 2 ) self:__Boarding( -1, CargoCarrier, NearRadius ) + self.RunCount = 0 end end end ---- Leave Boarding State. --- @param #CARGO_UNIT self --- @param #string Event --- @param #string From --- @param #string To --- @param Wrapper.Unit#UNIT CargoCarrier -function CARGO_UNIT:onleaveBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) - self:F( { From, Event, To, CargoCarrier.UnitName, NearRadius } ) - - local NearRadius = NearRadius or 25 - - if self:IsNear( CargoCarrier:GetPointVec2(), NearRadius ) then - self:__Load( 1, CargoCarrier, ... ) - return true - end - - return true -end - - --- Boarding Event. -- @param #CARGO_UNIT self -- @param #string Event @@ -769,8 +751,45 @@ function CARGO_UNIT:onafterBoarding( From, Event, To, CargoCarrier, NearRadius, self:F( { From, Event, To, CargoCarrier.UnitName, NearRadius } ) - self:__Boarding( -1, CargoCarrier, NearRadius, ... ) - self:__Board( -10, CargoCarrier, NearRadius, ... ) + if CargoCarrier and CargoCarrier:IsAlive() then + if CargoCarrier:InAir() == false then + if self:IsNear( CargoCarrier:GetPointVec2(), NearRadius ) then + self:__Load( 1, CargoCarrier, ... ) + else + self:__Boarding( -1, CargoCarrier, NearRadius, ... ) + self.RunCount = self.RunCount + 1 + if self.RunCount >= 20 then + self.RunCount = 0 + local Speed = 90 + local Angle = 180 + local Distance = 5 + + NearRadius = NearRadius or 25 + + local CargoCarrierPointVec2 = CargoCarrier:GetPointVec2() + local CargoCarrierHeading = CargoCarrier:GetHeading() -- Get Heading of object in degrees. + local CargoDeployHeading = ( ( CargoCarrierHeading + Angle ) >= 360 ) and ( CargoCarrierHeading + Angle - 360 ) or ( CargoCarrierHeading + Angle ) + local CargoDeployPointVec2 = CargoCarrierPointVec2:Translate( Distance, CargoDeployHeading ) + + local Points = {} + + local PointStartVec2 = self.CargoObject:GetPointVec2() + + Points[#Points+1] = PointStartVec2:RoutePointGround( Speed ) + Points[#Points+1] = CargoDeployPointVec2:RoutePointGround( Speed ) + + local TaskRoute = self.CargoObject:TaskRoute( Points ) + self.CargoObject:SetTask( TaskRoute, 0.2 ) + end + end + else + self.CargoObject:MessageToGroup( "Cancelling Boarding... Get back on the ground!", 5, CargoCarrier:GetGroup(), self:GetName() ) + self:CancelBoarding( CargoCarrier, NearRadius, ... ) + self.CargoObject:SetCommand( self.CargoObject:CommandStopRoute( true ) ) + end + else + self:E("Something is wrong") + end end @@ -818,6 +837,254 @@ end end + +do -- CARGO_GROUP + + --- @type CARGO_GROUP + -- @extends #CARGO_REPORTABLE + + --- # CARGO\_GROUP class + -- + -- The CARGO\_GROUP class defines a cargo that is represented by a @{Group} object within the simulator, and can be transported by a carrier. + -- Use the event functions as described above to Load, UnLoad, Board, UnBoard the CARGO\_GROUP to and from carrier. + -- + -- @field #CARGO_GROUP CARGO_GROUP + -- + CARGO_GROUP = { + ClassName = "CARGO_GROUP", + } + +--- CARGO_GROUP constructor. +-- @param #CARGO_GROUP self +-- @param Wrapper.Group#GROUP CargoGroup +-- @param #string Type +-- @param #string Name +-- @param #number ReportRadius (optional) +-- @param #number NearRadius (optional) +-- @return #CARGO_GROUP +function CARGO_GROUP:New( CargoGroup, Type, Name, ReportRadius ) + local self = BASE:Inherit( self, CARGO_REPORTABLE:New( CargoGroup, Type, Name, 0, ReportRadius ) ) -- #CARGO_GROUP + self:F( { Type, Name, ReportRadius } ) + + self.CargoSet = SET_CARGO:New() + + self.CargoObject = CargoGroup + + local WeightGroup = 0 + + for UnitID, UnitData in pairs( CargoGroup:GetUnits() ) do + local Unit = UnitData -- Wrapper.Unit#UNIT + local WeightUnit = Unit:GetDesc().massEmpty + WeightGroup = WeightGroup + WeightUnit + local CargoUnit = CARGO_UNIT:New( Unit, Type, Unit:GetName(), WeightUnit ) + self.CargoSet:Add( CargoUnit:GetName(), CargoUnit ) + end + + self:SetWeight( WeightGroup ) + + self:T( { "Weight Cargo", WeightGroup } ) + + -- Cargo objects are added to the _DATABASE and SET_CARGO objects. + _EVENTDISPATCHER:CreateEventNewCargo( self ) + + return self +end + +--- Enter Boarding State. +-- @param #CARGO_GROUP self +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @param #string Event +-- @param #string From +-- @param #string To +function CARGO_GROUP:onenterBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) + + local NearRadius = NearRadius or 25 + + if From == "UnLoaded" then + + -- For each Cargo object within the CARGO_GROUPED, route each object to the CargoLoadPointVec2 + self.CargoSet:ForEach( + function( Cargo, ... ) + Cargo:__Board( 1, CargoCarrier, NearRadius, ... ) + end, ... + ) + + self:__Boarding( 1, CargoCarrier, NearRadius, ... ) + end + +end + +--- Enter Loaded State. +-- @param #CARGO_GROUP self +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @param #string Event +-- @param #string From +-- @param #string To +function CARGO_GROUP:onenterLoaded( From, Event, To, CargoCarrier, ... ) + self:F( { From, Event, To, CargoCarrier, ...} ) + + if From == "UnLoaded" then + -- For each Cargo object within the CARGO_GROUP, load each cargo to the CargoCarrier. + for CargoID, Cargo in pairs( self.CargoSet:GetSet() ) do + Cargo:Load( CargoCarrier ) + end + end + + self.CargoObject:Destroy() + self.CargoCarrier = CargoCarrier + +end + +--- Leave Boarding State. +-- @param #CARGO_GROUP self +-- @param Wrapper.Unit#UNIT CargoCarrier +-- @param #string Event +-- @param #string From +-- @param #string To +function CARGO_GROUP:onafterBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) + self:F( { CargoCarrier.UnitName, From, Event, To } ) + + local NearRadius = NearRadius or 25 + + local Boarded = true + local Cancelled = false + + self.CargoSet:Flush() + + -- For each Cargo object within the CARGO_GROUP, route each object to the CargoLoadPointVec2 + for CargoID, Cargo in pairs( self.CargoSet:GetSet() ) do + self:T( { Cargo:GetName(), Cargo.current } ) + if not Cargo:is( "Loaded" ) then + Boarded = false + end + + if Cargo:is( "UnLoaded" ) then + Cancelled = true + end + + + end + + if not Cancelled then + if not Boarded then + self:__Boarding( 1, CargoCarrier, NearRadius, ... ) + else + self:__Load( 1, CargoCarrier, ... ) + end + else + self:__CancelBoarding( 1, CargoCarrier, NearRadius, ... ) + end + +end + +--- Enter UnBoarding State. +-- @param #CARGO_GROUP self +-- @param Core.Point#POINT_VEC2 ToPointVec2 +-- @param #string Event +-- @param #string From +-- @param #string To +function CARGO_GROUP:onenterUnBoarding( From, Event, To, ToPointVec2, NearRadius, ... ) + self:F( {From, Event, To, ToPointVec2, NearRadius } ) + + NearRadius = NearRadius or 25 + + local Timer = 1 + + if From == "Loaded" then + + -- For each Cargo object within the CARGO_GROUP, route each object to the CargoLoadPointVec2 + self.CargoSet:ForEach( + function( Cargo, NearRadius ) + + Cargo:__UnBoard( Timer, ToPointVec2, NearRadius ) + Timer = Timer + 10 + end, { NearRadius } + ) + + + self:__UnBoarding( 1, ToPointVec2, NearRadius, ... ) + end + +end + +--- Leave UnBoarding State. +-- @param #CARGO_GROUP self +-- @param Core.Point#POINT_VEC2 ToPointVec2 +-- @param #string Event +-- @param #string From +-- @param #string To +function CARGO_GROUP:onleaveUnBoarding( From, Event, To, ToPointVec2, NearRadius, ... ) + self:F( { From, Event, To, ToPointVec2, NearRadius } ) + + --local NearRadius = NearRadius or 25 + + local Angle = 180 + local Speed = 10 + local Distance = 5 + + if From == "UnBoarding" then + local UnBoarded = true + + -- For each Cargo object within the CARGO_GROUP, route each object to the CargoLoadPointVec2 + for CargoID, Cargo in pairs( self.CargoSet:GetSet() ) do + self:T( Cargo.current ) + if not Cargo:is( "UnLoaded" ) then + UnBoarded = false + end + end + + if UnBoarded then + return true + else + self:__UnBoarding( 1, ToPointVec2, NearRadius, ... ) + end + + return false + end + +end + +--- UnBoard Event. +-- @param #CARGO_GROUP self +-- @param Core.Point#POINT_VEC2 ToPointVec2 +-- @param #string Event +-- @param #string From +-- @param #string To +function CARGO_GROUP:onafterUnBoarding( From, Event, To, ToPointVec2, NearRadius, ... ) + self:F( { From, Event, To, ToPointVec2, NearRadius } ) + + --local NearRadius = NearRadius or 25 + + self:__UnLoad( 1, ToPointVec2, ... ) +end + + + +--- Enter UnLoaded State. +-- @param #CARGO_GROUP self +-- @param Core.Point#POINT_VEC2 +-- @param #string Event +-- @param #string From +-- @param #string To +function CARGO_GROUP:onenterUnLoaded( From, Event, To, ToPointVec2, ... ) + self:F( { From, Event, To, ToPointVec2 } ) + + if From == "Loaded" then + + -- For each Cargo object within the CARGO_GROUP, route each object to the CargoLoadPointVec2 + self.CargoSet:ForEach( + function( Cargo ) + Cargo:UnLoad( ToPointVec2 ) + end + ) + + end + +end + +end -- CARGO_GROUP + do -- CARGO_PACKAGE --- @type CARGO_PACKAGE @@ -1032,240 +1299,3 @@ end end - -do -- CARGO_GROUP - - --- @type CARGO_GROUP - -- @extends #CARGO_REPORTABLE - - --- # CARGO\_GROUP class - -- - -- The CARGO\_GROUP class defines a cargo that is represented by a @{Group} object within the simulator, and can be transported by a carrier. - -- Use the event functions as described above to Load, UnLoad, Board, UnBoard the CARGO\_GROUP to and from carrier. - -- - -- @field #CARGO_GROUP CARGO_GROUP - -- - CARGO_GROUP = { - ClassName = "CARGO_GROUP", - } - ---- CARGO_GROUP constructor. --- @param #CARGO_GROUP self --- @param Wrapper.Group#GROUP CargoGroup --- @param #string Type --- @param #string Name --- @param #number ReportRadius (optional) --- @param #number NearRadius (optional) --- @return #CARGO_GROUP -function CARGO_GROUP:New( CargoGroup, Type, Name, ReportRadius ) - local self = BASE:Inherit( self, CARGO_REPORTABLE:New( CargoGroup, Type, Name, 0, ReportRadius ) ) -- #CARGO_GROUP - self:F( { Type, Name, ReportRadius } ) - - self.CargoSet = SET_CARGO:New() - - self.CargoObject = CargoGroup - - local WeightGroup = 0 - - for UnitID, UnitData in pairs( CargoGroup:GetUnits() ) do - local Unit = UnitData -- Wrapper.Unit#UNIT - local WeightUnit = Unit:GetDesc().massEmpty - WeightGroup = WeightGroup + WeightUnit - local CargoUnit = CARGO_UNIT:New( Unit, Type, Unit:GetName(), WeightUnit ) - self.CargoSet:Add( CargoUnit:GetName(), CargoUnit ) - end - - self:SetWeight( WeightGroup ) - - self:T( { "Weight Cargo", WeightGroup } ) - - -- Cargo objects are added to the _DATABASE and SET_CARGO objects. - _EVENTDISPATCHER:CreateEventNewCargo( self ) - - return self -end - ---- Enter Boarding State. --- @param #CARGO_GROUP self --- @param Wrapper.Unit#UNIT CargoCarrier --- @param #string Event --- @param #string From --- @param #string To -function CARGO_GROUP:onenterBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) - self:F( { CargoCarrier.UnitName, From, Event, To } ) - - local NearRadius = NearRadius or 25 - - if From == "UnLoaded" then - - -- For each Cargo object within the CARGO_GROUPED, route each object to the CargoLoadPointVec2 - self.CargoSet:ForEach( - function( Cargo ) - Cargo:__Board( 1, CargoCarrier, NearRadius ) - end - ) - - self:__Boarding( 1, CargoCarrier, NearRadius, ... ) - end - -end - ---- Enter Loaded State. --- @param #CARGO_GROUP self --- @param Wrapper.Unit#UNIT CargoCarrier --- @param #string Event --- @param #string From --- @param #string To -function CARGO_GROUP:onenterLoaded( From, Event, To, CargoCarrier, ... ) - self:F( { CargoCarrier.UnitName, From, Event, To } ) - - if From == "UnLoaded" then - -- For each Cargo object within the CARGO_GROUP, load each cargo to the CargoCarrier. - for CargoID, Cargo in pairs( self.CargoSet:GetSet() ) do - Cargo:Load( CargoCarrier ) - end - end - - self.CargoObject:Destroy() - self.CargoCarrier = CargoCarrier - -end - ---- Leave Boarding State. --- @param #CARGO_GROUP self --- @param Wrapper.Unit#UNIT CargoCarrier --- @param #string Event --- @param #string From --- @param #string To -function CARGO_GROUP:onleaveBoarding( From, Event, To, CargoCarrier, NearRadius, ... ) - self:F( { CargoCarrier.UnitName, From, Event, To } ) - - local NearRadius = NearRadius or 25 - - local Boarded = true - - self.CargoSet:Flush() - - -- For each Cargo object within the CARGO_GROUP, route each object to the CargoLoadPointVec2 - for CargoID, Cargo in pairs( self.CargoSet:GetSet() ) do - self:T( { Cargo:GetName(), Cargo.current } ) - if not Cargo:is( "Loaded" ) then - Boarded = false - end - end - - if not Boarded then - self:__Boarding( 1, CargoCarrier, NearRadius, ... ) - else - self:__Load( 1, CargoCarrier, ... ) - end - return Boarded -end - ---- Enter UnBoarding State. --- @param #CARGO_GROUP self --- @param Core.Point#POINT_VEC2 ToPointVec2 --- @param #string Event --- @param #string From --- @param #string To -function CARGO_GROUP:onenterUnBoarding( From, Event, To, ToPointVec2, NearRadius, ... ) - self:F( {From, Event, To, ToPointVec2, NearRadius } ) - - NearRadius = NearRadius or 25 - - local Timer = 1 - - if From == "Loaded" then - - -- For each Cargo object within the CARGO_GROUP, route each object to the CargoLoadPointVec2 - self.CargoSet:ForEach( - function( Cargo, NearRadius ) - - Cargo:__UnBoard( Timer, ToPointVec2, NearRadius ) - Timer = Timer + 10 - end, { NearRadius } - ) - - - self:__UnBoarding( 1, ToPointVec2, NearRadius, ... ) - end - -end - ---- Leave UnBoarding State. --- @param #CARGO_GROUP self --- @param Core.Point#POINT_VEC2 ToPointVec2 --- @param #string Event --- @param #string From --- @param #string To -function CARGO_GROUP:onleaveUnBoarding( From, Event, To, ToPointVec2, NearRadius, ... ) - self:F( { From, Event, To, ToPointVec2, NearRadius } ) - - --local NearRadius = NearRadius or 25 - - local Angle = 180 - local Speed = 10 - local Distance = 5 - - if From == "UnBoarding" then - local UnBoarded = true - - -- For each Cargo object within the CARGO_GROUP, route each object to the CargoLoadPointVec2 - for CargoID, Cargo in pairs( self.CargoSet:GetSet() ) do - self:T( Cargo.current ) - if not Cargo:is( "UnLoaded" ) then - UnBoarded = false - end - end - - if UnBoarded then - return true - else - self:__UnBoarding( 1, ToPointVec2, NearRadius, ... ) - end - - return false - end - -end - ---- UnBoard Event. --- @param #CARGO_GROUP self --- @param Core.Point#POINT_VEC2 ToPointVec2 --- @param #string Event --- @param #string From --- @param #string To -function CARGO_GROUP:onafterUnBoarding( From, Event, To, ToPointVec2, NearRadius, ... ) - self:F( { From, Event, To, ToPointVec2, NearRadius } ) - - --local NearRadius = NearRadius or 25 - - self:__UnLoad( 1, ToPointVec2, ... ) -end - - - ---- Enter UnLoaded State. --- @param #CARGO_GROUP self --- @param Core.Point#POINT_VEC2 --- @param #string Event --- @param #string From --- @param #string To -function CARGO_GROUP:onenterUnLoaded( From, Event, To, ToPointVec2, ... ) - self:F( { From, Event, To, ToPointVec2 } ) - - if From == "Loaded" then - - -- For each Cargo object within the CARGO_GROUP, route each object to the CargoLoadPointVec2 - self.CargoSet:ForEach( - function( Cargo ) - Cargo:UnLoad( ToPointVec2 ) - end - ) - - end - -end - -end -- CARGO_GROUP - diff --git a/Moose Development/Moose/Tasking/Task_CARGO.lua b/Moose Development/Moose/Tasking/Task_CARGO.lua index 38d5c2316..2cd135bd0 100644 --- a/Moose Development/Moose/Tasking/Task_CARGO.lua +++ b/Moose Development/Moose/Tasking/Task_CARGO.lua @@ -277,6 +277,8 @@ do -- TASK_CARGO ) self:__SelectAction( -15 ) + + Task:GetMission():GetCommandCenter():MessageToGroup("Cargo menu is ready ...", TaskUnit:GetGroup() ) end --- @@ -429,14 +431,10 @@ do -- TASK_CARGO self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) function self.Cargo:OnEnterLoaded( From, Event, To, TaskUnit, TaskProcess ) - self:E({From, Event, To, TaskUnit, TaskProcess }) - TaskProcess:__Boarded( 0.1 ) - end - if self.Cargo:IsInRadius( TaskUnit:GetPointVec2() ) then if TaskUnit:InAir() then --- ABORT the boarding. Split group if any and go back to select action. From ce1f85e09adebab617e5d97b4dc4f636e3072175 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Mon, 8 May 2017 16:28:36 +0200 Subject: [PATCH 38/39] Fixed menu and deployment of cargo -- You can now deploy cargo anywhere in the battlefield. -- The menu generation is improved. ---- No more first remove menu and then build, but "refresh"... --- .../Moose/Tasking/Task_CARGO.lua | 66 +++++++++++-------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/Moose Development/Moose/Tasking/Task_CARGO.lua b/Moose Development/Moose/Tasking/Task_CARGO.lua index 2cd135bd0..2ee08dc55 100644 --- a/Moose Development/Moose/Tasking/Task_CARGO.lua +++ b/Moose Development/Moose/Tasking/Task_CARGO.lua @@ -182,24 +182,24 @@ do -- TASK_CARGO Fsm:AddProcess ( "Planned", "Accept", ACT_ASSIGN_ACCEPT:New( self.TaskBriefing ), { Assigned = "SelectAction", Rejected = "Reject" } ) - Fsm:AddTransition( { "Assigned", "WaitingForCommand", "ArrivedAtPickup", "ArrivedAtDeploy", "Boarded", "UnBoarded", "Landed" }, "SelectAction", "WaitingForCommand" ) + Fsm:AddTransition( { "Assigned", "WaitingForCommand", "ArrivedAtPickup", "ArrivedAtDeploy", "Boarded", "UnBoarded", "Landed", "Boarding" }, "SelectAction", "*" ) - Fsm:AddTransition( "WaitingForCommand", "RouteToPickup", "RoutingToPickup" ) + Fsm:AddTransition( "*", "RouteToPickup", "RoutingToPickup" ) Fsm:AddProcess ( "RoutingToPickup", "RouteToPickupPoint", ACT_ROUTE_POINT:New(), { Arrived = "ArriveAtPickup" } ) Fsm:AddTransition( "Arrived", "ArriveAtPickup", "ArrivedAtPickup" ) - Fsm:AddTransition( "WaitingForCommand", "RouteToDeploy", "RoutingToDeploy" ) + Fsm:AddTransition( "*", "RouteToDeploy", "RoutingToDeploy" ) Fsm:AddProcess ( "RoutingToDeploy", "RouteToDeployZone", ACT_ROUTE_ZONE:New(), { Arrived = "ArriveAtDeploy" } ) Fsm:AddTransition( "Arrived", "ArriveAtDeploy", "ArrivedAtDeploy" ) Fsm:AddTransition( { "ArrivedAtPickup", "ArrivedAtDeploy", "Landing" }, "Land", "Landing" ) Fsm:AddTransition( "Landing", "Landed", "Landed" ) - Fsm:AddTransition( "WaitingForCommand", "PrepareBoarding", "AwaitBoarding" ) + Fsm:AddTransition( "*", "PrepareBoarding", "AwaitBoarding" ) Fsm:AddTransition( "AwaitBoarding", "Board", "Boarding" ) Fsm:AddTransition( "Boarding", "Boarded", "Boarded" ) - Fsm:AddTransition( "WaitingForCommand", "PrepareUnBoarding", "AwaitUnBoarding" ) + Fsm:AddTransition( "*", "PrepareUnBoarding", "AwaitUnBoarding" ) Fsm:AddTransition( "AwaitUnBoarding", "UnBoard", "UnBoarding" ) Fsm:AddTransition( "UnBoarding", "UnBoarded", "UnBoarded" ) @@ -213,14 +213,12 @@ do -- TASK_CARGO -- @param #FSM_PROCESS self -- @param Wrapper.Unit#UNIT TaskUnit -- @param Tasking.Task_CARGO#TASK_CARGO Task - function Fsm:onenterWaitingForCommand( TaskUnit, Task ) + function Fsm:onafterSelectAction( TaskUnit, Task ) self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) - if TaskUnit.Menu then - TaskUnit.Menu:Remove() - end + local MenuTime = timer.getTime() - TaskUnit.Menu = MENU_GROUP:New( TaskUnit:GetGroup(), Task:GetName() .. " @ " .. TaskUnit:GetName() ) + TaskUnit.Menu = MENU_GROUP:New( TaskUnit:GetGroup(), Task:GetName() .. " @ " .. TaskUnit:GetName() ):SetTime( MenuTime ) Task.SetCargo:ForEachCargo( @@ -235,7 +233,7 @@ do -- TASK_CARGO self.MenuBoardCargo, self, Cargo - ) + ):SetTime(MenuTime) else MENU_GROUP_COMMAND:New( TaskUnit:GetGroup(), @@ -244,23 +242,24 @@ do -- TASK_CARGO self.MenuRouteToPickup, self, Cargo - ) + ):SetTime(MenuTime) end end if Cargo:IsLoaded() then + + MENU_GROUP_COMMAND:New( + TaskUnit:GetGroup(), + "Unboard cargo " .. Cargo.Name, + TaskUnit.Menu, + self.MenuUnBoardCargo, + self, + Cargo + ):SetTime(MenuTime) + + -- Deployzones are optional zones that can be selected to request routing information. for DeployZoneName, DeployZone in pairs( Task.DeployZones ) do - if Cargo:IsInZone( DeployZone ) then - MENU_GROUP_COMMAND:New( - TaskUnit:GetGroup(), - "Unboard cargo " .. Cargo.Name, - TaskUnit.Menu, - self.MenuUnBoardCargo, - self, - Cargo, - DeployZone - ) - else + if not Cargo:IsInZone( DeployZone ) then MENU_GROUP_COMMAND:New( TaskUnit:GetGroup(), "Route to Deploy cargo at " .. DeployZoneName, @@ -268,13 +267,16 @@ do -- TASK_CARGO self.MenuRouteToDeploy, self, DeployZone - ) + ):SetTime(MenuTime) end end end end ) + + TaskUnit.Menu:Remove( MenuTime ) + self:__SelectAction( -15 ) @@ -476,12 +478,20 @@ do -- TASK_CARGO -- @param To -- @param Cargo -- @param Core.Zone#ZONE_BASE DeployZone - function Fsm:onafterPrepareUnBoarding( TaskUnit, Task, From, Event, To, Cargo, DeployZone ) - self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID(), From, Event, To, Cargo, DeployZone } ) + function Fsm:onafterPrepareUnBoarding( TaskUnit, Task, From, Event, To, Cargo ) + self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID(), From, Event, To, Cargo } ) self.Cargo = Cargo - self.DeployZone = DeployZone -- Core.Zone#ZONE_BASE - self:__UnBoard( -0.1, Cargo, DeployZone ) + self.DeployZone = nil + + -- Check if the Cargo is at a deployzone... If it is, provide it as a parameter! + for DeployZoneName, DeployZone in pairs( Task.DeployZones ) do + if Cargo:IsInZone( DeployZone ) then + self.DeployZone = DeployZone -- Core.Zone#ZONE_BASE + break + end + end + self:__UnBoard( -0.1, Cargo, self.DeployZone ) end --- From d8ba37af8d0ed60b90a654ced38c38c9a489fe93 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Tue, 9 May 2017 09:29:08 +0200 Subject: [PATCH 39/39] When cargo is destroyed, it will stop working... --- Moose Development/Moose/Core/Cargo.lua | 59 ++++- .../Moose/Tasking/Task_CARGO.lua | 209 ++++++++++-------- 2 files changed, 170 insertions(+), 98 deletions(-) diff --git a/Moose Development/Moose/Core/Cargo.lua b/Moose Development/Moose/Core/Cargo.lua index 281d81224..88635422f 100644 --- a/Moose Development/Moose/Core/Cargo.lua +++ b/Moose Development/Moose/Core/Cargo.lua @@ -246,6 +246,8 @@ function CARGO:New( Type, Name, Weight ) --R2.1 self:AddTransition( "UnBoarding", "UnBoarding", "UnBoarding" ) self:AddTransition( "UnBoarding", "UnLoad", "UnLoaded" ) self:AddTransition( "Loaded", "UnLoad", "UnLoaded" ) + self:AddTransition( "*", "Destroyed", "Destroyed" ) + self:AddTransition( "*", "Respawn", "UnLoaded" ) self.Type = Type @@ -263,6 +265,7 @@ function CARGO:New( Type, Name, Weight ) --R2.1 CARGOS[self.Name] = self self:SetEventPriority( 5 ) + return self end @@ -274,6 +277,17 @@ function CARGO:GetName() --R2.1 return self.Name end +--- Get the object name of the Cargo. +-- @param #CARGO self +-- @return #string The object name of the Cargo. +function CARGO:GetObjectName() --R2.1 + if self:IsLoaded() then + return self.CargoCarrier:GetName() + else + return self.CargoObject:GetName() + end +end + --- Get the type of the Cargo. -- @param #CARGO self -- @return #string The type of the Cargo. @@ -303,6 +317,20 @@ function CARGO:IsUnLoaded() return self:Is( "UnLoaded" ) end +--- Check if cargo is alive. +-- @param #CARGO self +-- @return #boolean true if unloaded +function CARGO:IsAlive() + + if self:IsLoaded() then + return self.CargoCarrier:IsAlive() + else + return self.CargoObject:IsAlive() + end +end + + + --- Template method to spawn a new representation of the CARGO in the simulator. -- @param #CARGO self @@ -529,6 +557,16 @@ function CARGO_UNIT:New( CargoUnit, Type, Name, Weight, NearRadius ) self:T( self.ClassName ) + self:HandleEvent( EVENTS.Dead, + --- @param #CARGO Cargo + -- @param Core.Event#EVENTDATA EventData + function( Cargo, EventData ) + if Cargo:GetObjectName() == EventData.IniUnit:GetName() then + self:E( { "Cargo destroyed", Cargo } ) + Cargo:Destroyed() + end + end + ) return self end @@ -949,6 +987,7 @@ function CARGO_GROUP:onafterBoarding( From, Event, To, CargoCarrier, NearRadius, local Boarded = true local Cancelled = false + local Dead = true self.CargoSet:Flush() @@ -962,18 +1001,26 @@ function CARGO_GROUP:onafterBoarding( From, Event, To, CargoCarrier, NearRadius, if Cargo:is( "UnLoaded" ) then Cancelled = true end - + + if not Cargo:is( "Destroyed" ) then + Dead = false + end end - if not Cancelled then - if not Boarded then - self:__Boarding( 1, CargoCarrier, NearRadius, ... ) + if not Dead then + + if not Cancelled then + if not Boarded then + self:__Boarding( 1, CargoCarrier, NearRadius, ... ) + else + self:__Load( 1, CargoCarrier, ... ) + end else - self:__Load( 1, CargoCarrier, ... ) + self:__CancelBoarding( 1, CargoCarrier, NearRadius, ... ) end else - self:__CancelBoarding( 1, CargoCarrier, NearRadius, ... ) + self:__Destroyed( 1, CargoCarrier, NearRadius, ... ) end end diff --git a/Moose Development/Moose/Tasking/Task_CARGO.lua b/Moose Development/Moose/Tasking/Task_CARGO.lua index 2ee08dc55..776fe499b 100644 --- a/Moose Development/Moose/Tasking/Task_CARGO.lua +++ b/Moose Development/Moose/Tasking/Task_CARGO.lua @@ -224,50 +224,54 @@ do -- TASK_CARGO --- @param Core.Cargo#CARGO Cargo function( Cargo ) - if Cargo:IsUnLoaded() then - if Cargo:IsInRadius( TaskUnit:GetPointVec2() ) then - MENU_GROUP_COMMAND:New( - TaskUnit:GetGroup(), - "Board cargo " .. Cargo.Name, - TaskUnit.Menu, - self.MenuBoardCargo, - self, - Cargo - ):SetTime(MenuTime) - else - MENU_GROUP_COMMAND:New( - TaskUnit:GetGroup(), - "Route to Pickup cargo " .. Cargo.Name, - TaskUnit.Menu, - self.MenuRouteToPickup, - self, - Cargo - ):SetTime(MenuTime) - end - end - - if Cargo:IsLoaded() then - - MENU_GROUP_COMMAND:New( - TaskUnit:GetGroup(), - "Unboard cargo " .. Cargo.Name, - TaskUnit.Menu, - self.MenuUnBoardCargo, - self, - Cargo - ):SetTime(MenuTime) - - -- Deployzones are optional zones that can be selected to request routing information. - for DeployZoneName, DeployZone in pairs( Task.DeployZones ) do - if not Cargo:IsInZone( DeployZone ) then + + if Cargo:IsAlive() then + + if Cargo:IsUnLoaded() then + if Cargo:IsInRadius( TaskUnit:GetPointVec2() ) then MENU_GROUP_COMMAND:New( TaskUnit:GetGroup(), - "Route to Deploy cargo at " .. DeployZoneName, + "Board cargo " .. Cargo.Name, TaskUnit.Menu, - self.MenuRouteToDeploy, + self.MenuBoardCargo, self, - DeployZone + Cargo ):SetTime(MenuTime) + else + MENU_GROUP_COMMAND:New( + TaskUnit:GetGroup(), + "Route to Pickup cargo " .. Cargo.Name, + TaskUnit.Menu, + self.MenuRouteToPickup, + self, + Cargo + ):SetTime(MenuTime) + end + end + + if Cargo:IsLoaded() then + + MENU_GROUP_COMMAND:New( + TaskUnit:GetGroup(), + "Unboard cargo " .. Cargo.Name, + TaskUnit.Menu, + self.MenuUnBoardCargo, + self, + Cargo + ):SetTime(MenuTime) + + -- Deployzones are optional zones that can be selected to request routing information. + for DeployZoneName, DeployZone in pairs( Task.DeployZones ) do + if not Cargo:IsInZone( DeployZone ) then + MENU_GROUP_COMMAND:New( + TaskUnit:GetGroup(), + "Route to Deploy cargo at " .. DeployZoneName, + TaskUnit.Menu, + self.MenuRouteToDeploy, + self, + DeployZone + ):SetTime(MenuTime) + end end end end @@ -313,13 +317,19 @@ do -- TASK_CARGO -- @param #FSM_PROCESS self -- @param Wrapper.Unit#UNIT TaskUnit -- @param Tasking.Task_Cargo#TASK_CARGO Task + -- @param From + -- @param Event + -- @param To + -- @param Core.Cargo#CARGO Cargo function Fsm:onafterRouteToPickup( TaskUnit, Task, From, Event, To, Cargo ) self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) + if Cargo:IsAlive() then + self.Cargo = Cargo -- Core.Cargo#CARGO + Task:SetCargoPickup( self.Cargo, TaskUnit ) + self:__RouteToPickupPoint( -0.1 ) + end - self.Cargo = Cargo -- Core.Cargo#CARGO - Task:SetCargoPickup( self.Cargo, TaskUnit ) - self:__RouteToPickupPoint( -0.1 ) end @@ -330,11 +340,13 @@ do -- TASK_CARGO function Fsm:onafterArriveAtPickup( TaskUnit, Task ) self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) - if TaskUnit:IsAir() then - self.Cargo.CargoObject:GetUnit(1):SmokeRed() - self:__Land( -0.1, "Pickup" ) - else - self:__SelectAction( -0.1 ) + if self.Cargo:IsAlive() then + if TaskUnit:IsAir() then + self.Cargo.CargoObject:GetUnit(1):SmokeRed() + self:__Land( -0.1, "Pickup" ) + else + self:__SelectAction( -0.1 ) + end end end @@ -375,19 +387,21 @@ do -- TASK_CARGO function Fsm:onafterLand( TaskUnit, Task, From, Event, To, Action ) self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) - if self.Cargo:IsInRadius( TaskUnit:GetPointVec2() ) then - if TaskUnit:InAir() then - Task:GetMission():GetCommandCenter():MessageToGroup( "Land", TaskUnit:GetGroup() ) - self:__Land( -10, Action ) + if self.Cargo:IsAlive() then + if self.Cargo:IsInRadius( TaskUnit:GetPointVec2() ) then + if TaskUnit:InAir() then + Task:GetMission():GetCommandCenter():MessageToGroup( "Land", TaskUnit:GetGroup() ) + self:__Land( -10, Action ) + else + Task:GetMission():GetCommandCenter():MessageToGroup( "Landed ...", TaskUnit:GetGroup() ) + self:__Landed( -0.1, Action ) + end else - Task:GetMission():GetCommandCenter():MessageToGroup( "Landed ...", TaskUnit:GetGroup() ) - self:__Landed( -0.1, Action ) - end - else - if Action == "Pickup" then - self:__RouteToPickupZone( -0.1 ) - else - self:__RouteToDeployZone( -0.1 ) + if Action == "Pickup" then + self:__RouteToPickupZone( -0.1 ) + else + self:__RouteToDeployZone( -0.1 ) + end end end end @@ -399,17 +413,19 @@ do -- TASK_CARGO function Fsm:onafterLanded( TaskUnit, Task, From, Event, To, Action ) self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) - if self.Cargo:IsInRadius( TaskUnit:GetPointVec2() ) then - if TaskUnit:InAir() then - self:__Land( -0.1, Action ) + if self.Cargo:IsAlive() then + if self.Cargo:IsInRadius( TaskUnit:GetPointVec2() ) then + if TaskUnit:InAir() then + self:__Land( -0.1, Action ) + else + self:__SelectAction( -0.1 ) + end else - self:__SelectAction( -0.1 ) - end - else - if Action == "Pickup" then - self:__RouteToPickupZone( -0.1 ) - else - self:__RouteToDeployZone( -0.1 ) + if Action == "Pickup" then + self:__RouteToPickupZone( -0.1 ) + else + self:__RouteToDeployZone( -0.1 ) + end end end end @@ -421,8 +437,10 @@ do -- TASK_CARGO function Fsm:onafterPrepareBoarding( TaskUnit, Task, From, Event, To, Cargo ) self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID() } ) - self.Cargo = Cargo -- Core.Cargo#CARGO_GROUP - self:__Board( -0.1 ) + if Cargo and Cargo:IsAlive() then + self.Cargo = Cargo -- Core.Cargo#CARGO_GROUP + self:__Board( -0.1 ) + end end --- @@ -437,15 +455,17 @@ do -- TASK_CARGO TaskProcess:__Boarded( 0.1 ) end - if self.Cargo:IsInRadius( TaskUnit:GetPointVec2() ) then - if TaskUnit:InAir() then - --- ABORT the boarding. Split group if any and go back to select action. + if self.Cargo:IsAlive() then + if self.Cargo:IsInRadius( TaskUnit:GetPointVec2() ) then + if TaskUnit:InAir() then + --- ABORT the boarding. Split group if any and go back to select action. + else + self.Cargo:MessageToGroup( "Boarding ...", TaskUnit:GetGroup() ) + self.Cargo:Board( TaskUnit, 20, self ) + end else - self.Cargo:MessageToGroup( "Boarding ...", TaskUnit:GetGroup() ) - self.Cargo:Board( TaskUnit, 20, self ) + --self:__ArriveAtCargo( -0.1 ) end - else - --self:__ArriveAtCargo( -0.1 ) end end @@ -462,8 +482,10 @@ do -- TASK_CARGO -- TODO:I need to find a more decent solution for this. Task:E( { CargoPickedUp = Task.CargoPickedUp } ) - if Task.CargoPickedUp then - Task:CargoPickedUp( TaskUnit, self.Cargo ) + if self.Cargo:IsAlive() then + if Task.CargoPickedUp then + Task:CargoPickedUp( TaskUnit, self.Cargo ) + end end end @@ -485,13 +507,15 @@ do -- TASK_CARGO self.DeployZone = nil -- Check if the Cargo is at a deployzone... If it is, provide it as a parameter! - for DeployZoneName, DeployZone in pairs( Task.DeployZones ) do - if Cargo:IsInZone( DeployZone ) then - self.DeployZone = DeployZone -- Core.Zone#ZONE_BASE - break + if Cargo:IsAlive() then + for DeployZoneName, DeployZone in pairs( Task.DeployZones ) do + if Cargo:IsInZone( DeployZone ) then + self.DeployZone = DeployZone -- Core.Zone#ZONE_BASE + break + end end + self:__UnBoard( -0.1, Cargo, self.DeployZone ) end - self:__UnBoard( -0.1, Cargo, self.DeployZone ) end --- @@ -507,15 +531,14 @@ do -- TASK_CARGO self:E( { TaskUnit = TaskUnit, Task = Task and Task:GetClassNameAndID(), From, Event, To, Cargo, DeployZone } ) function self.Cargo:OnEnterUnLoaded( From, Event, To, DeployZone, TaskProcess ) - self:E({From, Event, To, DeployZone, TaskProcess }) - TaskProcess:__UnBoarded( -0.1 ) - end - self.Cargo:MessageToGroup( "UnBoarding ...", TaskUnit:GetGroup() ) - self.Cargo:UnBoard( DeployZone:GetPointVec2(), 400, self ) + if self.Cargo:IsAlive() then + self.Cargo:MessageToGroup( "UnBoarding ...", TaskUnit:GetGroup() ) + self.Cargo:UnBoard( DeployZone:GetPointVec2(), 400, self ) + end end @@ -530,8 +553,10 @@ do -- TASK_CARGO -- TODO:I need to find a more decent solution for this. Task:E( { CargoDeployed = Task.CargoDeployed } ) - if Task.CargoDeployed then - Task:CargoDeployed( TaskUnit, self.Cargo, self.DeployZone ) + if self.Cargo:IsAlive() then + if Task.CargoDeployed then + Task:CargoDeployed( TaskUnit, self.Cargo, self.DeployZone ) + end end self:__SelectAction( 1 )

    N1d~+}uI!l^m^L2bWxE%zBQ@XWCb`z_6yY$SW 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 z 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 PTHK=`!LR&(_CNmxb?$S` literal 0 HcmV?d00001 diff --git a/Utils/Slate Documentation Generator/bin/TreeHierarchy.csv b/Utils/Slate Documentation Generator/bin/TreeHierarchy.csv new file mode 100644 index 000000000..41eb85a6a --- /dev/null +++ b/Utils/Slate Documentation Generator/bin/TreeHierarchy.csv @@ -0,0 +1,35 @@ +@K=function, @M=Task_A2G, @N=onafterRouteToRendezVous, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_A2G.lua, @C=5129, +@K=function, @M=Task_A2G, @N=OnAfterArriveAtRendezVous, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_A2G.lua, @C=5789, +@K=function, @M=Task_A2G, @N=onafterEngage, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_A2G.lua, @C=6186, +@K=function, @M=Task_A2G, @N=onafterRouteToTarget, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_A2G.lua, @C=6508, +@K=function, @M=Task_A2G, @N=onafterRouteToTargets, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_A2G.lua, @C=7380, +@K=function, @M=Task_Cargo, @N=onenterWaitingForCommand, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_CARGO.lua, @C=10431, +@K=function, @M=Task_Cargo, @N=OnLeaveWaitingForCommand, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_CARGO.lua, @C=12652, +@K=function, @M=Task_Cargo, @N=onafterRouteToPickup, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_CARGO.lua, @C=13428, +@K=function, @M=Task_Cargo, @N=onafterArriveAtPickup, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_CARGO.lua, @C=13882, +@K=function, @M=Task_Cargo, @N=onafterRouteToDeploy, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_CARGO.lua, @C=14310, +@K=function, @M=Task_Cargo, @N=onafterArriveAtDeploy, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_CARGO.lua, @C=14757, +@K=function, @M=Task_Cargo, @N=onafterLand, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_CARGO.lua, @C=15187, +@K=function, @M=Task_Cargo, @N=onafterLanded, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_CARGO.lua, @C=16069, +@K=function, @M=Task_Cargo, @N=onafterPrepareBoarding, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_CARGO.lua, @C=16762, +@K=function, @M=Task_Cargo, @N=onafterBoard, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_CARGO.lua, @C=17166, +@K=function, @M=Task_Cargo, @N=onafterBoarded, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_CARGO.lua, @C=18074, +@K=function, @M=Task_Cargo, @N=onafterPrepareUnBoarding, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_CARGO.lua, @C=18704, +@K=function, @M=Task_Cargo, @N=onafterUnBoard, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_CARGO.lua, @C=19134, +@K=function, @M=Task_Cargo, @N=onafterUnBoarded, @P=Fsm, @F=../../../MOOSE/Moose Development/Moose\Tasking\Task_CARGO.lua, @C=19788, +@K=function, @M=Designate, @N=OnBeforeLaseOn, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=12232, +@K=function, @M=Designate, @N=OnAfterLaseOn, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=12480, +@K=function, @M=Designate, @N=LaseOn, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=12701, +@K=function, @M=Designate, @N=__LaseOn, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=12824, +@K=function, @M=Designate, @N=OnBeforeLaseOff, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=13114, +@K=function, @M=Designate, @N=OnAfterLaseOff, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=13364, +@K=function, @M=Designate, @N=LaseOff, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=13587, +@K=function, @M=Designate, @N=__LaseOff, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=13712, +@K=function, @M=Designate, @N=OnBeforeSmoke, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=13944, +@K=function, @M=Designate, @N=OnAfterSmoke, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=14190, +@K=function, @M=Designate, @N=Smoke, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=14409, +@K=function, @M=Designate, @N=__Smoke, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=14530, +@K=function, @M=Designate, @N=OnBeforeStatus, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=15628, +@K=function, @M=Designate, @N=OnAfterStatus, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=15876, +@K=function, @M=Designate, @N=Status, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=16097, +@K=function, @M=Designate, @N=__Status, @P=DESIGNATE , @F=../../../MOOSE/Moose Development/Moose\Functional\Designate.lua, @C=16220, diff --git a/Utils/Slate Documentation Generator/src/DataStorer.au3 b/Utils/Slate Documentation Generator/src/DataStorer.au3 new file mode 100644 index 000000000..b5903009b --- /dev/null +++ b/Utils/Slate Documentation Generator/src/DataStorer.au3 @@ -0,0 +1,174 @@ +; This file only constains function related to storing the hierarchy in a tree-like tructure + +Func AddNode($Kind, $Module ,$Node, $Parent, $File, $CarretPos) + FileSetPos($DataFile, 0, $FILE_END) + + If $Parent == "" And $Kind == "type" Then + $Parent = "ROOT" + ElseIf $Kind == "module" Then + $Module = " " + $Parent = " " + EndIf + FileWrite($DataFile, "@K="&$Kind&", @M="&$Module&", @N="&$Node&", @P="&$Parent&", @F="&$File&", @C="&$CarretPos&","&@CRLF) +EndFunc + +; Search node by name and returns one data +Func GetData($Node, $Data) + FileSetPos($DataFile, 0, $FILE_BEGIN) + Local $CurrentLine = "" + Local $CurrentData + Local $RegexResult + Local $Regex + Switch $Data + Case "kind" + $Regex = "\@K=(.+?)," + Case "parent" + $Regex = "\@P=(.+?)," + Case "file" + $Regex = "\@F=(.+?)," + Case "carretpos" + $Regex = "\@C=(.+?)," + EndSwitch + FileSetPos($DataFile, 0, $FILE_BEGIN) + Do + $CurrentLine = FileReadLine($DataFile) + If @error == -1 Then + Return "" + ExitLoop + EndIf + $CurrentData = StringRegExp($CurrentLine, "\@N=(.+?),", $STR_REGEXPARRAYMATCH) + + Until $Node == $CurrentData[0] + $CurrentData = StringRegExp($CurrentLine, $Regex, $STR_REGEXPARRAYMATCH) + Return $CurrentData[0] +EndFunc + + +; Returns an array of parent nodes, up to the root, starting with the root +Func GetParents($Node) + Local $CurrentParent = $Node + Local $ParentsArray[0] + Local $NbOfParents = 1 + + While $CurrentParent <> "ROOT" + ReDim $ParentsArray[$NbOfParents] + $ParentsArray[$NbOfParents-1] = $CurrentParent + + $CurrentParent = GetData($CurrentParent, "parent") + If $CurrentParent == "" Then + FileWrite($Log, "ERROR : Couldn't find "&$ParentsArray[$NbOfParents-1]&"'s parent !") + $CurrentParent = "ERROR !" + ReDim $ParentsArray[$NbOfParents] + $ParentsArray[$NbOfParents-1] = $CurrentParent + ExitLoop + EndIf + $NbOfParents += 1 + WEnd + + _ArrayReverse($ParentsArray) + _ArrayDelete($ParentsArray, $NbOfParents) + Return $ParentsArray +EndFunc + + + +Func DataSort() + Local $SortedDataFile = FileOpen(@ScriptDir & "\TreeHierarchySorted.csv", $FO_OVERWRITE) + Local $Line = "" + Local $LineNb = 1 + Local $RegexResults + Local $CurrentModule + Local $CurrentType + + FileSetPos($DataFile, 0, $FILE_BEGIN) + + While True + $Line = FileReadLine($DataFile) + If @error then ExitLoop + + $RegexResults = StringRegExp($Line, "\@K=(.+?),", $STR_REGEXPARRAYMATCH) + If $RegexResults[0] == "module" Then + ConsoleWrite(".") + $RegexResults = StringRegExp($Line, "\@N=(.+?),", $STR_REGEXPARRAYMATCH) + $CurrentModule = $RegexResults[0] + FileWriteLine($SortedDataFile, $Line) + FileClose($DataFile) + _FileWriteToLine(@ScriptDir & "\TreeHierarchy.csv", $LineNb, "", True) + $DataFile = FileOpen(@ScriptDir & "\TreeHierarchy.csv", 1) + FileSetPos($DataFile, 0, $FILE_BEGIN) + $LineNb = 1 + + While True + $Line = FileReadLine($DataFile) + If @error then ExitLoop + + $RegexResults = StringRegExp($Line, "\@K=(.+?),", $STR_REGEXPARRAYMATCH) + If $RegexResults[0] == "type" Then + $RegexResults = StringRegExp($Line, "\@M=(.+?),", $STR_REGEXPARRAYMATCH) + If $RegexResults[0] == $CurrentModule Then + $RegexResults = StringRegExp($Line, "\@N=(.+?),", $STR_REGEXPARRAYMATCH) + $CurrentType = $RegexResults[0] + FileWriteLine($SortedDataFile, $Line) + FileClose($DataFile) + _FileWriteToLine(@ScriptDir & "\TreeHierarchy.csv", $LineNb, "", True) + $DataFile = FileOpen(@ScriptDir & "\TreeHierarchy.csv", 1) + FileSetPos($DataFile, 0, $FILE_BEGIN) + $LineNb = 1 + + While True + $Line = FileReadLine($DataFile) + If @error then ExitLoop + + $RegexResults = StringRegExp($Line, "\@K=(.+?),", $STR_REGEXPARRAYMATCH) + If $RegexResults[0] == "function" Then + $RegexResults = StringRegExp($Line, "\@P=(.+?),", $STR_REGEXPARRAYMATCH) + If $RegexResults[0] == $CurrentType Then + FileWriteLine($SortedDataFile, $Line) + FileClose($DataFile) + _FileWriteToLine(@ScriptDir & "\TreeHierarchy.csv", $LineNb, "", True) + $DataFile = FileOpen(@ScriptDir & "\TreeHierarchy.csv", 1) + FileSetPos($DataFile, 0, $FILE_BEGIN) + $LineNb = 0 + EndIf + EndIf + $LineNb += 1 + WEnd + FileSetPos($DataFile, 0, $FILE_BEGIN) + $LineNb = 0 + EndIf + EndIf + $LineNb += 1 + WEnd + FileSetPos($DataFile, 0, $FILE_BEGIN) + $LineNb = 0 + EndIf + $LineNb += 1 + Wend + If FileGetSize(@ScriptDir & "\TreeHierarchy.csv") <> 0 Then + FileWrite($Log, "ERROR : Some items couldn't be sorted. Verify them in the file TreeHierarchy.csv"&@CRLF) + ConsoleWrite(@CRLF&"INFO : Some items couldn't be sorted. Verify them in the file TreeHierarchy.csv"&@CRLF) + EndIf + FileClose($DataFile) + $DataFile = $SortedDataFile +EndFunc + + +Func FindInFunctionList($String) + Local $Line = "" + Local $TempStringArray + FileSetPos($FunctionList, 0, $FILE_BEGIN) + ;FileWrite($Log, 'Trying to find the function prototype for : ' & $String & @CRLF) + While 1 + $Line = FileReadLine($FunctionList) + If @error = -1 Then + SetError(0) + FileWrite($Log, "ERROR : Couldn't find " & $String & " in file. Does this method exitsts ?" & @CRLF) + Return $String + EndIf + If StringInStr($Line, $String) Then + $TempStringArray = StringSplit($Line, "-") + $Line = "[" & $TempStringArray[1] & ":" & $TempStringArray[2] & "()]" & '(#' & StringLower($Line) & ')' + Return $Line + EndIf + WEnd +EndFunc \ No newline at end of file diff --git a/Utils/Slate Documentation Generator/src/Parser.au3 b/Utils/Slate Documentation Generator/src/Parser.au3 new file mode 100644 index 000000000..307b98d20 --- /dev/null +++ b/Utils/Slate Documentation Generator/src/Parser.au3 @@ -0,0 +1,460 @@ +; This file include every function strictly related to the parsing of data in .lua files + +; Get the first comment block after $CarretPos +; We will also grab function declaration if possible/applicable +; The return is a Array : CarretPosition|BlockContent|Declaration|CarretPositionStart +Func ReadNextBlock($File, $CarretPos) + local $CommentBlock = "" ; This is where we'll store the comment block + local $Declaration = "" ; This is the next line after the comment block : usually the declaration statement + local $CurrentLine = "" + local $CurrentCarretPos = 0 + + local $IsCommentBlock = False + + local $RegExResult + local $RegexPos + + ; Start reading from $CarretPos + FileSetPos($File, $CarretPos, $FILE_BEGIN) + + ; Read till we find a comment block + Do + $CurrentLine = FileReadLine($File) + If @error Then ; We probably reached the eof + Local $ReturnArray[3] = [$CurrentCarretPos, "", ""] + Return $ReturnArray + ElseIf StringInStr($CurrentLine, "---") Then + $IsCommentBlock = True + EndIf + Until $IsCommentBlock + + Local $CarretPosStart = FileGetPos($File) - StringLen($CurrentLine) - 2 + + ; Add the first line to our comment block + $RegExResult = StringRegExp($CurrentLine, "---(.*)", $STR_REGEXPARRAYMATCH) + If Not @error Then ; The first line of the comment could be empty ! + $CommentBlock &= $RegExResult[0]&@CRLF + EndIf + + ; Read the comment block + Do + $CurrentCarretPos = FileGetPos($File) + $CurrentLine = FileReadLine($File) + If StringInStr($CurrentLine, "--") Then ; If we can't find any "--" in the line, then it's not the comment block anymore + $RegExResult = StringRegExp($CurrentLine, "--(.*)", $STR_REGEXPARRAYMATCH) + If Not @error Then; The line of the comment could be empty ! + $CommentBlock &= $RegExResult[0]&@CRLF + EndIf + Else + $IsCommentBlock = False + EndIf + Until Not $IsCommentBlock + + ; Ok, so now this is strange. If the comment block is class', we're going to have to check the + ; next comment block. If this next comment block contains a field, that is the same name as the class, then this + ; new comment block contains the whole informtion for the class. This is very shitty, but it's a workaround to + ; make intellisense show classes info while programing + If ParseForOneTag($CommentBlock, "@type") Then + Local $CommentBlock2 = "" + Do + $CurrentLine = FileReadLine($File) + If @error Then + Local $ReturnArray[3] = [$CurrentCarretPos, "", ""] + Return $ReturnArray + ElseIf StringInStr($CurrentLine, "---") Then + $IsCommentBlock = True + EndIf + Until $IsCommentBlock + + $RegExResult = StringRegExp($CurrentLine, "---(.*)", $STR_REGEXPARRAYMATCH) + If Not @error Then + $CommentBlock2 &= $RegExResult[0]&@CRLF + EndIf + + ; Yep, the next comment is the description of the class, let's read on ! + If StringInStr($CurrentLine, ParseForOneTag($CommentBlock, "@type")) And StringInStr($CurrentLine, "extend") Then + + Do + $CurrentLine = FileReadLine($File) + If StringInStr($CurrentLine, "--") Then + $RegExResult = StringRegExp($CurrentLine, "--(.*)", $STR_REGEXPARRAYMATCH) + If Not @error Then + $CommentBlock2 &= $RegExResult[0]&@CRLF + EndIf + Else + $IsCommentBlock = False + EndIf + Until Not $IsCommentBlock + + ; remove the line(s) with "@field" in the comment block. They are only needed for the intellisense hack + While 1 + $RegexResult = StringRegExp($CommentBlock2, "(.*)@field(.*)", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $CommentBlock2 = StringRegExpReplace($CommentBlock2, "(.*)@field(.*)", "", 1) + WEnd + + ; We also don't need the first line of the first comment block anymore... + ; $CommentBlock = StringRegExpReplace($CommentBlock, "(.*)", "", 1) + + ; append the description at the start of the comment block + $CommentBlock = $CommentBlock2&$CommentBlock + EndIf + + + ; We also need to check if the type is a list or a map. If so, the comment block does not describe a class, but a simple list / map. + ; It will have the formatting of a class, though, because it's closer closer to the actual code, even though it is highly confusing. + ; But it will only have 1 field : the list or map. + If StringInStr($CommentBlock, "@list") Then + $RegExResult = StringRegExp($CommentBlock, "@list\h<(.*?)>\h(.*)", $STR_REGEXPARRAYMATCH) + if not @error Then + $CommentBlock &= "@field #table["&$RegExResult[0]&"] "&$RegExResult[1] + EndIf + EndIf + ; TODO : Add support for @map the same way... + EndIf + + + + + ; We'll take the next line, as it might be the declaration statement + $Declaration = $CurrentLine + + + + ; let's do some cleanup + $CommentBlock = StringRegExpReplace($CommentBlock, "(?m)^\h+", "") ;remove leading whitespaces + $CommentBlock = StringRegExpReplace($CommentBlock, "(?m)\h+$", "") ;remove trailing whitespaces + $CommentBlock = StringRegExpReplace($CommentBlock, "(?m)^[#]+", "##### ") + $CommentBlock = StringRegExpReplace($CommentBlock, "(?m)^\h+", "") ;remove leading whitespaces again now that we removed the "#"s + $CommentBlock = StringRegExpReplace($CommentBlock, "(?m)-{3,}", "") ;remove sequences of at least 3 "-" which will mess up markdown + $CommentBlock = StringRegExpReplace($CommentBlock, "(?m)={3,}", "") ; remove sequences of at least 3 "=" which will mess up markdown + + Local $ReturnArray[4] = [$CurrentCarretPos, $CommentBlock, $Declaration, $CarretPosStart] + Return $ReturnArray +EndFunc + +; Parses the block and returns the data for one tag +; don't use it to find the function tag ! +Func ParseForOneTag($Block, $Tag) + Local $i = 1 + Local $DataArray[1] + Local $RegexResult[1] + Local $RegexPos = 1 + Local $Regex + + ; If we look for @usage, then it's a multiline data, the regex is different + If $Tag == "@usage" Then + $Regex = "(?s)@usage(.*)" + $RegexResult = StringRegExp($Block, $Regex, $STR_REGEXPARRAYMATCH, $RegexPos) + Else + $Regex = $Tag&"\h(.*)\s" + $RegexResult = StringRegExp($Block, $Regex, $STR_REGEXPARRAYMATCH, $RegexPos) + Endif + + If @error Then + Return "" + Else + Return $RegexResult[0] + EndIf + +EndFunc ;==>ReadOneTag + +; Parses the block and returns the data for multiple tags in an array +; Don't use it for @param ! +Func ParseForTags($Block, $Tag) + Local $i = 1 + Local $DataArray[1] + Local $RegexResult[1] + Local $RegexPos = 1 + + Local $Regex = $Tag&"(?m)\h([^\s]*)(?:\h)?([^\s]*)?(?:\h)?(.*)?$" + ; For each tag + While True + $RegexResult = StringRegExp($Block, $Regex, $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If $RegexPos == 0 Then ; We couldn't find any tag + If Not $DataArray[0] Then + Return "" + Else + Return $DataArray + EndIf + EndIf + + ; Add the tag to the array.The array looks like this : type1|param1|description1|type2... + ReDim $DataArray[$i * 3] + $DataArray[($i * 3) - 3] = $RegexResult[0] + If $RegexResult[1] == "" Then + $DataArray[($i * 3) - 2] = "self" ; if the first param doesn't have a name, then it's self + Else + $DataArray[($i * 3) - 2] = $RegexResult[1] + EndIf + $DataArray[($i * 3) - 1] = $RegexResult[2] + $i += 1 + WEnd +EndFunc + +; Parses both the comment block and the declaration to find the function name and it's type +; Compares both of them if possible, but will always return the one in the comment block if possible +Func ParseFunctionName($CommentBlock, $Declaration) + local $RegExResult + local $FunctionNameFromDec + local $FunctionNameFromComment + local $ReturnArray[2] + + ; Parse for function name in both the comment block and the desclaration + $RegExResult = StringRegExp($CommentBlock, "\@function\h(?:(\[.*\]\h))?(.*)", $STR_REGEXPARRAYMATCH) + If Not @error Then + $FunctionNameFromComment = $RegExResult[1] + EndIf + $RegExResult = StringRegExp($Declaration, "function\h(?:.*\:)?(.*)\(.*\)", $STR_REGEXPARRAYMATCH) + If Not @error Then + $FunctionNameFromDec = $RegExResult[0] + EndIf + + ; compare them to each other + If $FunctionNameFromComment Then + If $FunctionNameFromDec <> $FunctionNameFromComment Then + FileWrite($Log,"CAUTION : The commented function doesn't match its declaration : "&$FunctionNameFromComment& " -> "&$Declaration&@CRLF) + EndIf + $ReturnArray[0] = $FunctionNameFromComment + ElseIf $FunctionNameFromDec Then + ;FileWrite($Log, "CAUTION: No data matching @function found in block, inferring the function name from its declaration : "& $FunctionNameFromDec & @CRLF) + $ReturnArray[0] = $FunctionNameFromDec + Else + $ReturnArray[0] = "" + $ReturnArray[1] = "" + return $ReturnArray + EndIf + + ;parses for function type in both the comment block and the desclaration + local $TypeFromComment + local $TypeFromDec + + $RegExResult = StringRegExp($Declaration, "function\h(.*):", $STR_REGEXPARRAYMATCH) + If Not @error Then + $TypeFromDec = $RegExResult[0] + EndIf + $RegExResult = StringRegExp($CommentBlock, "function\h\[parent=#(.*)\]", $STR_REGEXPARRAYMATCH) + If Not @error Then + $TypeFromComment = $RegExResult[0] + EndIf + + ; compare them to each other + If $TypeFromComment Then + If $TypeFromDec <> $TypeFromComment Then + FileWrite($Log,"CAUTION : The commented function type doesn't match its declaration : "&$TypeFromComment& " -> "&$Declaration&@CRLF) + EndIf + $ReturnArray[1] = $TypeFromComment + ElseIf $TypeFromDec Then + ;FileWrite($Log, "CAUTION: No function type found in block, inferring the function type from its declaration : "& $TypeFromDec & @CRLF) + $ReturnArray[1] = $TypeFromDec + Else + $ReturnArray[0] = "" + $ReturnArray[1] = "" + return $ReturnArray + EndIf + + Return $ReturnArray +EndFunc + +; Specifically designed to parse for @param tags +; will verify the comment by matching with the declaration (theoretically, I'm pretty sure it's bugged) +Func ParseParams($CommentBlock, $Declaration) + Local $ParamsFromComment = ParseForTags($CommentBlock, "@param") + Local $RegExResult + Local $RegexPos = StringInStr($Declaration, "(") + Local $ParamsFromDec[0] + Local $NbParam = 0 + + If StringInStr($Declaration, ":") Then + $NbParam = 1 + ReDim $ParamsFromDec[1] + $ParamsFromDec[0] = "self" + EndIf + + ; extract params from function decaration + While True + $RegExResult = StringRegExp($Declaration, "([^,\(\)\h]+)", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $NbParam += 1 + Redim $ParamsFromDec[$NbParam] + $ParamsFromDec[$NbParam-1] = $RegExResult[0] + WEnd + + ; compare these parameters with those found in the comment block + If UBound($ParamsFromComment) <> UBound($ParamsFromDec)*3 Then + FileWrite($Log, "CAUTION: The number of parameters don't match between the comment block and declaration "& @CRLF) + Else + + For $i=0 To $NbParam-1 + If $ParamsFromDec[$i] <> $ParamsFromComment[($i*3)+1] Then + FileWrite($Log, "CAUTION: Parameters missmatch between the comment block and declaration "& @CRLF) + FileWrite($Log, $ParamsFromComment[($i*3)+1]& " -> " & $ParamsFromDec[$i]&@CRLF) + ExitLoop + EndIf + Next + EndIf + + Return $ParamsFromComment +EndFunc + +; This does 3 things : +; - Replace the hyperlinks with new ones +; - change the stuff starting with # (#nil -> Nil) +; - Replace pictures paths +Func ReplaceHyperlinks($TempFile) + Local $StringFile = "" + Local $RegexResult + Local $RegexPos = 1 + Local $NewURL = "" + Local $i = 0 + FileSetPos($TempFile, 0, $FILE_BEGIN) + + $StringFile = FileRead($TempFile) + + ; Replace HyperLinks Using Regexs + ; --------------------------------------------------------- + While 1 ; @{File.Module} + $RegexResult = StringRegExp($StringFile, "\@{([A-Z][^\.#}]+)\.([^\.#}]+)}", $STR_REGEXPARRAYMATCH, $RegexPos) ; + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $NewURL = "[" & $RegexResult[1] & "](#" & StringLower($RegexResult[1]) & "-module-)" + ;FileWrite($Log, "Module : " & $RegexPos & " : " & _ArrayToString($RegexResult) & " -> " & $NewURL & @CRLF) + $StringFile = StringRegExpReplace($StringFile, "\@{([A-Z][^\.#}]+)\.([^\.#}]+)}", $NewURL, 1) + WEnd + While 1 ; @{Module} + $RegexResult = StringRegExp($StringFile, "\@{([A-Z][^\.#}]+)}", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $NewURL = "[" & $RegexResult[0] & "](#" & StringLower($RegexResult[0]) & "-module-)" + ;FileWrite($Log, "Module : " & $RegexPos & " : " & _ArrayToString($RegexResult) & " -> " & $NewURL & @CRLF) + $StringFile = StringRegExpReplace($StringFile, "\@{([A-Z][^\.#}]+)}", $NewURL, 1) + WEnd + While 1 ; @{File.Module#TYPE} + $RegexResult = StringRegExp($StringFile, "\@{([A-Z][^\.#}]+)\.([A-Z][^\.#}]+)#([A-Z,_]+)}", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $NewURL = "[" & $RegexResult[2] & "](#" & StringLower($RegexResult[2]) & "-class-)" + ;FileWrite($Log, "Class : " & $RegexPos & " : " & _ArrayToString($RegexResult) & " -> " & $NewURL & @CRLF) + $StringFile = StringRegExpReplace($StringFile, "\@{([A-Z][^\.#}]+)\.([A-Z][^\.#}]+)#([A-Z,_]+)}", $NewURL, 1) + WEnd + While 1 ; @{Module#TYPE} + $RegexResult = StringRegExp($StringFile, "\@{([A-Z][^\.#}]+)#([A-Z,_]+)}", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $NewURL = "[" & $RegexResult[1] & "](#" & StringLower($RegexResult[1]) & "-class-)" + ;FileWrite($Log, "Class : " & $RegexPos & " : " & _ArrayToString($RegexResult) & " -> " & $NewURL & @CRLF) + $StringFile = StringRegExpReplace($StringFile, "\@{([A-Z][^\.#}]+)#([A-Z,_]+)}", $NewURL, 1) + WEnd + While 1 ; @{#TYPE} + $RegexResult = StringRegExp($StringFile, "\@{#([A-Z,_]+)}", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $NewURL = "[" & $RegexResult[0] & "](#" & StringLower($RegexResult[0]) & "-class-)" + ;FileWrite($Log, "Class : " & $RegexPos & " : " & _ArrayToString($RegexResult) & " -> " & $NewURL & @CRLF) + $StringFile = StringRegExpReplace($StringFile, "\@{#([A-Z,_]+)}", $NewURL, 1) + WEnd + While 1 ; #TYPE&@CR + $RegexResult = StringRegExp($StringFile, "\h#([A-Z,_]+)\s", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $NewURL = " [" & $RegexResult[0] & "](#" & StringLower($RegexResult[0]) & "-class-)"&@CRLF + ;FileWrite($Log, "Class : " & $RegexPos & " : " & _ArrayToString($RegexResult) & " -> " & $NewURL & @CRLF) + $StringFile = StringRegExpReplace($StringFile, "\h#([A-Z,_]+)\s", $NewURL, 1) + WEnd + While 1 ; @{File.Module#TYPE.Function}(), catches the parenthesis + $RegexResult = StringRegExp($StringFile, "\@{([A-Z][^#}\.]+)\.([A-Z][^#}\.]+)#([A-Z,_]+)\.([^#\.]+)}[\(]?[\)]?", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $NewURL = FindInFunctionList($RegexResult[2] & "-" & $RegexResult[3]&"-") + ;FileWrite($Log, "Class : " & $RegexPos & " : " & _ArrayToString($RegexResult) & " -> " & $NewURL & @CRLF) + $StringFile = StringRegExpReplace($StringFile, "\@{([A-Z][^#}\.]+)\.([A-Z][^#}\.]+)#([A-Z,_]+)\.([^#\.]+)}[\(]?[\)]?", $NewURL, 1) + WEnd + While 1 ; @{Module#TYPE.Function}(), catches the parenthesis + $RegexResult = StringRegExp($StringFile, "\@{([A-Z][^#}\.]+)#([A-Z,_]+)\.([^#}\.]+)}[\(]?[\)]?", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $NewURL = FindInFunctionList($RegexResult[1] & "-" & $RegexResult[2]&"-") + ;FileWrite($Log, "Class : " & $RegexPos & " : " & _ArrayToString($RegexResult) & " -> " & $NewURL & @CRLF) + $StringFile = StringRegExpReplace($StringFile, "\@{([A-Z][^#}\.]+)#([A-Z,_]+)\.([^#}\.]+)}[\(]?[\)]?", $NewURL, 1) + WEnd + While 1 ; @{#TYPE.Function}(), catches the parenthesis + $RegexResult = StringRegExp($StringFile, "\@{#([A-Z,_]+)\.([^#}\.]+)}[\(]?[\)]?", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $NewURL = FindInFunctionList($RegexResult[0] & "-" & $RegexResult[1]&"-") + ;FileWrite($Log, "Class : " & $RegexPos & " : " & _ArrayToString($RegexResult) & " -> " & $NewURL & @CRLF) + $StringFile = StringRegExpReplace($StringFile, "\@{#([A-Z,_]+)\.([^#}\.]+)}[\(]?[\)]?", $NewURL, 1) + WEnd + While 1 ; Module#TYPE + $RegexResult = StringRegExp($StringFile, "\h(\w+[^\h\_])#(.*?)\h", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $NewURL = " [" & $RegexResult[1] & "](#" & StringLower($RegexResult[1]) & "-class-) " + ;FileWrite($Log, "Class : " & $RegexPos & " : " & _ArrayToString($RegexResult) & " -> " & $NewURL & @CRLF) + $StringFile = StringRegExpReplace($StringFile, "\h(\w+[^\h\_])#(.*?)\h", $NewURL, 1) + WEnd + While 1 ; File.Module#TYPE + $RegexResult = StringRegExp($StringFile, "\h(\w+)\.(\w+)#(.*?)\h", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $NewURL = " [" & $RegexResult[2] & "](#" & StringLower($RegexResult[2]) & "-class-) " + ;FileWrite($Log, "Class : " & $RegexPos & " : " & _ArrayToString($RegexResult) & " -> " & $NewURL & @CRLF) + $StringFile = StringRegExpReplace($StringFile, "\h(\w+)\.(\w+)#(.*?)\h", $NewURL, 1) + WEnd + While 1 ; #TYPE.type (nested type... really annoying and confusing lua stuff) + $RegexResult = StringRegExp($StringFile, "\h#([A-Z,_]+)\.(\w+)\h", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $NewURL = " [" & $RegexResult[1] & "](#" &StringLower($RegexResult[0])& "-"& StringLower($RegexResult[1]) & "-class-)" + ;FileWrite($Log, "Class : " & $RegexPos & " : " & _ArrayToString($RegexResult) & " -> " & $NewURL & @CRLF) + $StringFile = StringRegExpReplace($StringFile, "\h#([A-Z,_]+)\.(\w+)\h", $NewURL, 1) + WEnd + + ; Clean stuff with # + ; --------------------------------------------------------- + $StringFile = StringReplace($StringFile, "#nil", "Nil") + $StringFile = StringReplace($StringFile, "#number", "Number") + $StringFile = StringReplace($StringFile, "#boolean", "Boolean") + $StringFile = StringReplace($StringFile, "#string", "String") + $StringFile = StringReplace($StringFile, "#table", "List[]") + $StringFile = StringReplace($StringFile, "#function", "Function()") + + ; And replace the pictures Path if any + ; --------------------------------------------------------- + While 1 + $RegexResult = StringRegExp($StringFile, "!\[(.*)\]\(.*\\(.*)\\(.*)\)", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + $NewPic = "![" & $RegexResult[0] & "](/includes/Pictures/" & $RegexResult[1] & "/"& $RegexResult[2]&")" + $StringFile = StringRegExpReplace($StringFile, "!\[(.*)\]\(.*\\(.*)\\(.*)\)", $NewPic, 1) + WEnd + + While 1 + $RegexResult = StringRegExp($StringFile, "(?m)^(\d(?:(\.\d))*\)(.*))$", $STR_REGEXPARRAYMATCH, $RegexPos) + $RegexPos = @extended + If @extended == 0 Then ExitLoop + + ;$StringFile = StringRegExpReplace($StringFile, "(?m)^(\d(?:(\.\d))*\)(.*))$", "