diff --git a/Moose Development/Moose/AI/AI_CAP.lua b/Moose Development/Moose/AI/AI_CAP.lua index 155b5284e..7a8701f63 100644 --- a/Moose Development/Moose/AI/AI_CAP.lua +++ b/Moose Development/Moose/AI/AI_CAP.lua @@ -1,4 +1,4 @@ ---- Single-Player:**Yes** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**Air** -- **Execute Combat Air Patrol (CAP).** +--- **AI** - **Execute Combat Air Patrol (CAP).** -- -- ![Banner Image](..\Presentations\AI_CAP\Dia1.JPG) -- diff --git a/Moose Development/Moose/AI/AI_CAS.lua b/Moose Development/Moose/AI/AI_CAS.lua index 149fc4a8e..88d1dd802 100644 --- a/Moose Development/Moose/AI/AI_CAS.lua +++ b/Moose Development/Moose/AI/AI_CAS.lua @@ -1,5 +1,4 @@ ---- Single-Player:**Yes** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**Air** -- --- **Provide Close Air Support to friendly ground troops.** +--- **AI** -- **Provide Close Air Support to friendly ground troops.** -- -- ![Banner Image](..\Presentations\AI_CAS\Dia1.JPG) -- diff --git a/Moose Development/Moose/AI/AI_Patrol.lua b/Moose Development/Moose/AI/AI_Patrol.lua index b925325a5..73ebe0094 100644 --- a/Moose Development/Moose/AI/AI_Patrol.lua +++ b/Moose Development/Moose/AI/AI_Patrol.lua @@ -1,5 +1,4 @@ ---- Single-Player:**Yes** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**Air** -- --- **Air Patrolling or Staging.** +--- **AI** -- **Air Patrolling or Staging.** -- -- ![Banner Image](..\Presentations\AI_PATROL\Dia1.JPG) -- diff --git a/Moose Development/Moose/Actions/Act_Account.lua b/Moose Development/Moose/Actions/Act_Account.lua index 4fb1fb3f2..14e83b07f 100644 --- a/Moose Development/Moose/Actions/Act_Account.lua +++ b/Moose Development/Moose/Actions/Act_Account.lua @@ -1,71 +1,6 @@ ---- (SP) (MP) (FSM) Account for (Detect, count and report) DCS events occuring on DCS objects (units). +--- **Actions** - ACT_ACCOUNT_ classes **account for** (detect, count & report) various DCS events occuring on @{Unit}s. -- --- === --- --- # @{#ACT_ACCOUNT} FSM class, extends @{Fsm#FSM_PROCESS} --- --- ## ACT_ACCOUNT state machine: --- --- This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. --- All derived classes from this class will start with the class name, followed by a \_. See the relevant derived class descriptions below. --- Each derived class follows exactly the same process, using the same events and following the same state transitions, --- but will have **different implementation behaviour** upon each event or state transition. --- --- ### ACT_ACCOUNT **Events**: --- --- These are the events defined in this class: --- --- * **Start**: The process is started. The process will go into the Report state. --- * **Event**: A relevant event has occured that needs to be accounted for. The process will go into the Account state. --- * **Report**: The process is reporting to the player the accounting status of the DCS events. --- * **More**: There are more DCS events that need to be accounted for. The process will go back into the Report state. --- * **NoMore**: There are no more DCS events that need to be accounted for. The process will go into the Success state. --- --- ### ACT_ACCOUNT **Event methods**: --- --- Event methods are available (dynamically allocated by the state machine), that accomodate for state transitions occurring in the process. --- There are two types of event methods, which you can use to influence the normal mechanisms in the state machine: --- --- * **Immediate**: The event method has exactly the name of the event. --- * **Delayed**: The event method starts with a __ + the name of the event. The first parameter of the event method is a number value, expressing the delay in seconds when the event will be executed. --- --- ### ACT_ACCOUNT **States**: --- --- * **Assigned**: The player is assigned to the task. This is the initialization state for the process. --- * **Waiting**: the process is waiting for a DCS event to occur within the simulator. This state is set automatically. --- * **Report**: The process is Reporting to the players in the group of the unit. This state is set automatically every 30 seconds. --- * **Account**: The relevant DCS event has occurred, and is accounted for. --- * **Success (*)**: All DCS events were accounted for. --- * **Failed (*)**: The process has failed. --- --- (*) End states of the process. --- --- ### ACT_ACCOUNT state transition methods: --- --- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. --- There are 2 moments when state transition methods will be called by the state machine: --- --- * **Before** the state transition. --- The state transition method needs to start with the name **OnBefore + the name of the state**. --- If the state transition method returns false, then the processing of the state transition will not be done! --- If you want to change the behaviour of the AIControllable at this event, return false, --- but then you'll need to specify your own logic using the AIControllable! --- --- * **After** the state transition. --- The state transition method needs to start with the name **OnAfter + the name of the state**. --- These state transition methods need to provide a return value, which is specified at the function description. --- --- # 1) @{#ACT_ACCOUNT_DEADS} FSM class, extends @{Fsm.Account#ACT_ACCOUNT} --- --- The ACT_ACCOUNT_DEADS class accounts (detects, counts and reports) successful kills of DCS units. --- The process is given a @{Set} of units that will be tracked upon successful destruction. --- The process will end after each target has been successfully destroyed. --- Each successful dead will trigger an Account state transition that can be scored, modified or administered. --- --- --- ## ACT_ACCOUNT_DEADS constructor: --- --- * @{#ACT_ACCOUNT_DEADS.New}(): Creates a new ACT_ACCOUNT_DEADS object. +-- ![Banner Image](..\Presentations\ACT_ACCOUNT\Dia1.JPG) -- -- === -- @@ -74,7 +9,51 @@ do -- ACT_ACCOUNT - --- ACT_ACCOUNT class + --- # @{#ACT_ACCOUNT} FSM class, extends @{Fsm#FSM_PROCESS} + -- + -- ## ACT_ACCOUNT state machine: + -- + -- This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. + -- All derived classes from this class will start with the class name, followed by a \_. See the relevant derived class descriptions below. + -- Each derived class follows exactly the same process, using the same events and following the same state transitions, + -- but will have **different implementation behaviour** upon each event or state transition. + -- + -- ### ACT_ACCOUNT States + -- + -- * **Asigned**: The player is assigned. + -- * **Waiting**: Waiting for an event. + -- * **Report**: Reporting. + -- * **Account**: Account for an event. + -- * **Accounted**: All events have been accounted for, end of the process. + -- * **Failed**: Failed the process. + -- + -- ### ACT_ACCOUNT Events + -- + -- * **Start**: Start the process. + -- * **Wait**: Wait for an event. + -- * **Report**: Report the status of the accounting. + -- * **Event**: An event happened, process the event. + -- * **More**: More targets. + -- * **NoMore (*)**: No more targets. + -- * **Fail (*)**: The action process has failed. + -- + -- (*) End states of the process. + -- + -- ### ACT_ACCOUNT state transition methods: + -- + -- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. + -- There are 2 moments when state transition methods will be called by the state machine: + -- + -- * **Before** the state transition. + -- The state transition method needs to start with the name **OnBefore + the name of the state**. + -- If the state transition method returns false, then the processing of the state transition will not be done! + -- If you want to change the behaviour of the AIControllable at this event, return false, + -- but then you'll need to specify your own logic using the AIControllable! + -- + -- * **After** the state transition. + -- The state transition method needs to start with the name **OnAfter + the name of the state**. + -- These state transition methods need to provide a return value, which is specified at the function description. + -- -- @type ACT_ACCOUNT -- @field Set#SET_UNIT TargetSetUnit -- @extends Core.Fsm#FSM_PROCESS @@ -156,7 +135,18 @@ end -- ACT_ACCOUNT do -- ACT_ACCOUNT_DEADS - --- ACT_ACCOUNT_DEADS class + --- # @{#ACT_ACCOUNT_DEADS} FSM class, extends @{Fsm.Account#ACT_ACCOUNT} + -- + -- The ACT_ACCOUNT_DEADS class accounts (detects, counts and reports) successful kills of DCS units. + -- The process is given a @{Set} of units that will be tracked upon successful destruction. + -- The process will end after each target has been successfully destroyed. + -- Each successful dead will trigger an Account state transition that can be scored, modified or administered. + -- + -- + -- ## ACT_ACCOUNT_DEADS constructor: + -- + -- * @{#ACT_ACCOUNT_DEADS.New}(): Creates a new ACT_ACCOUNT_DEADS object. + -- -- @type ACT_ACCOUNT_DEADS -- @field Set#SET_UNIT TargetSetUnit -- @extends #ACT_ACCOUNT @@ -200,7 +190,7 @@ do -- ACT_ACCOUNT_DEADS -- @param #string Event -- @param #string From -- @param #string To - function ACT_ACCOUNT_DEADS:onenterReport( ProcessUnit, From, Event, To ) + function ACT_ACCOUNT_DEADS:onenterReport( ProcessUnit, Task, From, Event, To ) self:E( { ProcessUnit, From, Event, To } ) self:Message( "Your group with assigned " .. self.TaskName .. " task has " .. self.TargetSetUnit:GetUnitTypesText() .. " targets left to be destroyed." ) @@ -213,17 +203,21 @@ do -- ACT_ACCOUNT_DEADS -- @param #string Event -- @param #string From -- @param #string To - function ACT_ACCOUNT_DEADS:onenterAccount( ProcessUnit, From, Event, To, EventData ) + function ACT_ACCOUNT_DEADS:onenterAccount( ProcessUnit, Task, From, Event, To, EventData ) self:T( { ProcessUnit, EventData, From, Event, To } ) self:T({self.Controllable}) self.TargetSetUnit:Flush() + self:T( { "Before sending Message", EventData.IniUnitName, self.TargetSetUnit:FindUnit( EventData.IniUnitName ) } ) if self.TargetSetUnit:FindUnit( EventData.IniUnitName ) then + self:T( "Sending Message" ) local TaskGroup = ProcessUnit:GetGroup() + self.TargetSetUnit:Remove( EventData.IniUnitName ) self:Message( "You hit a target. Your group with assigned " .. self.TaskName .. " task has " .. self.TargetSetUnit:Count() .. " targets ( " .. self.TargetSetUnit:GetUnitTypesText() .. " ) left to be destroyed." ) end + self:T( { "After sending Message" } ) end --- StateMachine callback function @@ -232,9 +226,9 @@ do -- ACT_ACCOUNT_DEADS -- @param #string Event -- @param #string From -- @param #string To - function ACT_ACCOUNT_DEADS:onafterEvent( ProcessUnit, From, Event, To, EventData ) + function ACT_ACCOUNT_DEADS:onafterEvent( ProcessUnit, Task, From, Event, To ) - if self.TargetSetUnit:Count() > 1 then + if self.TargetSetUnit:Count() > 0 then self:__More( 1 ) else self:__NoMore( 1 ) diff --git a/Moose Development/Moose/Functional/Detection.lua b/Moose Development/Moose/Functional/Detection.lua index 1a722ddde..43196e575 100644 --- a/Moose Development/Moose/Functional/Detection.lua +++ b/Moose Development/Moose/Functional/Detection.lua @@ -1,238 +1,6 @@ ---- This module contains the DETECTION classes. +--- **Functional** - DETECTION_ classes model the detection of enemy units by FACs or RECCEs and group them according various methods. -- --- === --- --- # 1) @{#DETECTION_BASE} class, extends @{Fsm#FSM} --- --- The @{#DETECTION_BASE} class defines the core functions to administer detected objects. --- The @{#DETECTION_BASE} class will detect objects within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s). --- --- ## 1.1) DETECTION_BASE constructor --- --- Construct a new DETECTION_BASE instance using the @{#DETECTION_BASE.New}() method. --- --- ## 1.2) DETECTION_BASE initialization --- --- By default, detection will return detected objects with all the detection sensors available. --- However, you can ask how the objects were found with specific detection methods. --- If you use one of the below methods, the detection will work with the detection method specified. --- You can specify to apply multiple detection methods. --- --- Use the following functions to report the objects it detected using the methods Visual, Optical, Radar, IRST, RWR, DLINK: --- --- * @{#DETECTION_BASE.InitDetectVisual}(): Detected using Visual. --- * @{#DETECTION_BASE.InitDetectOptical}(): Detected using Optical. --- * @{#DETECTION_BASE.InitDetectRadar}(): Detected using Radar. --- * @{#DETECTION_BASE.InitDetectIRST}(): Detected using IRST. --- * @{#DETECTION_BASE.InitDetectRWR}(): Detected using RWR. --- * @{#DETECTION_BASE.InitDetectDLINK}(): Detected using DLINK. --- --- ## 1.3) DETECTION_BASE derived classes group the detected units into a DetectedItems[] list --- --- DETECTION_BASE derived classes build a list called DetectedItems[], which is essentially a first later --- of grouping of detected units. Each DetectedItem within the DetectedItems[] list contains --- a SET_UNIT object that contains the detected units that belong to that group. --- --- Derived classes will apply different methods to group the detected units. --- Examples are per area, per quadrant, per distance, per type. --- See further the derived DETECTION classes on which grouping methods are currently supported. --- --- Various methods exist how to retrieve the grouped items from a DETECTION_BASE derived class: --- --- * The method @{Detection#DETECTION_BASE.GetDetectedItems}() retrieves the DetectedItems[] list. --- * A DetectedItem from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedItem}( DetectedItemIndex ). --- Note that this method returns a DetectedItem element from the list, that contains a Set variable and further information --- about the DetectedItem that is set by the DETECTION_BASE derived classes, used to group the DetectedItem. --- * A DetectedSet from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedSet}( DetectedItemIndex ). --- This method retrieves the Set from a DetectedItem element from the DetectedItem list (DetectedItems[ DetectedItemIndex ].Set ). --- --- ## 1.4) Apply additional Filters to fine-tune the detected objects --- --- By default, DCS World will return any object that is in LOS and within "visual reach", or detectable through one of the electronic detection means. --- That being said, the DCS World detection algorithm can sometimes be unrealistic. --- Especially for a visual detection, DCS World is able to report within 1 second a detailed detection of a group of 20 units (including types of the units) that are 10 kilometers away, using only visual capabilities. --- Additionally, trees and other obstacles are not accounted during the DCS World detection. --- --- Therefore, an additional (optional) filtering has been built into the DETECTION_BASE class, that can be set for visual detected units. --- For electronic detection, this filtering is not applied, only for visually detected targets. --- --- The following additional filtering can be applied for visual filtering: --- --- * A probability factor per kilometer distance. --- * A probability factor based on the alpha angle between the detected object and the unit detecting. --- A detection from a higher altitude allows for better detection than when on the ground. --- * Define a probability factor for "cloudy zones", which are zones where forests or villages are located. In these zones, detection will be much more difficult. --- The mission designer needs to define these cloudy zones within the mission, and needs to register these zones in the DETECTION_ objects additing a probability factor per zone. --- --- I advise however, that, when you first use the DETECTION derived classes, that you don't use these filters. --- Only when you experience unrealistic behaviour in your missions, these filters could be applied. --- --- ### 1.4.1 ) Distance visual detection probability --- --- Upon a **visual** detection, the further away a detected object is, the less likely it is to be detected properly. --- Also, the speed of accurate detection plays a role. --- --- A distance probability factor between 0 and 1 can be given, that will model a linear extrapolated probability over 10 km distance. --- --- For example, if a probability factor of 0.6 (60%) is given, the extrapolated probabilities over 15 kilometers would like like: --- 1 km: 96%, 2 km: 92%, 3 km: 88%, 4 km: 84%, 5 km: 80%, 6 km: 76%, 7 km: 72%, 8 km: 68%, 9 km: 64%, 10 km: 60%, 11 km: 56%, 12 km: 52%, 13 km: 48%, 14 km: 44%, 15 km: 40%. --- --- Note that based on this probability factor, not only the detection but also the **type** of the unit will be applied! --- --- Use the method @{Detection#DETECTION_BASE.SetDistanceProbability}() to set the probability factor upon a 10 km distance. --- --- ### 1.4.2 ) Alpha Angle visual detection probability --- --- Upon a **visual** detection, the higher the unit is during the detecting process, the more likely the detected unit is to be detected properly. --- A detection at a 90% alpha angle is the most optimal, a detection at 10% is less and a detection at 0% is less likely to be correct. --- --- A probability factor between 0 and 1 can be given, that will model a progressive extrapolated probability if the target would be detected at a 0° angle. --- --- For example, if a alpha angle probability factor of 0.7 is given, the extrapolated probabilities of the different angles would look like: --- 0°: 70%, 10°: 75,21%, 20°: 80,26%, 30°: 85%, 40°: 89,28%, 50°: 92,98%, 60°: 95,98%, 70°: 98,19%, 80°: 99,54%, 90°: 100% --- --- Use the method @{Detection#DETECTION_BASE.SetAlphaAngleProbability}() to set the probability factor if 0°. --- --- ### 1.4.3 ) Cloudy Zones detection probability --- --- Upon a **visual** detection, the more a detected unit is within a cloudy zone, the less likely the detected unit is to be detected successfully. --- The Cloudy Zones work with the ZONE_BASE derived classes. The mission designer can define within the mission --- zones that reflect cloudy areas where detected units may not be so easily visually detected. --- --- Use the method @{Detection#DETECTION_BASE.SetZoneProbability}() to set for a defined number of zones, the probability factors. --- --- Note however, that the more zones are defined to be "cloudy" within a detection, the more performance it will take --- from the DETECTION_BASE to calculate the presence of the detected unit within each zone. --- Expecially for ZONE_POLYGON, try to limit the amount of nodes of the polygon! --- --- Typically, this kind of filter would be applied for very specific areas were a detection needs to be very realisting for --- AI not to detect so easily targets within a forrest or village rich area. --- --- ## 1.5 ) Accept / Reject detected units --- --- DETECTION_BASE can accept or reject successful detections based on the location of the detected object, --- if it is located in range or located inside or outside of specific zones. --- --- ### 1.5.1 ) Detection acceptance of within range limit --- --- A range can be set that will limit a successful detection for a unit. --- Use the method @{Detection#DETECTION_BASE.SetAcceptRange}() to apply a range in meters till where detected units will be accepted. --- --- 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 ) --- --- -- This will accept detected units if the range is below 5000 meters. --- Detection:SetAcceptRange( 5000 ) --- --- -- Start the Detection. --- Detection:Start() --- --- --- ### 1.5.2 ) Detection acceptance if within zone(s). --- --- Specific ZONE_BASE object(s) can be given as a parameter, which will only accept a detection if the unit is within the specified ZONE_BASE object(s). --- Use the method @{Detection#DETECTION_BASE.SetAcceptZones}() will accept detected units if they are within the specified zones. --- --- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. --- --- -- Search fo the zones where units are to be accepted. --- local ZoneAccept1 = ZONE:New( "AcceptZone1" ) --- local ZoneAccept2 = ZONE:New( "AcceptZone2" ) --- --- -- Build a detect object. --- local Detection = DETECTION_BASE:New( SetGroup ) --- --- -- This will accept detected units by Detection when the unit is within ZoneAccept1 OR ZoneAccept2. --- Detection:SetAcceptZones( { ZoneAccept1, ZoneAccept2 } ) --- --- -- Start the Detection. --- Detection:Start() --- --- ### 1.5.3 ) Detection rejectance if within zone(s). --- --- Specific ZONE_BASE object(s) can be given as a parameter, which will reject detection if the unit is within the specified ZONE_BASE object(s). --- Use the method @{Detection#DETECTION_BASE.SetRejectZones}() will reject detected units if they are within the specified zones. --- An example of how to use the method is shown below. --- --- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. --- --- -- Search fo the zones where units are to be rejected. --- local ZoneReject1 = ZONE:New( "RejectZone1" ) --- local ZoneReject2 = ZONE:New( "RejectZone2" ) --- --- -- Build a detect object. --- local Detection = DETECTION_BASE:New( SetGroup ) --- --- -- This will reject detected units by Detection when the unit is within ZoneReject1 OR ZoneReject2. --- Detection:SetRejectZones( { ZoneReject1, ZoneReject2 } ) --- --- -- Start the Detection. --- Detection:Start() --- --- ## 1.6) DETECTION_BASE is a Finite State Machine --- --- Various Events and State Transitions can be tailored using DETECTION_BASE. --- --- ### 1.6.1) DETECTION_BASE States --- --- * **Detecting**: The detection is running. --- * **Stopped**: The detection is stopped. --- --- ### 1.6.2) DETECTION_BASE Events --- --- * **Start**: Start the detection process. --- * **Detect**: Detect new units. --- * **Detected**: New units have been detected. --- * **Stop**: Stop the detection process. --- --- === --- --- # 2) @{Detection#DETECTION_UNITS} class, extends @{Detection#DETECTION_BASE} --- --- The @{Detection#DETECTION_UNITS} class will detect units within the battle zone. --- It will build a DetectedItems list filled with DetectedItems. Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. --- Beware that when the amount of units detected is large, the DetectedItems list will be large also. --- --- # 3) @{Detection#DETECTION_TYPES} class, extends @{Detection#DETECTION_BASE} --- --- The @{Detection#DETECTION_TYPES} class will detect units within the battle zone. --- It will build a DetectedItems[] list filled with DetectedItems, grouped by the type of units detected. --- Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. --- Beware that when the amount of different types detected is large, the DetectedItems[] list will be large also. --- --- # 4) @{Detection#DETECTION_AREAS} class, extends @{Detection#DETECTION_BASE} --- --- The @{Detection#DETECTION_AREAS} class will detect units within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s), --- and will build a list (table) of @{Set#SET_UNIT}s containing the @{Unit#UNIT}s detected. --- The class is group the detected units within zones given a DetectedZoneRange parameter. --- A set with multiple detected zones will be created as there are groups of units detected. --- --- ## 4.1) Retrieve the Detected Unit Sets and Detected Zones --- --- The methods to manage the DetectedItems[].Set(s) are implemented in @{Detection#DECTECTION_BASE} and --- the methods to manage the DetectedItems[].Zone(s) is implemented in @{Detection#DETECTION_AREAS}. --- --- Retrieve the DetectedItems[].Set with the method @{Detection#DETECTION_BASE.GetDetectedSet}(). A @{Set#SET_UNIT} object will be returned. --- --- Retrieve the formed @{Zone@ZONE_UNIT}s as a result of the grouping the detected units within the DetectionZoneRange, use the method @{Detection#DETECTION_BASE.GetDetectionZones}(). --- To understand the amount of zones created, use the method @{Detection#DETECTION_BASE.GetDetectionZoneCount}(). --- If you want to obtain a specific zone from the DetectedZones, use the method @{Detection#DETECTION_BASE.GetDetectionZone}() with a given index. --- --- ## 4.4) Flare or Smoke detected units --- --- Use the methods @{Detection#DETECTION_AREAS.FlareDetectedUnits}() or @{Detection#DETECTION_AREAS.SmokeDetectedUnits}() to flare or smoke the detected units when a new detection has taken place. --- --- ## 4.5) Flare or Smoke or Bound detected zones --- --- Use the methods: --- --- * @{Detection#DETECTION_AREAS.FlareDetectedZones}() to flare in a color --- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to smoke in a color --- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to bound with a tire with a white flag --- --- the detected zones when a new detection has taken place. +-- ![Banner Image](..\Presentations\DETECTION\Dia1.JPG) -- -- === -- @@ -249,7 +17,191 @@ do -- DETECTION_BASE - --- DETECTION_BASE class + --- # 1) DETECTION_BASE class, extends @{Fsm#FSM} + -- + -- The DETECTION_BASE class defines the core functions to administer detected objects. + -- The DETECTION_BASE class will detect objects within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s). + -- + -- ## 1.1) DETECTION_BASE constructor + -- + -- Construct a new DETECTION_BASE instance using the @{#DETECTION_BASE.New}() method. + -- + -- ## 1.2) DETECTION_BASE initialization + -- + -- By default, detection will return detected objects with all the detection sensors available. + -- However, you can ask how the objects were found with specific detection methods. + -- If you use one of the below methods, the detection will work with the detection method specified. + -- You can specify to apply multiple detection methods. + -- + -- Use the following functions to report the objects it detected using the methods Visual, Optical, Radar, IRST, RWR, DLINK: + -- + -- * @{#DETECTION_BASE.InitDetectVisual}(): Detected using Visual. + -- * @{#DETECTION_BASE.InitDetectOptical}(): Detected using Optical. + -- * @{#DETECTION_BASE.InitDetectRadar}(): Detected using Radar. + -- * @{#DETECTION_BASE.InitDetectIRST}(): Detected using IRST. + -- * @{#DETECTION_BASE.InitDetectRWR}(): Detected using RWR. + -- * @{#DETECTION_BASE.InitDetectDLINK}(): Detected using DLINK. + -- + -- ## 1.3) DETECTION_BASE derived classes group the detected units into a DetectedItems[] list + -- + -- DETECTION_BASE derived classes build a list called DetectedItems[], which is essentially a first later + -- of grouping of detected units. Each DetectedItem within the DetectedItems[] list contains + -- a SET_UNIT object that contains the detected units that belong to that group. + -- + -- Derived classes will apply different methods to group the detected units. + -- Examples are per area, per quadrant, per distance, per type. + -- See further the derived DETECTION classes on which grouping methods are currently supported. + -- + -- Various methods exist how to retrieve the grouped items from a DETECTION_BASE derived class: + -- + -- * The method @{Detection#DETECTION_BASE.GetDetectedItems}() retrieves the DetectedItems[] list. + -- * A DetectedItem from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedItem}( DetectedItemIndex ). + -- Note that this method returns a DetectedItem element from the list, that contains a Set variable and further information + -- about the DetectedItem that is set by the DETECTION_BASE derived classes, used to group the DetectedItem. + -- * A DetectedSet from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedSet}( DetectedItemIndex ). + -- This method retrieves the Set from a DetectedItem element from the DetectedItem list (DetectedItems[ DetectedItemIndex ].Set ). + -- + -- ## 1.4) Apply additional Filters to fine-tune the detected objects + -- + -- By default, DCS World will return any object that is in LOS and within "visual reach", or detectable through one of the electronic detection means. + -- That being said, the DCS World detection algorithm can sometimes be unrealistic. + -- Especially for a visual detection, DCS World is able to report within 1 second a detailed detection of a group of 20 units (including types of the units) that are 10 kilometers away, using only visual capabilities. + -- Additionally, trees and other obstacles are not accounted during the DCS World detection. + -- + -- Therefore, an additional (optional) filtering has been built into the DETECTION_BASE class, that can be set for visual detected units. + -- For electronic detection, this filtering is not applied, only for visually detected targets. + -- + -- The following additional filtering can be applied for visual filtering: + -- + -- * A probability factor per kilometer distance. + -- * A probability factor based on the alpha angle between the detected object and the unit detecting. + -- A detection from a higher altitude allows for better detection than when on the ground. + -- * Define a probability factor for "cloudy zones", which are zones where forests or villages are located. In these zones, detection will be much more difficult. + -- The mission designer needs to define these cloudy zones within the mission, and needs to register these zones in the DETECTION_ objects additing a probability factor per zone. + -- + -- I advise however, that, when you first use the DETECTION derived classes, that you don't use these filters. + -- Only when you experience unrealistic behaviour in your missions, these filters could be applied. + -- + -- ### 1.4.1 ) Distance visual detection probability + -- + -- Upon a **visual** detection, the further away a detected object is, the less likely it is to be detected properly. + -- Also, the speed of accurate detection plays a role. + -- + -- A distance probability factor between 0 and 1 can be given, that will model a linear extrapolated probability over 10 km distance. + -- + -- For example, if a probability factor of 0.6 (60%) is given, the extrapolated probabilities over 15 kilometers would like like: + -- 1 km: 96%, 2 km: 92%, 3 km: 88%, 4 km: 84%, 5 km: 80%, 6 km: 76%, 7 km: 72%, 8 km: 68%, 9 km: 64%, 10 km: 60%, 11 km: 56%, 12 km: 52%, 13 km: 48%, 14 km: 44%, 15 km: 40%. + -- + -- Note that based on this probability factor, not only the detection but also the **type** of the unit will be applied! + -- + -- Use the method @{Detection#DETECTION_BASE.SetDistanceProbability}() to set the probability factor upon a 10 km distance. + -- + -- ### 1.4.2 ) Alpha Angle visual detection probability + -- + -- Upon a **visual** detection, the higher the unit is during the detecting process, the more likely the detected unit is to be detected properly. + -- A detection at a 90% alpha angle is the most optimal, a detection at 10% is less and a detection at 0% is less likely to be correct. + -- + -- A probability factor between 0 and 1 can be given, that will model a progressive extrapolated probability if the target would be detected at a 0° angle. + -- + -- For example, if a alpha angle probability factor of 0.7 is given, the extrapolated probabilities of the different angles would look like: + -- 0°: 70%, 10°: 75,21%, 20°: 80,26%, 30°: 85%, 40°: 89,28%, 50°: 92,98%, 60°: 95,98%, 70°: 98,19%, 80°: 99,54%, 90°: 100% + -- + -- Use the method @{Detection#DETECTION_BASE.SetAlphaAngleProbability}() to set the probability factor if 0°. + -- + -- ### 1.4.3 ) Cloudy Zones detection probability + -- + -- Upon a **visual** detection, the more a detected unit is within a cloudy zone, the less likely the detected unit is to be detected successfully. + -- The Cloudy Zones work with the ZONE_BASE derived classes. The mission designer can define within the mission + -- zones that reflect cloudy areas where detected units may not be so easily visually detected. + -- + -- Use the method @{Detection#DETECTION_BASE.SetZoneProbability}() to set for a defined number of zones, the probability factors. + -- + -- Note however, that the more zones are defined to be "cloudy" within a detection, the more performance it will take + -- from the DETECTION_BASE to calculate the presence of the detected unit within each zone. + -- Expecially for ZONE_POLYGON, try to limit the amount of nodes of the polygon! + -- + -- Typically, this kind of filter would be applied for very specific areas were a detection needs to be very realisting for + -- AI not to detect so easily targets within a forrest or village rich area. + -- + -- ## 1.5 ) Accept / Reject detected units + -- + -- DETECTION_BASE can accept or reject successful detections based on the location of the detected object, + -- if it is located in range or located inside or outside of specific zones. + -- + -- ### 1.5.1 ) Detection acceptance of within range limit + -- + -- A range can be set that will limit a successful detection for a unit. + -- Use the method @{Detection#DETECTION_BASE.SetAcceptRange}() to apply a range in meters till where detected units will be accepted. + -- + -- 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 ) + -- + -- -- This will accept detected units if the range is below 5000 meters. + -- Detection:SetAcceptRange( 5000 ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- + -- ### 1.5.2 ) Detection acceptance if within zone(s). + -- + -- Specific ZONE_BASE object(s) can be given as a parameter, which will only accept a detection if the unit is within the specified ZONE_BASE object(s). + -- Use the method @{Detection#DETECTION_BASE.SetAcceptZones}() will accept detected units if they are within the specified zones. + -- + -- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. + -- + -- -- Search fo the zones where units are to be accepted. + -- local ZoneAccept1 = ZONE:New( "AcceptZone1" ) + -- local ZoneAccept2 = ZONE:New( "AcceptZone2" ) + -- + -- -- Build a detect object. + -- local Detection = DETECTION_BASE:New( SetGroup ) + -- + -- -- This will accept detected units by Detection when the unit is within ZoneAccept1 OR ZoneAccept2. + -- Detection:SetAcceptZones( { ZoneAccept1, ZoneAccept2 } ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- ### 1.5.3 ) Detection rejectance if within zone(s). + -- + -- Specific ZONE_BASE object(s) can be given as a parameter, which will reject detection if the unit is within the specified ZONE_BASE object(s). + -- Use the method @{Detection#DETECTION_BASE.SetRejectZones}() will reject detected units if they are within the specified zones. + -- An example of how to use the method is shown below. + -- + -- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. + -- + -- -- Search fo the zones where units are to be rejected. + -- local ZoneReject1 = ZONE:New( "RejectZone1" ) + -- local ZoneReject2 = ZONE:New( "RejectZone2" ) + -- + -- -- Build a detect object. + -- local Detection = DETECTION_BASE:New( SetGroup ) + -- + -- -- This will reject detected units by Detection when the unit is within ZoneReject1 OR ZoneReject2. + -- Detection:SetRejectZones( { ZoneReject1, ZoneReject2 } ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- ## 1.6) DETECTION_BASE is a Finite State Machine + -- + -- Various Events and State Transitions can be tailored using DETECTION_BASE. + -- + -- ### 1.6.1) DETECTION_BASE States + -- + -- * **Detecting**: The detection is running. + -- * **Stopped**: The detection is stopped. + -- + -- ### 1.6.2) DETECTION_BASE Events + -- + -- * **Start**: Start the detection process. + -- * **Detect**: Detect new units. + -- * **Detected**: New units have been detected. + -- * **Stop**: Stop the detection process. + -- -- @type DETECTION_BASE -- @field Core.Set#SET_GROUP DetectionSetGroup The @{Set} of GROUPs in the Forward Air Controller role. -- @field Dcs.DCSTypes#Distance DetectionRange The range till which targets are accepted to be detected. @@ -1222,7 +1174,12 @@ end do -- DETECTION_UNITS - --- DETECTION_UNITS class + --- # 2) DETECTION_UNITS class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_UNITS class will detect units within the battle zone. + -- It will build a DetectedItems list filled with DetectedItems. Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. + -- Beware that when the amount of units detected is large, the DetectedItems list will be large also. + -- -- @type DETECTION_UNITS -- @field Dcs.DCSTypes#Distance DetectionRange The range till which targets are detected. -- @extends #DETECTION_BASE @@ -1432,7 +1389,13 @@ end do -- DETECTION_TYPES - --- DETECTION_TYPES class + --- # 3) DETECTION_TYPES class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_TYPES class will detect units within the battle zone. + -- It will build a DetectedItems[] list filled with DetectedItems, grouped by the type of units detected. + -- Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. + -- Beware that when the amount of different types detected is large, the DetectedItems[] list will be large also. + -- -- @type DETECTION_TYPES -- @extends #DETECTION_BASE DETECTION_TYPES = { @@ -1615,7 +1578,38 @@ end do -- DETECTION_AREAS - --- DETECTION_AREAS class + --- # 4) DETECTION_AREAS class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_AREAS class will detect units within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s), + -- and will build a list (table) of @{Set#SET_UNIT}s containing the @{Unit#UNIT}s detected. + -- The class is group the detected units within zones given a DetectedZoneRange parameter. + -- A set with multiple detected zones will be created as there are groups of units detected. + -- + -- ## 4.1) Retrieve the Detected Unit Sets and Detected Zones + -- + -- The methods to manage the DetectedItems[].Set(s) are implemented in @{Detection#DECTECTION_BASE} and + -- the methods to manage the DetectedItems[].Zone(s) is implemented in @{Detection#DETECTION_AREAS}. + -- + -- Retrieve the DetectedItems[].Set with the method @{Detection#DETECTION_BASE.GetDetectedSet}(). A @{Set#SET_UNIT} object will be returned. + -- + -- Retrieve the formed @{Zone@ZONE_UNIT}s as a result of the grouping the detected units within the DetectionZoneRange, use the method @{Detection#DETECTION_BASE.GetDetectionZones}(). + -- To understand the amount of zones created, use the method @{Detection#DETECTION_BASE.GetDetectionZoneCount}(). + -- If you want to obtain a specific zone from the DetectedZones, use the method @{Detection#DETECTION_BASE.GetDetectionZone}() with a given index. + -- + -- ## 4.4) Flare or Smoke detected units + -- + -- Use the methods @{Detection#DETECTION_AREAS.FlareDetectedUnits}() or @{Detection#DETECTION_AREAS.SmokeDetectedUnits}() to flare or smoke the detected units when a new detection has taken place. + -- + -- ## 4.5) Flare or Smoke or Bound detected zones + -- + -- Use the methods: + -- + -- * @{Detection#DETECTION_AREAS.FlareDetectedZones}() to flare in a color + -- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to smoke in a color + -- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to bound with a tire with a white flag + -- + -- the detected zones when a new detection has taken place. + -- -- @type DETECTION_AREAS -- @field Dcs.DCSTypes#Distance DetectionZoneRange The range till which targets are grouped upon the first detected target. -- @field #DETECTION_BASE.DetectedItems DetectedItems A list of areas containing the set of @{Unit}s, @{Zone}s, the center @{Unit} within the zone, and ID of each area that was detected within a DetectionZoneRange. diff --git a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua index e5186ebf1..474b30833 100644 --- a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua +++ b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua @@ -245,7 +245,7 @@ do -- TASK_A2G_DISPATCHER 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:SetTargetZone( DetectedZone ) Task:SetDispatcher( self ) CASTask = Mission:AddTask( Task ) end diff --git a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua index 09b01c6a7..0d3429f64 100644 --- a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua +++ b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua @@ -1,5 +1,5 @@ env.info( '*** MOOSE STATIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20170319_0757' ) +env.info( 'Moose Generation Timestamp: 20170319_1459' ) local base = _G Include = {} @@ -25499,241 +25499,9 @@ end - --- This module contains the DETECTION classes. + --- **Functional** - DETECTION_ classes model the detection of enemy units by FACs or RECCEs and group them according various methods. -- --- === --- --- # 1) @{#DETECTION_BASE} class, extends @{Fsm#FSM} --- --- The @{#DETECTION_BASE} class defines the core functions to administer detected objects. --- The @{#DETECTION_BASE} class will detect objects within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s). --- --- ## 1.1) DETECTION_BASE constructor --- --- Construct a new DETECTION_BASE instance using the @{#DETECTION_BASE.New}() method. --- --- ## 1.2) DETECTION_BASE initialization --- --- By default, detection will return detected objects with all the detection sensors available. --- However, you can ask how the objects were found with specific detection methods. --- If you use one of the below methods, the detection will work with the detection method specified. --- You can specify to apply multiple detection methods. --- --- Use the following functions to report the objects it detected using the methods Visual, Optical, Radar, IRST, RWR, DLINK: --- --- * @{#DETECTION_BASE.InitDetectVisual}(): Detected using Visual. --- * @{#DETECTION_BASE.InitDetectOptical}(): Detected using Optical. --- * @{#DETECTION_BASE.InitDetectRadar}(): Detected using Radar. --- * @{#DETECTION_BASE.InitDetectIRST}(): Detected using IRST. --- * @{#DETECTION_BASE.InitDetectRWR}(): Detected using RWR. --- * @{#DETECTION_BASE.InitDetectDLINK}(): Detected using DLINK. --- --- ## 1.3) DETECTION_BASE derived classes group the detected units into a DetectedItems[] list --- --- DETECTION_BASE derived classes build a list called DetectedItems[], which is essentially a first later --- of grouping of detected units. Each DetectedItem within the DetectedItems[] list contains --- a SET_UNIT object that contains the detected units that belong to that group. --- --- Derived classes will apply different methods to group the detected units. --- Examples are per area, per quadrant, per distance, per type. --- See further the derived DETECTION classes on which grouping methods are currently supported. --- --- Various methods exist how to retrieve the grouped items from a DETECTION_BASE derived class: --- --- * The method @{Detection#DETECTION_BASE.GetDetectedItems}() retrieves the DetectedItems[] list. --- * A DetectedItem from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedItem}( DetectedItemIndex ). --- Note that this method returns a DetectedItem element from the list, that contains a Set variable and further information --- about the DetectedItem that is set by the DETECTION_BASE derived classes, used to group the DetectedItem. --- * A DetectedSet from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedSet}( DetectedItemIndex ). --- This method retrieves the Set from a DetectedItem element from the DetectedItem list (DetectedItems[ DetectedItemIndex ].Set ). --- --- ## 1.4) Apply additional Filters to fine-tune the detected objects --- --- By default, DCS World will return any object that is in LOS and within "visual reach", or detectable through one of the electronic detection means. --- That being said, the DCS World detection algorithm can sometimes be unrealistic. --- Especially for a visual detection, DCS World is able to report within 1 second a detailed detection of a group of 20 units (including types of the units) that are 10 kilometers away, using only visual capabilities. --- Additionally, trees and other obstacles are not accounted during the DCS World detection. --- --- Therefore, an additional (optional) filtering has been built into the DETECTION_BASE class, that can be set for visual detected units. --- For electronic detection, this filtering is not applied, only for visually detected targets. --- --- The following additional filtering can be applied for visual filtering: --- --- * A probability factor per kilometer distance. --- * A probability factor based on the alpha angle between the detected object and the unit detecting. --- A detection from a higher altitude allows for better detection than when on the ground. --- * Define a probability factor for "cloudy zones", which are zones where forests or villages are located. In these zones, detection will be much more difficult. --- The mission designer needs to define these cloudy zones within the mission, and needs to register these zones in the DETECTION_ objects additing a probability factor per zone. --- --- I advise however, that, when you first use the DETECTION derived classes, that you don't use these filters. --- Only when you experience unrealistic behaviour in your missions, these filters could be applied. --- --- ### 1.4.1 ) Distance visual detection probability --- --- Upon a **visual** detection, the further away a detected object is, the less likely it is to be detected properly. --- Also, the speed of accurate detection plays a role. --- --- A distance probability factor between 0 and 1 can be given, that will model a linear extrapolated probability over 10 km distance. --- --- For example, if a probability factor of 0.6 (60%) is given, the extrapolated probabilities over 15 kilometers would like like: --- 1 km: 96%, 2 km: 92%, 3 km: 88%, 4 km: 84%, 5 km: 80%, 6 km: 76%, 7 km: 72%, 8 km: 68%, 9 km: 64%, 10 km: 60%, 11 km: 56%, 12 km: 52%, 13 km: 48%, 14 km: 44%, 15 km: 40%. --- --- Note that based on this probability factor, not only the detection but also the **type** of the unit will be applied! --- --- Use the method @{Detection#DETECTION_BASE.SetDistanceProbability}() to set the probability factor upon a 10 km distance. --- --- ### 1.4.2 ) Alpha Angle visual detection probability --- --- Upon a **visual** detection, the higher the unit is during the detecting process, the more likely the detected unit is to be detected properly. --- A detection at a 90% alpha angle is the most optimal, a detection at 10% is less and a detection at 0% is less likely to be correct. --- --- A probability factor between 0 and 1 can be given, that will model a progressive extrapolated probability if the target would be detected at a 0° angle. --- --- For example, if a alpha angle probability factor of 0.7 is given, the extrapolated probabilities of the different angles would look like: --- 0°: 70%, 10°: 75,21%, 20°: 80,26%, 30°: 85%, 40°: 89,28%, 50°: 92,98%, 60°: 95,98%, 70°: 98,19%, 80°: 99,54%, 90°: 100% --- --- Use the method @{Detection#DETECTION_BASE.SetAlphaAngleProbability}() to set the probability factor if 0°. --- --- ### 1.4.3 ) Cloudy Zones detection probability --- --- Upon a **visual** detection, the more a detected unit is within a cloudy zone, the less likely the detected unit is to be detected successfully. --- The Cloudy Zones work with the ZONE_BASE derived classes. The mission designer can define within the mission --- zones that reflect cloudy areas where detected units may not be so easily visually detected. --- --- Use the method @{Detection#DETECTION_BASE.SetZoneProbability}() to set for a defined number of zones, the probability factors. --- --- Note however, that the more zones are defined to be "cloudy" within a detection, the more performance it will take --- from the DETECTION_BASE to calculate the presence of the detected unit within each zone. --- Expecially for ZONE_POLYGON, try to limit the amount of nodes of the polygon! --- --- Typically, this kind of filter would be applied for very specific areas were a detection needs to be very realisting for --- AI not to detect so easily targets within a forrest or village rich area. --- --- ## 1.5 ) Accept / Reject detected units --- --- DETECTION_BASE can accept or reject successful detections based on the location of the detected object, --- if it is located in range or located inside or outside of specific zones. --- --- ### 1.5.1 ) Detection acceptance of within range limit --- --- A range can be set that will limit a successful detection for a unit. --- Use the method @{Detection#DETECTION_BASE.SetAcceptRange}() to apply a range in meters till where detected units will be accepted. --- --- 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 ) --- --- -- This will accept detected units if the range is below 5000 meters. --- Detection:SetAcceptRange( 5000 ) --- --- -- Start the Detection. --- Detection:Start() --- --- --- ### 1.5.2 ) Detection acceptance if within zone(s). --- --- Specific ZONE_BASE object(s) can be given as a parameter, which will only accept a detection if the unit is within the specified ZONE_BASE object(s). --- Use the method @{Detection#DETECTION_BASE.SetAcceptZones}() will accept detected units if they are within the specified zones. --- --- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. --- --- -- Search fo the zones where units are to be accepted. --- local ZoneAccept1 = ZONE:New( "AcceptZone1" ) --- local ZoneAccept2 = ZONE:New( "AcceptZone2" ) --- --- -- Build a detect object. --- local Detection = DETECTION_BASE:New( SetGroup ) --- --- -- This will accept detected units by Detection when the unit is within ZoneAccept1 OR ZoneAccept2. --- Detection:SetAcceptZones( { ZoneAccept1, ZoneAccept2 } ) --- --- -- Start the Detection. --- Detection:Start() --- --- ### 1.5.3 ) Detection rejectance if within zone(s). --- --- Specific ZONE_BASE object(s) can be given as a parameter, which will reject detection if the unit is within the specified ZONE_BASE object(s). --- Use the method @{Detection#DETECTION_BASE.SetRejectZones}() will reject detected units if they are within the specified zones. --- An example of how to use the method is shown below. --- --- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. --- --- -- Search fo the zones where units are to be rejected. --- local ZoneReject1 = ZONE:New( "RejectZone1" ) --- local ZoneReject2 = ZONE:New( "RejectZone2" ) --- --- -- Build a detect object. --- local Detection = DETECTION_BASE:New( SetGroup ) --- --- -- This will reject detected units by Detection when the unit is within ZoneReject1 OR ZoneReject2. --- Detection:SetRejectZones( { ZoneReject1, ZoneReject2 } ) --- --- -- Start the Detection. --- Detection:Start() --- --- ## 1.6) DETECTION_BASE is a Finite State Machine --- --- Various Events and State Transitions can be tailored using DETECTION_BASE. --- --- ### 1.6.1) DETECTION_BASE States --- --- * **Detecting**: The detection is running. --- * **Stopped**: The detection is stopped. --- --- ### 1.6.2) DETECTION_BASE Events --- --- * **Start**: Start the detection process. --- * **Detect**: Detect new units. --- * **Detected**: New units have been detected. --- * **Stop**: Stop the detection process. --- --- === --- --- # 2) @{Detection#DETECTION_UNITS} class, extends @{Detection#DETECTION_BASE} --- --- The @{Detection#DETECTION_UNITS} class will detect units within the battle zone. --- It will build a DetectedItems list filled with DetectedItems. Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. --- Beware that when the amount of units detected is large, the DetectedItems list will be large also. --- --- # 3) @{Detection#DETECTION_TYPES} class, extends @{Detection#DETECTION_BASE} --- --- The @{Detection#DETECTION_TYPES} class will detect units within the battle zone. --- It will build a DetectedItems[] list filled with DetectedItems, grouped by the type of units detected. --- Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. --- Beware that when the amount of different types detected is large, the DetectedItems[] list will be large also. --- --- # 4) @{Detection#DETECTION_AREAS} class, extends @{Detection#DETECTION_BASE} --- --- The @{Detection#DETECTION_AREAS} class will detect units within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s), --- and will build a list (table) of @{Set#SET_UNIT}s containing the @{Unit#UNIT}s detected. --- The class is group the detected units within zones given a DetectedZoneRange parameter. --- A set with multiple detected zones will be created as there are groups of units detected. --- --- ## 4.1) Retrieve the Detected Unit Sets and Detected Zones --- --- The methods to manage the DetectedItems[].Set(s) are implemented in @{Detection#DECTECTION_BASE} and --- the methods to manage the DetectedItems[].Zone(s) is implemented in @{Detection#DETECTION_AREAS}. --- --- Retrieve the DetectedItems[].Set with the method @{Detection#DETECTION_BASE.GetDetectedSet}(). A @{Set#SET_UNIT} object will be returned. --- --- Retrieve the formed @{Zone@ZONE_UNIT}s as a result of the grouping the detected units within the DetectionZoneRange, use the method @{Detection#DETECTION_BASE.GetDetectionZones}(). --- To understand the amount of zones created, use the method @{Detection#DETECTION_BASE.GetDetectionZoneCount}(). --- If you want to obtain a specific zone from the DetectedZones, use the method @{Detection#DETECTION_BASE.GetDetectionZone}() with a given index. --- --- ## 4.4) Flare or Smoke detected units --- --- Use the methods @{Detection#DETECTION_AREAS.FlareDetectedUnits}() or @{Detection#DETECTION_AREAS.SmokeDetectedUnits}() to flare or smoke the detected units when a new detection has taken place. --- --- ## 4.5) Flare or Smoke or Bound detected zones --- --- Use the methods: --- --- * @{Detection#DETECTION_AREAS.FlareDetectedZones}() to flare in a color --- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to smoke in a color --- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to bound with a tire with a white flag --- --- the detected zones when a new detection has taken place. +-- ![Banner Image](..\Presentations\DETECTION\Dia1.JPG) -- -- === -- @@ -25750,7 +25518,191 @@ end do -- DETECTION_BASE - --- DETECTION_BASE class + --- # 1) DETECTION_BASE class, extends @{Fsm#FSM} + -- + -- The DETECTION_BASE class defines the core functions to administer detected objects. + -- The DETECTION_BASE class will detect objects within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s). + -- + -- ## 1.1) DETECTION_BASE constructor + -- + -- Construct a new DETECTION_BASE instance using the @{#DETECTION_BASE.New}() method. + -- + -- ## 1.2) DETECTION_BASE initialization + -- + -- By default, detection will return detected objects with all the detection sensors available. + -- However, you can ask how the objects were found with specific detection methods. + -- If you use one of the below methods, the detection will work with the detection method specified. + -- You can specify to apply multiple detection methods. + -- + -- Use the following functions to report the objects it detected using the methods Visual, Optical, Radar, IRST, RWR, DLINK: + -- + -- * @{#DETECTION_BASE.InitDetectVisual}(): Detected using Visual. + -- * @{#DETECTION_BASE.InitDetectOptical}(): Detected using Optical. + -- * @{#DETECTION_BASE.InitDetectRadar}(): Detected using Radar. + -- * @{#DETECTION_BASE.InitDetectIRST}(): Detected using IRST. + -- * @{#DETECTION_BASE.InitDetectRWR}(): Detected using RWR. + -- * @{#DETECTION_BASE.InitDetectDLINK}(): Detected using DLINK. + -- + -- ## 1.3) DETECTION_BASE derived classes group the detected units into a DetectedItems[] list + -- + -- DETECTION_BASE derived classes build a list called DetectedItems[], which is essentially a first later + -- of grouping of detected units. Each DetectedItem within the DetectedItems[] list contains + -- a SET_UNIT object that contains the detected units that belong to that group. + -- + -- Derived classes will apply different methods to group the detected units. + -- Examples are per area, per quadrant, per distance, per type. + -- See further the derived DETECTION classes on which grouping methods are currently supported. + -- + -- Various methods exist how to retrieve the grouped items from a DETECTION_BASE derived class: + -- + -- * The method @{Detection#DETECTION_BASE.GetDetectedItems}() retrieves the DetectedItems[] list. + -- * A DetectedItem from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedItem}( DetectedItemIndex ). + -- Note that this method returns a DetectedItem element from the list, that contains a Set variable and further information + -- about the DetectedItem that is set by the DETECTION_BASE derived classes, used to group the DetectedItem. + -- * A DetectedSet from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedSet}( DetectedItemIndex ). + -- This method retrieves the Set from a DetectedItem element from the DetectedItem list (DetectedItems[ DetectedItemIndex ].Set ). + -- + -- ## 1.4) Apply additional Filters to fine-tune the detected objects + -- + -- By default, DCS World will return any object that is in LOS and within "visual reach", or detectable through one of the electronic detection means. + -- That being said, the DCS World detection algorithm can sometimes be unrealistic. + -- Especially for a visual detection, DCS World is able to report within 1 second a detailed detection of a group of 20 units (including types of the units) that are 10 kilometers away, using only visual capabilities. + -- Additionally, trees and other obstacles are not accounted during the DCS World detection. + -- + -- Therefore, an additional (optional) filtering has been built into the DETECTION_BASE class, that can be set for visual detected units. + -- For electronic detection, this filtering is not applied, only for visually detected targets. + -- + -- The following additional filtering can be applied for visual filtering: + -- + -- * A probability factor per kilometer distance. + -- * A probability factor based on the alpha angle between the detected object and the unit detecting. + -- A detection from a higher altitude allows for better detection than when on the ground. + -- * Define a probability factor for "cloudy zones", which are zones where forests or villages are located. In these zones, detection will be much more difficult. + -- The mission designer needs to define these cloudy zones within the mission, and needs to register these zones in the DETECTION_ objects additing a probability factor per zone. + -- + -- I advise however, that, when you first use the DETECTION derived classes, that you don't use these filters. + -- Only when you experience unrealistic behaviour in your missions, these filters could be applied. + -- + -- ### 1.4.1 ) Distance visual detection probability + -- + -- Upon a **visual** detection, the further away a detected object is, the less likely it is to be detected properly. + -- Also, the speed of accurate detection plays a role. + -- + -- A distance probability factor between 0 and 1 can be given, that will model a linear extrapolated probability over 10 km distance. + -- + -- For example, if a probability factor of 0.6 (60%) is given, the extrapolated probabilities over 15 kilometers would like like: + -- 1 km: 96%, 2 km: 92%, 3 km: 88%, 4 km: 84%, 5 km: 80%, 6 km: 76%, 7 km: 72%, 8 km: 68%, 9 km: 64%, 10 km: 60%, 11 km: 56%, 12 km: 52%, 13 km: 48%, 14 km: 44%, 15 km: 40%. + -- + -- Note that based on this probability factor, not only the detection but also the **type** of the unit will be applied! + -- + -- Use the method @{Detection#DETECTION_BASE.SetDistanceProbability}() to set the probability factor upon a 10 km distance. + -- + -- ### 1.4.2 ) Alpha Angle visual detection probability + -- + -- Upon a **visual** detection, the higher the unit is during the detecting process, the more likely the detected unit is to be detected properly. + -- A detection at a 90% alpha angle is the most optimal, a detection at 10% is less and a detection at 0% is less likely to be correct. + -- + -- A probability factor between 0 and 1 can be given, that will model a progressive extrapolated probability if the target would be detected at a 0° angle. + -- + -- For example, if a alpha angle probability factor of 0.7 is given, the extrapolated probabilities of the different angles would look like: + -- 0°: 70%, 10°: 75,21%, 20°: 80,26%, 30°: 85%, 40°: 89,28%, 50°: 92,98%, 60°: 95,98%, 70°: 98,19%, 80°: 99,54%, 90°: 100% + -- + -- Use the method @{Detection#DETECTION_BASE.SetAlphaAngleProbability}() to set the probability factor if 0°. + -- + -- ### 1.4.3 ) Cloudy Zones detection probability + -- + -- Upon a **visual** detection, the more a detected unit is within a cloudy zone, the less likely the detected unit is to be detected successfully. + -- The Cloudy Zones work with the ZONE_BASE derived classes. The mission designer can define within the mission + -- zones that reflect cloudy areas where detected units may not be so easily visually detected. + -- + -- Use the method @{Detection#DETECTION_BASE.SetZoneProbability}() to set for a defined number of zones, the probability factors. + -- + -- Note however, that the more zones are defined to be "cloudy" within a detection, the more performance it will take + -- from the DETECTION_BASE to calculate the presence of the detected unit within each zone. + -- Expecially for ZONE_POLYGON, try to limit the amount of nodes of the polygon! + -- + -- Typically, this kind of filter would be applied for very specific areas were a detection needs to be very realisting for + -- AI not to detect so easily targets within a forrest or village rich area. + -- + -- ## 1.5 ) Accept / Reject detected units + -- + -- DETECTION_BASE can accept or reject successful detections based on the location of the detected object, + -- if it is located in range or located inside or outside of specific zones. + -- + -- ### 1.5.1 ) Detection acceptance of within range limit + -- + -- A range can be set that will limit a successful detection for a unit. + -- Use the method @{Detection#DETECTION_BASE.SetAcceptRange}() to apply a range in meters till where detected units will be accepted. + -- + -- 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 ) + -- + -- -- This will accept detected units if the range is below 5000 meters. + -- Detection:SetAcceptRange( 5000 ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- + -- ### 1.5.2 ) Detection acceptance if within zone(s). + -- + -- Specific ZONE_BASE object(s) can be given as a parameter, which will only accept a detection if the unit is within the specified ZONE_BASE object(s). + -- Use the method @{Detection#DETECTION_BASE.SetAcceptZones}() will accept detected units if they are within the specified zones. + -- + -- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. + -- + -- -- Search fo the zones where units are to be accepted. + -- local ZoneAccept1 = ZONE:New( "AcceptZone1" ) + -- local ZoneAccept2 = ZONE:New( "AcceptZone2" ) + -- + -- -- Build a detect object. + -- local Detection = DETECTION_BASE:New( SetGroup ) + -- + -- -- This will accept detected units by Detection when the unit is within ZoneAccept1 OR ZoneAccept2. + -- Detection:SetAcceptZones( { ZoneAccept1, ZoneAccept2 } ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- ### 1.5.3 ) Detection rejectance if within zone(s). + -- + -- Specific ZONE_BASE object(s) can be given as a parameter, which will reject detection if the unit is within the specified ZONE_BASE object(s). + -- Use the method @{Detection#DETECTION_BASE.SetRejectZones}() will reject detected units if they are within the specified zones. + -- An example of how to use the method is shown below. + -- + -- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. + -- + -- -- Search fo the zones where units are to be rejected. + -- local ZoneReject1 = ZONE:New( "RejectZone1" ) + -- local ZoneReject2 = ZONE:New( "RejectZone2" ) + -- + -- -- Build a detect object. + -- local Detection = DETECTION_BASE:New( SetGroup ) + -- + -- -- This will reject detected units by Detection when the unit is within ZoneReject1 OR ZoneReject2. + -- Detection:SetRejectZones( { ZoneReject1, ZoneReject2 } ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- ## 1.6) DETECTION_BASE is a Finite State Machine + -- + -- Various Events and State Transitions can be tailored using DETECTION_BASE. + -- + -- ### 1.6.1) DETECTION_BASE States + -- + -- * **Detecting**: The detection is running. + -- * **Stopped**: The detection is stopped. + -- + -- ### 1.6.2) DETECTION_BASE Events + -- + -- * **Start**: Start the detection process. + -- * **Detect**: Detect new units. + -- * **Detected**: New units have been detected. + -- * **Stop**: Stop the detection process. + -- -- @type DETECTION_BASE -- @field Core.Set#SET_GROUP DetectionSetGroup The @{Set} of GROUPs in the Forward Air Controller role. -- @field Dcs.DCSTypes#Distance DetectionRange The range till which targets are accepted to be detected. @@ -26723,7 +26675,12 @@ end do -- DETECTION_UNITS - --- DETECTION_UNITS class + --- # 2) DETECTION_UNITS class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_UNITS class will detect units within the battle zone. + -- It will build a DetectedItems list filled with DetectedItems. Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. + -- Beware that when the amount of units detected is large, the DetectedItems list will be large also. + -- -- @type DETECTION_UNITS -- @field Dcs.DCSTypes#Distance DetectionRange The range till which targets are detected. -- @extends #DETECTION_BASE @@ -26933,7 +26890,13 @@ end do -- DETECTION_TYPES - --- DETECTION_TYPES class + --- # 3) DETECTION_TYPES class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_TYPES class will detect units within the battle zone. + -- It will build a DetectedItems[] list filled with DetectedItems, grouped by the type of units detected. + -- Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. + -- Beware that when the amount of different types detected is large, the DetectedItems[] list will be large also. + -- -- @type DETECTION_TYPES -- @extends #DETECTION_BASE DETECTION_TYPES = { @@ -27116,7 +27079,38 @@ end do -- DETECTION_AREAS - --- DETECTION_AREAS class + --- # 4) DETECTION_AREAS class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_AREAS class will detect units within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s), + -- and will build a list (table) of @{Set#SET_UNIT}s containing the @{Unit#UNIT}s detected. + -- The class is group the detected units within zones given a DetectedZoneRange parameter. + -- A set with multiple detected zones will be created as there are groups of units detected. + -- + -- ## 4.1) Retrieve the Detected Unit Sets and Detected Zones + -- + -- The methods to manage the DetectedItems[].Set(s) are implemented in @{Detection#DECTECTION_BASE} and + -- the methods to manage the DetectedItems[].Zone(s) is implemented in @{Detection#DETECTION_AREAS}. + -- + -- Retrieve the DetectedItems[].Set with the method @{Detection#DETECTION_BASE.GetDetectedSet}(). A @{Set#SET_UNIT} object will be returned. + -- + -- Retrieve the formed @{Zone@ZONE_UNIT}s as a result of the grouping the detected units within the DetectionZoneRange, use the method @{Detection#DETECTION_BASE.GetDetectionZones}(). + -- To understand the amount of zones created, use the method @{Detection#DETECTION_BASE.GetDetectionZoneCount}(). + -- If you want to obtain a specific zone from the DetectedZones, use the method @{Detection#DETECTION_BASE.GetDetectionZone}() with a given index. + -- + -- ## 4.4) Flare or Smoke detected units + -- + -- Use the methods @{Detection#DETECTION_AREAS.FlareDetectedUnits}() or @{Detection#DETECTION_AREAS.SmokeDetectedUnits}() to flare or smoke the detected units when a new detection has taken place. + -- + -- ## 4.5) Flare or Smoke or Bound detected zones + -- + -- Use the methods: + -- + -- * @{Detection#DETECTION_AREAS.FlareDetectedZones}() to flare in a color + -- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to smoke in a color + -- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to bound with a tire with a white flag + -- + -- the detected zones when a new detection has taken place. + -- -- @type DETECTION_AREAS -- @field Dcs.DCSTypes#Distance DetectionZoneRange The range till which targets are grouped upon the first detected target. -- @field #DETECTION_BASE.DetectedItems DetectedItems A list of areas containing the set of @{Unit}s, @{Zone}s, the center @{Unit} within the zone, and ID of each area that was detected within a DetectionZoneRange. @@ -27861,8 +27855,7 @@ end ---- Single-Player:**Yes** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**Air** -- --- **Air Patrolling or Staging.** +--- **AI** -- **Air Patrolling or Staging.** -- -- ![Banner Image](..\Presentations\AI_PATROL\Dia1.JPG) -- @@ -28800,8 +28793,7 @@ function AI_PATROL_ZONE:OnPilotDead( EventData ) self:__PilotDead( 1, EventData ) end end ---- Single-Player:**Yes** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**Air** -- --- **Provide Close Air Support to friendly ground troops.** +--- **AI** -- **Provide Close Air Support to friendly ground troops.** -- -- ![Banner Image](..\Presentations\AI_CAS\Dia1.JPG) -- @@ -29375,7 +29367,7 @@ function AI_CAS_ZONE:OnEventDead( EventData ) end ---- Single-Player:**Yes** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**Air** -- **Execute Combat Air Patrol (CAP).** +--- **AI** - **Execute Combat Air Patrol (CAP).** -- -- ![Banner Image](..\Presentations\AI_CAP\Dia1.JPG) -- @@ -31625,74 +31617,9 @@ do -- ACT_ROUTE_ZONE end end -- ACT_ROUTE_ZONE ---- (SP) (MP) (FSM) Account for (Detect, count and report) DCS events occuring on DCS objects (units). +--- **Actions** - ACT_ACCOUNT_ classes **account for** (detect, count & report) various DCS events occuring on @{Unit}s. -- --- === --- --- # @{#ACT_ACCOUNT} FSM class, extends @{Fsm#FSM_PROCESS} --- --- ## ACT_ACCOUNT state machine: --- --- This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. --- All derived classes from this class will start with the class name, followed by a \_. See the relevant derived class descriptions below. --- Each derived class follows exactly the same process, using the same events and following the same state transitions, --- but will have **different implementation behaviour** upon each event or state transition. --- --- ### ACT_ACCOUNT **Events**: --- --- These are the events defined in this class: --- --- * **Start**: The process is started. The process will go into the Report state. --- * **Event**: A relevant event has occured that needs to be accounted for. The process will go into the Account state. --- * **Report**: The process is reporting to the player the accounting status of the DCS events. --- * **More**: There are more DCS events that need to be accounted for. The process will go back into the Report state. --- * **NoMore**: There are no more DCS events that need to be accounted for. The process will go into the Success state. --- --- ### ACT_ACCOUNT **Event methods**: --- --- Event methods are available (dynamically allocated by the state machine), that accomodate for state transitions occurring in the process. --- There are two types of event methods, which you can use to influence the normal mechanisms in the state machine: --- --- * **Immediate**: The event method has exactly the name of the event. --- * **Delayed**: The event method starts with a __ + the name of the event. The first parameter of the event method is a number value, expressing the delay in seconds when the event will be executed. --- --- ### ACT_ACCOUNT **States**: --- --- * **Assigned**: The player is assigned to the task. This is the initialization state for the process. --- * **Waiting**: the process is waiting for a DCS event to occur within the simulator. This state is set automatically. --- * **Report**: The process is Reporting to the players in the group of the unit. This state is set automatically every 30 seconds. --- * **Account**: The relevant DCS event has occurred, and is accounted for. --- * **Success (*)**: All DCS events were accounted for. --- * **Failed (*)**: The process has failed. --- --- (*) End states of the process. --- --- ### ACT_ACCOUNT state transition methods: --- --- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. --- There are 2 moments when state transition methods will be called by the state machine: --- --- * **Before** the state transition. --- The state transition method needs to start with the name **OnBefore + the name of the state**. --- If the state transition method returns false, then the processing of the state transition will not be done! --- If you want to change the behaviour of the AIControllable at this event, return false, --- but then you'll need to specify your own logic using the AIControllable! --- --- * **After** the state transition. --- The state transition method needs to start with the name **OnAfter + the name of the state**. --- These state transition methods need to provide a return value, which is specified at the function description. --- --- # 1) @{#ACT_ACCOUNT_DEADS} FSM class, extends @{Fsm.Account#ACT_ACCOUNT} --- --- The ACT_ACCOUNT_DEADS class accounts (detects, counts and reports) successful kills of DCS units. --- The process is given a @{Set} of units that will be tracked upon successful destruction. --- The process will end after each target has been successfully destroyed. --- Each successful dead will trigger an Account state transition that can be scored, modified or administered. --- --- --- ## ACT_ACCOUNT_DEADS constructor: --- --- * @{#ACT_ACCOUNT_DEADS.New}(): Creates a new ACT_ACCOUNT_DEADS object. +-- ![Banner Image](..\Presentations\ACT_ACCOUNT\Dia1.JPG) -- -- === -- @@ -31701,7 +31628,51 @@ end -- ACT_ROUTE_ZONE do -- ACT_ACCOUNT - --- ACT_ACCOUNT class + --- # @{#ACT_ACCOUNT} FSM class, extends @{Fsm#FSM_PROCESS} + -- + -- ## ACT_ACCOUNT state machine: + -- + -- This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. + -- All derived classes from this class will start with the class name, followed by a \_. See the relevant derived class descriptions below. + -- Each derived class follows exactly the same process, using the same events and following the same state transitions, + -- but will have **different implementation behaviour** upon each event or state transition. + -- + -- ### ACT_ACCOUNT States + -- + -- * **Asigned**: The player is assigned. + -- * **Waiting**: Waiting for an event. + -- * **Report**: Reporting. + -- * **Account**: Account for an event. + -- * **Accounted**: All events have been accounted for, end of the process. + -- * **Failed**: Failed the process. + -- + -- ### ACT_ACCOUNT Events + -- + -- * **Start**: Start the process. + -- * **Wait**: Wait for an event. + -- * **Report**: Report the status of the accounting. + -- * **Event**: An event happened, process the event. + -- * **More**: More targets. + -- * **NoMore (*)**: No more targets. + -- * **Fail (*)**: The action process has failed. + -- + -- (*) End states of the process. + -- + -- ### ACT_ACCOUNT state transition methods: + -- + -- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. + -- There are 2 moments when state transition methods will be called by the state machine: + -- + -- * **Before** the state transition. + -- The state transition method needs to start with the name **OnBefore + the name of the state**. + -- If the state transition method returns false, then the processing of the state transition will not be done! + -- If you want to change the behaviour of the AIControllable at this event, return false, + -- but then you'll need to specify your own logic using the AIControllable! + -- + -- * **After** the state transition. + -- The state transition method needs to start with the name **OnAfter + the name of the state**. + -- These state transition methods need to provide a return value, which is specified at the function description. + -- -- @type ACT_ACCOUNT -- @field Set#SET_UNIT TargetSetUnit -- @extends Core.Fsm#FSM_PROCESS @@ -31783,7 +31754,18 @@ end -- ACT_ACCOUNT do -- ACT_ACCOUNT_DEADS - --- ACT_ACCOUNT_DEADS class + --- # @{#ACT_ACCOUNT_DEADS} FSM class, extends @{Fsm.Account#ACT_ACCOUNT} + -- + -- The ACT_ACCOUNT_DEADS class accounts (detects, counts and reports) successful kills of DCS units. + -- The process is given a @{Set} of units that will be tracked upon successful destruction. + -- The process will end after each target has been successfully destroyed. + -- Each successful dead will trigger an Account state transition that can be scored, modified or administered. + -- + -- + -- ## ACT_ACCOUNT_DEADS constructor: + -- + -- * @{#ACT_ACCOUNT_DEADS.New}(): Creates a new ACT_ACCOUNT_DEADS object. + -- -- @type ACT_ACCOUNT_DEADS -- @field Set#SET_UNIT TargetSetUnit -- @extends #ACT_ACCOUNT @@ -31827,7 +31809,7 @@ do -- ACT_ACCOUNT_DEADS -- @param #string Event -- @param #string From -- @param #string To - function ACT_ACCOUNT_DEADS:onenterReport( ProcessUnit, From, Event, To ) + function ACT_ACCOUNT_DEADS:onenterReport( ProcessUnit, Task, From, Event, To ) self:E( { ProcessUnit, From, Event, To } ) self:Message( "Your group with assigned " .. self.TaskName .. " task has " .. self.TargetSetUnit:GetUnitTypesText() .. " targets left to be destroyed." ) @@ -31840,17 +31822,21 @@ do -- ACT_ACCOUNT_DEADS -- @param #string Event -- @param #string From -- @param #string To - function ACT_ACCOUNT_DEADS:onenterAccount( ProcessUnit, From, Event, To, EventData ) + function ACT_ACCOUNT_DEADS:onenterAccount( ProcessUnit, Task, From, Event, To, EventData ) self:T( { ProcessUnit, EventData, From, Event, To } ) self:T({self.Controllable}) self.TargetSetUnit:Flush() + self:T( { "Before sending Message", EventData.IniUnitName, self.TargetSetUnit:FindUnit( EventData.IniUnitName ) } ) if self.TargetSetUnit:FindUnit( EventData.IniUnitName ) then + self:T( "Sending Message" ) local TaskGroup = ProcessUnit:GetGroup() + self.TargetSetUnit:Remove( EventData.IniUnitName ) self:Message( "You hit a target. Your group with assigned " .. self.TaskName .. " task has " .. self.TargetSetUnit:Count() .. " targets ( " .. self.TargetSetUnit:GetUnitTypesText() .. " ) left to be destroyed." ) end + self:T( { "After sending Message" } ) end --- StateMachine callback function @@ -31859,9 +31845,9 @@ do -- ACT_ACCOUNT_DEADS -- @param #string Event -- @param #string From -- @param #string To - function ACT_ACCOUNT_DEADS:onafterEvent( ProcessUnit, From, Event, To, EventData ) + function ACT_ACCOUNT_DEADS:onafterEvent( ProcessUnit, Task, From, Event, To ) - if self.TargetSetUnit:Count() > 1 then + if self.TargetSetUnit:Count() > 0 then self:__More( 1 ) else self:__NoMore( 1 ) @@ -34671,7 +34657,7 @@ do -- TASK_A2G_DISPATCHER 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:SetTargetZone( DetectedZone ) Task:SetDispatcher( self ) CASTask = Mission:AddTask( Task ) end diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index 09b01c6a7..0d3429f64 100644 --- a/Moose Mission Setup/Moose.lua +++ b/Moose Mission Setup/Moose.lua @@ -1,5 +1,5 @@ env.info( '*** MOOSE STATIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20170319_0757' ) +env.info( 'Moose Generation Timestamp: 20170319_1459' ) local base = _G Include = {} @@ -25499,241 +25499,9 @@ end - --- This module contains the DETECTION classes. + --- **Functional** - DETECTION_ classes model the detection of enemy units by FACs or RECCEs and group them according various methods. -- --- === --- --- # 1) @{#DETECTION_BASE} class, extends @{Fsm#FSM} --- --- The @{#DETECTION_BASE} class defines the core functions to administer detected objects. --- The @{#DETECTION_BASE} class will detect objects within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s). --- --- ## 1.1) DETECTION_BASE constructor --- --- Construct a new DETECTION_BASE instance using the @{#DETECTION_BASE.New}() method. --- --- ## 1.2) DETECTION_BASE initialization --- --- By default, detection will return detected objects with all the detection sensors available. --- However, you can ask how the objects were found with specific detection methods. --- If you use one of the below methods, the detection will work with the detection method specified. --- You can specify to apply multiple detection methods. --- --- Use the following functions to report the objects it detected using the methods Visual, Optical, Radar, IRST, RWR, DLINK: --- --- * @{#DETECTION_BASE.InitDetectVisual}(): Detected using Visual. --- * @{#DETECTION_BASE.InitDetectOptical}(): Detected using Optical. --- * @{#DETECTION_BASE.InitDetectRadar}(): Detected using Radar. --- * @{#DETECTION_BASE.InitDetectIRST}(): Detected using IRST. --- * @{#DETECTION_BASE.InitDetectRWR}(): Detected using RWR. --- * @{#DETECTION_BASE.InitDetectDLINK}(): Detected using DLINK. --- --- ## 1.3) DETECTION_BASE derived classes group the detected units into a DetectedItems[] list --- --- DETECTION_BASE derived classes build a list called DetectedItems[], which is essentially a first later --- of grouping of detected units. Each DetectedItem within the DetectedItems[] list contains --- a SET_UNIT object that contains the detected units that belong to that group. --- --- Derived classes will apply different methods to group the detected units. --- Examples are per area, per quadrant, per distance, per type. --- See further the derived DETECTION classes on which grouping methods are currently supported. --- --- Various methods exist how to retrieve the grouped items from a DETECTION_BASE derived class: --- --- * The method @{Detection#DETECTION_BASE.GetDetectedItems}() retrieves the DetectedItems[] list. --- * A DetectedItem from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedItem}( DetectedItemIndex ). --- Note that this method returns a DetectedItem element from the list, that contains a Set variable and further information --- about the DetectedItem that is set by the DETECTION_BASE derived classes, used to group the DetectedItem. --- * A DetectedSet from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedSet}( DetectedItemIndex ). --- This method retrieves the Set from a DetectedItem element from the DetectedItem list (DetectedItems[ DetectedItemIndex ].Set ). --- --- ## 1.4) Apply additional Filters to fine-tune the detected objects --- --- By default, DCS World will return any object that is in LOS and within "visual reach", or detectable through one of the electronic detection means. --- That being said, the DCS World detection algorithm can sometimes be unrealistic. --- Especially for a visual detection, DCS World is able to report within 1 second a detailed detection of a group of 20 units (including types of the units) that are 10 kilometers away, using only visual capabilities. --- Additionally, trees and other obstacles are not accounted during the DCS World detection. --- --- Therefore, an additional (optional) filtering has been built into the DETECTION_BASE class, that can be set for visual detected units. --- For electronic detection, this filtering is not applied, only for visually detected targets. --- --- The following additional filtering can be applied for visual filtering: --- --- * A probability factor per kilometer distance. --- * A probability factor based on the alpha angle between the detected object and the unit detecting. --- A detection from a higher altitude allows for better detection than when on the ground. --- * Define a probability factor for "cloudy zones", which are zones where forests or villages are located. In these zones, detection will be much more difficult. --- The mission designer needs to define these cloudy zones within the mission, and needs to register these zones in the DETECTION_ objects additing a probability factor per zone. --- --- I advise however, that, when you first use the DETECTION derived classes, that you don't use these filters. --- Only when you experience unrealistic behaviour in your missions, these filters could be applied. --- --- ### 1.4.1 ) Distance visual detection probability --- --- Upon a **visual** detection, the further away a detected object is, the less likely it is to be detected properly. --- Also, the speed of accurate detection plays a role. --- --- A distance probability factor between 0 and 1 can be given, that will model a linear extrapolated probability over 10 km distance. --- --- For example, if a probability factor of 0.6 (60%) is given, the extrapolated probabilities over 15 kilometers would like like: --- 1 km: 96%, 2 km: 92%, 3 km: 88%, 4 km: 84%, 5 km: 80%, 6 km: 76%, 7 km: 72%, 8 km: 68%, 9 km: 64%, 10 km: 60%, 11 km: 56%, 12 km: 52%, 13 km: 48%, 14 km: 44%, 15 km: 40%. --- --- Note that based on this probability factor, not only the detection but also the **type** of the unit will be applied! --- --- Use the method @{Detection#DETECTION_BASE.SetDistanceProbability}() to set the probability factor upon a 10 km distance. --- --- ### 1.4.2 ) Alpha Angle visual detection probability --- --- Upon a **visual** detection, the higher the unit is during the detecting process, the more likely the detected unit is to be detected properly. --- A detection at a 90% alpha angle is the most optimal, a detection at 10% is less and a detection at 0% is less likely to be correct. --- --- A probability factor between 0 and 1 can be given, that will model a progressive extrapolated probability if the target would be detected at a 0° angle. --- --- For example, if a alpha angle probability factor of 0.7 is given, the extrapolated probabilities of the different angles would look like: --- 0°: 70%, 10°: 75,21%, 20°: 80,26%, 30°: 85%, 40°: 89,28%, 50°: 92,98%, 60°: 95,98%, 70°: 98,19%, 80°: 99,54%, 90°: 100% --- --- Use the method @{Detection#DETECTION_BASE.SetAlphaAngleProbability}() to set the probability factor if 0°. --- --- ### 1.4.3 ) Cloudy Zones detection probability --- --- Upon a **visual** detection, the more a detected unit is within a cloudy zone, the less likely the detected unit is to be detected successfully. --- The Cloudy Zones work with the ZONE_BASE derived classes. The mission designer can define within the mission --- zones that reflect cloudy areas where detected units may not be so easily visually detected. --- --- Use the method @{Detection#DETECTION_BASE.SetZoneProbability}() to set for a defined number of zones, the probability factors. --- --- Note however, that the more zones are defined to be "cloudy" within a detection, the more performance it will take --- from the DETECTION_BASE to calculate the presence of the detected unit within each zone. --- Expecially for ZONE_POLYGON, try to limit the amount of nodes of the polygon! --- --- Typically, this kind of filter would be applied for very specific areas were a detection needs to be very realisting for --- AI not to detect so easily targets within a forrest or village rich area. --- --- ## 1.5 ) Accept / Reject detected units --- --- DETECTION_BASE can accept or reject successful detections based on the location of the detected object, --- if it is located in range or located inside or outside of specific zones. --- --- ### 1.5.1 ) Detection acceptance of within range limit --- --- A range can be set that will limit a successful detection for a unit. --- Use the method @{Detection#DETECTION_BASE.SetAcceptRange}() to apply a range in meters till where detected units will be accepted. --- --- 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 ) --- --- -- This will accept detected units if the range is below 5000 meters. --- Detection:SetAcceptRange( 5000 ) --- --- -- Start the Detection. --- Detection:Start() --- --- --- ### 1.5.2 ) Detection acceptance if within zone(s). --- --- Specific ZONE_BASE object(s) can be given as a parameter, which will only accept a detection if the unit is within the specified ZONE_BASE object(s). --- Use the method @{Detection#DETECTION_BASE.SetAcceptZones}() will accept detected units if they are within the specified zones. --- --- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. --- --- -- Search fo the zones where units are to be accepted. --- local ZoneAccept1 = ZONE:New( "AcceptZone1" ) --- local ZoneAccept2 = ZONE:New( "AcceptZone2" ) --- --- -- Build a detect object. --- local Detection = DETECTION_BASE:New( SetGroup ) --- --- -- This will accept detected units by Detection when the unit is within ZoneAccept1 OR ZoneAccept2. --- Detection:SetAcceptZones( { ZoneAccept1, ZoneAccept2 } ) --- --- -- Start the Detection. --- Detection:Start() --- --- ### 1.5.3 ) Detection rejectance if within zone(s). --- --- Specific ZONE_BASE object(s) can be given as a parameter, which will reject detection if the unit is within the specified ZONE_BASE object(s). --- Use the method @{Detection#DETECTION_BASE.SetRejectZones}() will reject detected units if they are within the specified zones. --- An example of how to use the method is shown below. --- --- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. --- --- -- Search fo the zones where units are to be rejected. --- local ZoneReject1 = ZONE:New( "RejectZone1" ) --- local ZoneReject2 = ZONE:New( "RejectZone2" ) --- --- -- Build a detect object. --- local Detection = DETECTION_BASE:New( SetGroup ) --- --- -- This will reject detected units by Detection when the unit is within ZoneReject1 OR ZoneReject2. --- Detection:SetRejectZones( { ZoneReject1, ZoneReject2 } ) --- --- -- Start the Detection. --- Detection:Start() --- --- ## 1.6) DETECTION_BASE is a Finite State Machine --- --- Various Events and State Transitions can be tailored using DETECTION_BASE. --- --- ### 1.6.1) DETECTION_BASE States --- --- * **Detecting**: The detection is running. --- * **Stopped**: The detection is stopped. --- --- ### 1.6.2) DETECTION_BASE Events --- --- * **Start**: Start the detection process. --- * **Detect**: Detect new units. --- * **Detected**: New units have been detected. --- * **Stop**: Stop the detection process. --- --- === --- --- # 2) @{Detection#DETECTION_UNITS} class, extends @{Detection#DETECTION_BASE} --- --- The @{Detection#DETECTION_UNITS} class will detect units within the battle zone. --- It will build a DetectedItems list filled with DetectedItems. Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. --- Beware that when the amount of units detected is large, the DetectedItems list will be large also. --- --- # 3) @{Detection#DETECTION_TYPES} class, extends @{Detection#DETECTION_BASE} --- --- The @{Detection#DETECTION_TYPES} class will detect units within the battle zone. --- It will build a DetectedItems[] list filled with DetectedItems, grouped by the type of units detected. --- Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. --- Beware that when the amount of different types detected is large, the DetectedItems[] list will be large also. --- --- # 4) @{Detection#DETECTION_AREAS} class, extends @{Detection#DETECTION_BASE} --- --- The @{Detection#DETECTION_AREAS} class will detect units within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s), --- and will build a list (table) of @{Set#SET_UNIT}s containing the @{Unit#UNIT}s detected. --- The class is group the detected units within zones given a DetectedZoneRange parameter. --- A set with multiple detected zones will be created as there are groups of units detected. --- --- ## 4.1) Retrieve the Detected Unit Sets and Detected Zones --- --- The methods to manage the DetectedItems[].Set(s) are implemented in @{Detection#DECTECTION_BASE} and --- the methods to manage the DetectedItems[].Zone(s) is implemented in @{Detection#DETECTION_AREAS}. --- --- Retrieve the DetectedItems[].Set with the method @{Detection#DETECTION_BASE.GetDetectedSet}(). A @{Set#SET_UNIT} object will be returned. --- --- Retrieve the formed @{Zone@ZONE_UNIT}s as a result of the grouping the detected units within the DetectionZoneRange, use the method @{Detection#DETECTION_BASE.GetDetectionZones}(). --- To understand the amount of zones created, use the method @{Detection#DETECTION_BASE.GetDetectionZoneCount}(). --- If you want to obtain a specific zone from the DetectedZones, use the method @{Detection#DETECTION_BASE.GetDetectionZone}() with a given index. --- --- ## 4.4) Flare or Smoke detected units --- --- Use the methods @{Detection#DETECTION_AREAS.FlareDetectedUnits}() or @{Detection#DETECTION_AREAS.SmokeDetectedUnits}() to flare or smoke the detected units when a new detection has taken place. --- --- ## 4.5) Flare or Smoke or Bound detected zones --- --- Use the methods: --- --- * @{Detection#DETECTION_AREAS.FlareDetectedZones}() to flare in a color --- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to smoke in a color --- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to bound with a tire with a white flag --- --- the detected zones when a new detection has taken place. +-- ![Banner Image](..\Presentations\DETECTION\Dia1.JPG) -- -- === -- @@ -25750,7 +25518,191 @@ end do -- DETECTION_BASE - --- DETECTION_BASE class + --- # 1) DETECTION_BASE class, extends @{Fsm#FSM} + -- + -- The DETECTION_BASE class defines the core functions to administer detected objects. + -- The DETECTION_BASE class will detect objects within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s). + -- + -- ## 1.1) DETECTION_BASE constructor + -- + -- Construct a new DETECTION_BASE instance using the @{#DETECTION_BASE.New}() method. + -- + -- ## 1.2) DETECTION_BASE initialization + -- + -- By default, detection will return detected objects with all the detection sensors available. + -- However, you can ask how the objects were found with specific detection methods. + -- If you use one of the below methods, the detection will work with the detection method specified. + -- You can specify to apply multiple detection methods. + -- + -- Use the following functions to report the objects it detected using the methods Visual, Optical, Radar, IRST, RWR, DLINK: + -- + -- * @{#DETECTION_BASE.InitDetectVisual}(): Detected using Visual. + -- * @{#DETECTION_BASE.InitDetectOptical}(): Detected using Optical. + -- * @{#DETECTION_BASE.InitDetectRadar}(): Detected using Radar. + -- * @{#DETECTION_BASE.InitDetectIRST}(): Detected using IRST. + -- * @{#DETECTION_BASE.InitDetectRWR}(): Detected using RWR. + -- * @{#DETECTION_BASE.InitDetectDLINK}(): Detected using DLINK. + -- + -- ## 1.3) DETECTION_BASE derived classes group the detected units into a DetectedItems[] list + -- + -- DETECTION_BASE derived classes build a list called DetectedItems[], which is essentially a first later + -- of grouping of detected units. Each DetectedItem within the DetectedItems[] list contains + -- a SET_UNIT object that contains the detected units that belong to that group. + -- + -- Derived classes will apply different methods to group the detected units. + -- Examples are per area, per quadrant, per distance, per type. + -- See further the derived DETECTION classes on which grouping methods are currently supported. + -- + -- Various methods exist how to retrieve the grouped items from a DETECTION_BASE derived class: + -- + -- * The method @{Detection#DETECTION_BASE.GetDetectedItems}() retrieves the DetectedItems[] list. + -- * A DetectedItem from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedItem}( DetectedItemIndex ). + -- Note that this method returns a DetectedItem element from the list, that contains a Set variable and further information + -- about the DetectedItem that is set by the DETECTION_BASE derived classes, used to group the DetectedItem. + -- * A DetectedSet from the DetectedItems[] list can be retrieved using the method @{Detection#DETECTION_BASE.GetDetectedSet}( DetectedItemIndex ). + -- This method retrieves the Set from a DetectedItem element from the DetectedItem list (DetectedItems[ DetectedItemIndex ].Set ). + -- + -- ## 1.4) Apply additional Filters to fine-tune the detected objects + -- + -- By default, DCS World will return any object that is in LOS and within "visual reach", or detectable through one of the electronic detection means. + -- That being said, the DCS World detection algorithm can sometimes be unrealistic. + -- Especially for a visual detection, DCS World is able to report within 1 second a detailed detection of a group of 20 units (including types of the units) that are 10 kilometers away, using only visual capabilities. + -- Additionally, trees and other obstacles are not accounted during the DCS World detection. + -- + -- Therefore, an additional (optional) filtering has been built into the DETECTION_BASE class, that can be set for visual detected units. + -- For electronic detection, this filtering is not applied, only for visually detected targets. + -- + -- The following additional filtering can be applied for visual filtering: + -- + -- * A probability factor per kilometer distance. + -- * A probability factor based on the alpha angle between the detected object and the unit detecting. + -- A detection from a higher altitude allows for better detection than when on the ground. + -- * Define a probability factor for "cloudy zones", which are zones where forests or villages are located. In these zones, detection will be much more difficult. + -- The mission designer needs to define these cloudy zones within the mission, and needs to register these zones in the DETECTION_ objects additing a probability factor per zone. + -- + -- I advise however, that, when you first use the DETECTION derived classes, that you don't use these filters. + -- Only when you experience unrealistic behaviour in your missions, these filters could be applied. + -- + -- ### 1.4.1 ) Distance visual detection probability + -- + -- Upon a **visual** detection, the further away a detected object is, the less likely it is to be detected properly. + -- Also, the speed of accurate detection plays a role. + -- + -- A distance probability factor between 0 and 1 can be given, that will model a linear extrapolated probability over 10 km distance. + -- + -- For example, if a probability factor of 0.6 (60%) is given, the extrapolated probabilities over 15 kilometers would like like: + -- 1 km: 96%, 2 km: 92%, 3 km: 88%, 4 km: 84%, 5 km: 80%, 6 km: 76%, 7 km: 72%, 8 km: 68%, 9 km: 64%, 10 km: 60%, 11 km: 56%, 12 km: 52%, 13 km: 48%, 14 km: 44%, 15 km: 40%. + -- + -- Note that based on this probability factor, not only the detection but also the **type** of the unit will be applied! + -- + -- Use the method @{Detection#DETECTION_BASE.SetDistanceProbability}() to set the probability factor upon a 10 km distance. + -- + -- ### 1.4.2 ) Alpha Angle visual detection probability + -- + -- Upon a **visual** detection, the higher the unit is during the detecting process, the more likely the detected unit is to be detected properly. + -- A detection at a 90% alpha angle is the most optimal, a detection at 10% is less and a detection at 0% is less likely to be correct. + -- + -- A probability factor between 0 and 1 can be given, that will model a progressive extrapolated probability if the target would be detected at a 0° angle. + -- + -- For example, if a alpha angle probability factor of 0.7 is given, the extrapolated probabilities of the different angles would look like: + -- 0°: 70%, 10°: 75,21%, 20°: 80,26%, 30°: 85%, 40°: 89,28%, 50°: 92,98%, 60°: 95,98%, 70°: 98,19%, 80°: 99,54%, 90°: 100% + -- + -- Use the method @{Detection#DETECTION_BASE.SetAlphaAngleProbability}() to set the probability factor if 0°. + -- + -- ### 1.4.3 ) Cloudy Zones detection probability + -- + -- Upon a **visual** detection, the more a detected unit is within a cloudy zone, the less likely the detected unit is to be detected successfully. + -- The Cloudy Zones work with the ZONE_BASE derived classes. The mission designer can define within the mission + -- zones that reflect cloudy areas where detected units may not be so easily visually detected. + -- + -- Use the method @{Detection#DETECTION_BASE.SetZoneProbability}() to set for a defined number of zones, the probability factors. + -- + -- Note however, that the more zones are defined to be "cloudy" within a detection, the more performance it will take + -- from the DETECTION_BASE to calculate the presence of the detected unit within each zone. + -- Expecially for ZONE_POLYGON, try to limit the amount of nodes of the polygon! + -- + -- Typically, this kind of filter would be applied for very specific areas were a detection needs to be very realisting for + -- AI not to detect so easily targets within a forrest or village rich area. + -- + -- ## 1.5 ) Accept / Reject detected units + -- + -- DETECTION_BASE can accept or reject successful detections based on the location of the detected object, + -- if it is located in range or located inside or outside of specific zones. + -- + -- ### 1.5.1 ) Detection acceptance of within range limit + -- + -- A range can be set that will limit a successful detection for a unit. + -- Use the method @{Detection#DETECTION_BASE.SetAcceptRange}() to apply a range in meters till where detected units will be accepted. + -- + -- 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 ) + -- + -- -- This will accept detected units if the range is below 5000 meters. + -- Detection:SetAcceptRange( 5000 ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- + -- ### 1.5.2 ) Detection acceptance if within zone(s). + -- + -- Specific ZONE_BASE object(s) can be given as a parameter, which will only accept a detection if the unit is within the specified ZONE_BASE object(s). + -- Use the method @{Detection#DETECTION_BASE.SetAcceptZones}() will accept detected units if they are within the specified zones. + -- + -- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. + -- + -- -- Search fo the zones where units are to be accepted. + -- local ZoneAccept1 = ZONE:New( "AcceptZone1" ) + -- local ZoneAccept2 = ZONE:New( "AcceptZone2" ) + -- + -- -- Build a detect object. + -- local Detection = DETECTION_BASE:New( SetGroup ) + -- + -- -- This will accept detected units by Detection when the unit is within ZoneAccept1 OR ZoneAccept2. + -- Detection:SetAcceptZones( { ZoneAccept1, ZoneAccept2 } ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- ### 1.5.3 ) Detection rejectance if within zone(s). + -- + -- Specific ZONE_BASE object(s) can be given as a parameter, which will reject detection if the unit is within the specified ZONE_BASE object(s). + -- Use the method @{Detection#DETECTION_BASE.SetRejectZones}() will reject detected units if they are within the specified zones. + -- An example of how to use the method is shown below. + -- + -- local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers. + -- + -- -- Search fo the zones where units are to be rejected. + -- local ZoneReject1 = ZONE:New( "RejectZone1" ) + -- local ZoneReject2 = ZONE:New( "RejectZone2" ) + -- + -- -- Build a detect object. + -- local Detection = DETECTION_BASE:New( SetGroup ) + -- + -- -- This will reject detected units by Detection when the unit is within ZoneReject1 OR ZoneReject2. + -- Detection:SetRejectZones( { ZoneReject1, ZoneReject2 } ) + -- + -- -- Start the Detection. + -- Detection:Start() + -- + -- ## 1.6) DETECTION_BASE is a Finite State Machine + -- + -- Various Events and State Transitions can be tailored using DETECTION_BASE. + -- + -- ### 1.6.1) DETECTION_BASE States + -- + -- * **Detecting**: The detection is running. + -- * **Stopped**: The detection is stopped. + -- + -- ### 1.6.2) DETECTION_BASE Events + -- + -- * **Start**: Start the detection process. + -- * **Detect**: Detect new units. + -- * **Detected**: New units have been detected. + -- * **Stop**: Stop the detection process. + -- -- @type DETECTION_BASE -- @field Core.Set#SET_GROUP DetectionSetGroup The @{Set} of GROUPs in the Forward Air Controller role. -- @field Dcs.DCSTypes#Distance DetectionRange The range till which targets are accepted to be detected. @@ -26723,7 +26675,12 @@ end do -- DETECTION_UNITS - --- DETECTION_UNITS class + --- # 2) DETECTION_UNITS class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_UNITS class will detect units within the battle zone. + -- It will build a DetectedItems list filled with DetectedItems. Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. + -- Beware that when the amount of units detected is large, the DetectedItems list will be large also. + -- -- @type DETECTION_UNITS -- @field Dcs.DCSTypes#Distance DetectionRange The range till which targets are detected. -- @extends #DETECTION_BASE @@ -26933,7 +26890,13 @@ end do -- DETECTION_TYPES - --- DETECTION_TYPES class + --- # 3) DETECTION_TYPES class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_TYPES class will detect units within the battle zone. + -- It will build a DetectedItems[] list filled with DetectedItems, grouped by the type of units detected. + -- Each DetectedItem will contain a field Set, which contains a @{Set#SET_UNIT} containing ONE @{UNIT} object reference. + -- Beware that when the amount of different types detected is large, the DetectedItems[] list will be large also. + -- -- @type DETECTION_TYPES -- @extends #DETECTION_BASE DETECTION_TYPES = { @@ -27116,7 +27079,38 @@ end do -- DETECTION_AREAS - --- DETECTION_AREAS class + --- # 4) DETECTION_AREAS class, extends @{Detection#DETECTION_BASE} + -- + -- The DETECTION_AREAS class will detect units within the battle zone for a list of @{Group}s detecting targets following (a) detection method(s), + -- and will build a list (table) of @{Set#SET_UNIT}s containing the @{Unit#UNIT}s detected. + -- The class is group the detected units within zones given a DetectedZoneRange parameter. + -- A set with multiple detected zones will be created as there are groups of units detected. + -- + -- ## 4.1) Retrieve the Detected Unit Sets and Detected Zones + -- + -- The methods to manage the DetectedItems[].Set(s) are implemented in @{Detection#DECTECTION_BASE} and + -- the methods to manage the DetectedItems[].Zone(s) is implemented in @{Detection#DETECTION_AREAS}. + -- + -- Retrieve the DetectedItems[].Set with the method @{Detection#DETECTION_BASE.GetDetectedSet}(). A @{Set#SET_UNIT} object will be returned. + -- + -- Retrieve the formed @{Zone@ZONE_UNIT}s as a result of the grouping the detected units within the DetectionZoneRange, use the method @{Detection#DETECTION_BASE.GetDetectionZones}(). + -- To understand the amount of zones created, use the method @{Detection#DETECTION_BASE.GetDetectionZoneCount}(). + -- If you want to obtain a specific zone from the DetectedZones, use the method @{Detection#DETECTION_BASE.GetDetectionZone}() with a given index. + -- + -- ## 4.4) Flare or Smoke detected units + -- + -- Use the methods @{Detection#DETECTION_AREAS.FlareDetectedUnits}() or @{Detection#DETECTION_AREAS.SmokeDetectedUnits}() to flare or smoke the detected units when a new detection has taken place. + -- + -- ## 4.5) Flare or Smoke or Bound detected zones + -- + -- Use the methods: + -- + -- * @{Detection#DETECTION_AREAS.FlareDetectedZones}() to flare in a color + -- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to smoke in a color + -- * @{Detection#DETECTION_AREAS.SmokeDetectedZones}() to bound with a tire with a white flag + -- + -- the detected zones when a new detection has taken place. + -- -- @type DETECTION_AREAS -- @field Dcs.DCSTypes#Distance DetectionZoneRange The range till which targets are grouped upon the first detected target. -- @field #DETECTION_BASE.DetectedItems DetectedItems A list of areas containing the set of @{Unit}s, @{Zone}s, the center @{Unit} within the zone, and ID of each area that was detected within a DetectionZoneRange. @@ -27861,8 +27855,7 @@ end ---- Single-Player:**Yes** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**Air** -- --- **Air Patrolling or Staging.** +--- **AI** -- **Air Patrolling or Staging.** -- -- ![Banner Image](..\Presentations\AI_PATROL\Dia1.JPG) -- @@ -28800,8 +28793,7 @@ function AI_PATROL_ZONE:OnPilotDead( EventData ) self:__PilotDead( 1, EventData ) end end ---- Single-Player:**Yes** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**Air** -- --- **Provide Close Air Support to friendly ground troops.** +--- **AI** -- **Provide Close Air Support to friendly ground troops.** -- -- ![Banner Image](..\Presentations\AI_CAS\Dia1.JPG) -- @@ -29375,7 +29367,7 @@ function AI_CAS_ZONE:OnEventDead( EventData ) end ---- Single-Player:**Yes** / Multi-Player:**Yes** / AI:**Yes** / Human:**No** / Types:**Air** -- **Execute Combat Air Patrol (CAP).** +--- **AI** - **Execute Combat Air Patrol (CAP).** -- -- ![Banner Image](..\Presentations\AI_CAP\Dia1.JPG) -- @@ -31625,74 +31617,9 @@ do -- ACT_ROUTE_ZONE end end -- ACT_ROUTE_ZONE ---- (SP) (MP) (FSM) Account for (Detect, count and report) DCS events occuring on DCS objects (units). +--- **Actions** - ACT_ACCOUNT_ classes **account for** (detect, count & report) various DCS events occuring on @{Unit}s. -- --- === --- --- # @{#ACT_ACCOUNT} FSM class, extends @{Fsm#FSM_PROCESS} --- --- ## ACT_ACCOUNT state machine: --- --- This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. --- All derived classes from this class will start with the class name, followed by a \_. See the relevant derived class descriptions below. --- Each derived class follows exactly the same process, using the same events and following the same state transitions, --- but will have **different implementation behaviour** upon each event or state transition. --- --- ### ACT_ACCOUNT **Events**: --- --- These are the events defined in this class: --- --- * **Start**: The process is started. The process will go into the Report state. --- * **Event**: A relevant event has occured that needs to be accounted for. The process will go into the Account state. --- * **Report**: The process is reporting to the player the accounting status of the DCS events. --- * **More**: There are more DCS events that need to be accounted for. The process will go back into the Report state. --- * **NoMore**: There are no more DCS events that need to be accounted for. The process will go into the Success state. --- --- ### ACT_ACCOUNT **Event methods**: --- --- Event methods are available (dynamically allocated by the state machine), that accomodate for state transitions occurring in the process. --- There are two types of event methods, which you can use to influence the normal mechanisms in the state machine: --- --- * **Immediate**: The event method has exactly the name of the event. --- * **Delayed**: The event method starts with a __ + the name of the event. The first parameter of the event method is a number value, expressing the delay in seconds when the event will be executed. --- --- ### ACT_ACCOUNT **States**: --- --- * **Assigned**: The player is assigned to the task. This is the initialization state for the process. --- * **Waiting**: the process is waiting for a DCS event to occur within the simulator. This state is set automatically. --- * **Report**: The process is Reporting to the players in the group of the unit. This state is set automatically every 30 seconds. --- * **Account**: The relevant DCS event has occurred, and is accounted for. --- * **Success (*)**: All DCS events were accounted for. --- * **Failed (*)**: The process has failed. --- --- (*) End states of the process. --- --- ### ACT_ACCOUNT state transition methods: --- --- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. --- There are 2 moments when state transition methods will be called by the state machine: --- --- * **Before** the state transition. --- The state transition method needs to start with the name **OnBefore + the name of the state**. --- If the state transition method returns false, then the processing of the state transition will not be done! --- If you want to change the behaviour of the AIControllable at this event, return false, --- but then you'll need to specify your own logic using the AIControllable! --- --- * **After** the state transition. --- The state transition method needs to start with the name **OnAfter + the name of the state**. --- These state transition methods need to provide a return value, which is specified at the function description. --- --- # 1) @{#ACT_ACCOUNT_DEADS} FSM class, extends @{Fsm.Account#ACT_ACCOUNT} --- --- The ACT_ACCOUNT_DEADS class accounts (detects, counts and reports) successful kills of DCS units. --- The process is given a @{Set} of units that will be tracked upon successful destruction. --- The process will end after each target has been successfully destroyed. --- Each successful dead will trigger an Account state transition that can be scored, modified or administered. --- --- --- ## ACT_ACCOUNT_DEADS constructor: --- --- * @{#ACT_ACCOUNT_DEADS.New}(): Creates a new ACT_ACCOUNT_DEADS object. +-- ![Banner Image](..\Presentations\ACT_ACCOUNT\Dia1.JPG) -- -- === -- @@ -31701,7 +31628,51 @@ end -- ACT_ROUTE_ZONE do -- ACT_ACCOUNT - --- ACT_ACCOUNT class + --- # @{#ACT_ACCOUNT} FSM class, extends @{Fsm#FSM_PROCESS} + -- + -- ## ACT_ACCOUNT state machine: + -- + -- This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. + -- All derived classes from this class will start with the class name, followed by a \_. See the relevant derived class descriptions below. + -- Each derived class follows exactly the same process, using the same events and following the same state transitions, + -- but will have **different implementation behaviour** upon each event or state transition. + -- + -- ### ACT_ACCOUNT States + -- + -- * **Asigned**: The player is assigned. + -- * **Waiting**: Waiting for an event. + -- * **Report**: Reporting. + -- * **Account**: Account for an event. + -- * **Accounted**: All events have been accounted for, end of the process. + -- * **Failed**: Failed the process. + -- + -- ### ACT_ACCOUNT Events + -- + -- * **Start**: Start the process. + -- * **Wait**: Wait for an event. + -- * **Report**: Report the status of the accounting. + -- * **Event**: An event happened, process the event. + -- * **More**: More targets. + -- * **NoMore (*)**: No more targets. + -- * **Fail (*)**: The action process has failed. + -- + -- (*) End states of the process. + -- + -- ### ACT_ACCOUNT state transition methods: + -- + -- State transition functions can be set **by the mission designer** customizing or improving the behaviour of the state. + -- There are 2 moments when state transition methods will be called by the state machine: + -- + -- * **Before** the state transition. + -- The state transition method needs to start with the name **OnBefore + the name of the state**. + -- If the state transition method returns false, then the processing of the state transition will not be done! + -- If you want to change the behaviour of the AIControllable at this event, return false, + -- but then you'll need to specify your own logic using the AIControllable! + -- + -- * **After** the state transition. + -- The state transition method needs to start with the name **OnAfter + the name of the state**. + -- These state transition methods need to provide a return value, which is specified at the function description. + -- -- @type ACT_ACCOUNT -- @field Set#SET_UNIT TargetSetUnit -- @extends Core.Fsm#FSM_PROCESS @@ -31783,7 +31754,18 @@ end -- ACT_ACCOUNT do -- ACT_ACCOUNT_DEADS - --- ACT_ACCOUNT_DEADS class + --- # @{#ACT_ACCOUNT_DEADS} FSM class, extends @{Fsm.Account#ACT_ACCOUNT} + -- + -- The ACT_ACCOUNT_DEADS class accounts (detects, counts and reports) successful kills of DCS units. + -- The process is given a @{Set} of units that will be tracked upon successful destruction. + -- The process will end after each target has been successfully destroyed. + -- Each successful dead will trigger an Account state transition that can be scored, modified or administered. + -- + -- + -- ## ACT_ACCOUNT_DEADS constructor: + -- + -- * @{#ACT_ACCOUNT_DEADS.New}(): Creates a new ACT_ACCOUNT_DEADS object. + -- -- @type ACT_ACCOUNT_DEADS -- @field Set#SET_UNIT TargetSetUnit -- @extends #ACT_ACCOUNT @@ -31827,7 +31809,7 @@ do -- ACT_ACCOUNT_DEADS -- @param #string Event -- @param #string From -- @param #string To - function ACT_ACCOUNT_DEADS:onenterReport( ProcessUnit, From, Event, To ) + function ACT_ACCOUNT_DEADS:onenterReport( ProcessUnit, Task, From, Event, To ) self:E( { ProcessUnit, From, Event, To } ) self:Message( "Your group with assigned " .. self.TaskName .. " task has " .. self.TargetSetUnit:GetUnitTypesText() .. " targets left to be destroyed." ) @@ -31840,17 +31822,21 @@ do -- ACT_ACCOUNT_DEADS -- @param #string Event -- @param #string From -- @param #string To - function ACT_ACCOUNT_DEADS:onenterAccount( ProcessUnit, From, Event, To, EventData ) + function ACT_ACCOUNT_DEADS:onenterAccount( ProcessUnit, Task, From, Event, To, EventData ) self:T( { ProcessUnit, EventData, From, Event, To } ) self:T({self.Controllable}) self.TargetSetUnit:Flush() + self:T( { "Before sending Message", EventData.IniUnitName, self.TargetSetUnit:FindUnit( EventData.IniUnitName ) } ) if self.TargetSetUnit:FindUnit( EventData.IniUnitName ) then + self:T( "Sending Message" ) local TaskGroup = ProcessUnit:GetGroup() + self.TargetSetUnit:Remove( EventData.IniUnitName ) self:Message( "You hit a target. Your group with assigned " .. self.TaskName .. " task has " .. self.TargetSetUnit:Count() .. " targets ( " .. self.TargetSetUnit:GetUnitTypesText() .. " ) left to be destroyed." ) end + self:T( { "After sending Message" } ) end --- StateMachine callback function @@ -31859,9 +31845,9 @@ do -- ACT_ACCOUNT_DEADS -- @param #string Event -- @param #string From -- @param #string To - function ACT_ACCOUNT_DEADS:onafterEvent( ProcessUnit, From, Event, To, EventData ) + function ACT_ACCOUNT_DEADS:onafterEvent( ProcessUnit, Task, From, Event, To ) - if self.TargetSetUnit:Count() > 1 then + if self.TargetSetUnit:Count() > 0 then self:__More( 1 ) else self:__NoMore( 1 ) @@ -34671,7 +34657,7 @@ do -- TASK_A2G_DISPATCHER 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:SetTargetZone( DetectedZone ) Task:SetDispatcher( self ) CASTask = Mission:AddTask( Task ) end diff --git a/Moose Presentations/ACT_ACCOUNT.pptx b/Moose Presentations/ACT_ACCOUNT.pptx new file mode 100644 index 000000000..019ae69b7 Binary files /dev/null and b/Moose Presentations/ACT_ACCOUNT.pptx differ diff --git a/Moose Presentations/DETECTION.pptx b/Moose Presentations/DETECTION.pptx index a55a01ca4..6f261277b 100644 Binary files a/Moose Presentations/DETECTION.pptx and b/Moose Presentations/DETECTION.pptx differ diff --git a/Moose Test Missions/TAD - Task Dispatching/TAD-010 - A2G Task Dispatching Destroy Test/TAD-010 - A2G Task Dispatching Destroy Test.miz b/Moose Test Missions/TAD - Task Dispatching/TAD-010 - A2G Task Dispatching Destroy Test/TAD-010 - A2G Task Dispatching Destroy Test.miz index 17962600f..0201f1b4e 100644 Binary files a/Moose Test Missions/TAD - Task Dispatching/TAD-010 - A2G Task Dispatching Destroy Test/TAD-010 - A2G Task Dispatching Destroy Test.miz and b/Moose Test Missions/TAD - Task Dispatching/TAD-010 - A2G Task Dispatching Destroy Test/TAD-010 - A2G Task Dispatching Destroy Test.miz differ diff --git a/Moose Test Missions/TAD - Task Dispatching/TAD-100 - A2G Task Dispatching DETECTION_AREAS/TAD-100 - A2G Task Dispatching DETECTION_AREAS.miz b/Moose Test Missions/TAD - Task Dispatching/TAD-100 - A2G Task Dispatching DETECTION_AREAS/TAD-100 - A2G Task Dispatching DETECTION_AREAS.miz index 1037d64f7..359f982d0 100644 Binary files a/Moose Test Missions/TAD - Task Dispatching/TAD-100 - A2G Task Dispatching DETECTION_AREAS/TAD-100 - A2G Task Dispatching DETECTION_AREAS.miz and b/Moose Test Missions/TAD - Task Dispatching/TAD-100 - A2G Task Dispatching DETECTION_AREAS/TAD-100 - A2G Task Dispatching DETECTION_AREAS.miz differ diff --git a/Moose Test Missions/TAD - Task Dispatching/TAD-105 - A2G Task Dispatching DETECTION_AREAS/TAD-105 - A2G Task Dispatching DETECTION_AREAS.miz b/Moose Test Missions/TAD - Task Dispatching/TAD-105 - A2G Task Dispatching DETECTION_AREAS/TAD-105 - A2G Task Dispatching DETECTION_AREAS.miz index 8f6970822..9a542f70e 100644 Binary files a/Moose Test Missions/TAD - Task Dispatching/TAD-105 - A2G Task Dispatching DETECTION_AREAS/TAD-105 - A2G Task Dispatching DETECTION_AREAS.miz and b/Moose Test Missions/TAD - Task Dispatching/TAD-105 - A2G Task Dispatching DETECTION_AREAS/TAD-105 - A2G Task Dispatching DETECTION_AREAS.miz differ diff --git a/Moose Test Missions/TAD - Task Dispatching/TAD-110 - A2G Task Dispatching DETECTION_TYPES/TAD-110 - A2G Task Dispatching DETECTION_TYPES.miz b/Moose Test Missions/TAD - Task Dispatching/TAD-110 - A2G Task Dispatching DETECTION_TYPES/TAD-110 - A2G Task Dispatching DETECTION_TYPES.miz index 513e2eaab..ab10243db 100644 Binary files a/Moose Test Missions/TAD - Task Dispatching/TAD-110 - A2G Task Dispatching DETECTION_TYPES/TAD-110 - A2G Task Dispatching DETECTION_TYPES.miz and b/Moose Test Missions/TAD - Task Dispatching/TAD-110 - A2G Task Dispatching DETECTION_TYPES/TAD-110 - A2G Task Dispatching DETECTION_TYPES.miz differ diff --git a/Moose Test Missions/TAD - Task Dispatching/TAD-120 - A2G Task Dispatching DETECTION_UNITS/TAD-120 - A2G Task Dispatching DETECTION_UNITS.miz b/Moose Test Missions/TAD - Task Dispatching/TAD-120 - A2G Task Dispatching DETECTION_UNITS/TAD-120 - A2G Task Dispatching DETECTION_UNITS.miz index 91f75156f..4c1cf726a 100644 Binary files a/Moose Test Missions/TAD - Task Dispatching/TAD-120 - A2G Task Dispatching DETECTION_UNITS/TAD-120 - A2G Task Dispatching DETECTION_UNITS.miz and b/Moose Test Missions/TAD - Task Dispatching/TAD-120 - A2G Task Dispatching DETECTION_UNITS/TAD-120 - A2G Task Dispatching DETECTION_UNITS.miz differ diff --git a/Moose Test Missions/TAD - Task Dispatching/TAD-200 - A2G Task Dispatching with SCORING/TAD-200 - A2G Task Dispatching with SCORING.miz b/Moose Test Missions/TAD - Task Dispatching/TAD-200 - A2G Task Dispatching with SCORING/TAD-200 - A2G Task Dispatching with SCORING.miz index 75669c27e..e1cb135f3 100644 Binary files a/Moose Test Missions/TAD - Task Dispatching/TAD-200 - A2G Task Dispatching with SCORING/TAD-200 - A2G Task Dispatching with SCORING.miz and b/Moose Test Missions/TAD - Task Dispatching/TAD-200 - A2G Task Dispatching with SCORING/TAD-200 - A2G Task Dispatching with SCORING.miz differ diff --git a/Moose Test Missions/TAD - Task Dispatching/TAD-210 - A2G Task Dispatching #1 for AREAS and SCORING/TAD-210 - A2G Task Dispatching #1 for AREAS and SCORING.lua b/Moose Test Missions/TAD - Task Dispatching/TAD-210 - A2G Task Dispatching #1 for AREAS and SCORING/TAD-210 - A2G Task Dispatching #1 for AREAS and SCORING.lua new file mode 100644 index 000000000..bda9ccf60 --- /dev/null +++ b/Moose Test Missions/TAD - Task Dispatching/TAD-210 - A2G Task Dispatching #1 for AREAS and SCORING/TAD-210 - A2G Task Dispatching #1 for AREAS and SCORING.lua @@ -0,0 +1,65 @@ +--- +-- Name: TAD-210 - A2G Task Dispatching #1 for AREAS and SCORING +-- Author: FlightControl +-- Date Created: 19 Mar 2017 +-- +-- # Situation: +-- +-- This mission demonstrates the scoring of dynamic task dispatching for Air to Ground operations. +-- +-- # Test cases: +-- +-- 1. Observe the FAC(A)'s detecting targets and grouping them. +-- 2. Check that the HQ provides menus to engage on a task set by the FACs. +-- 3. Engage on a task and destroy a target. Check if scoring is given for that target. +-- 4. Engage all targets in the task, and check if mission success is achieved and that a scoring is given. +-- 5. Restart the mission, and crash into the ground, check if you can get penalties. +-- +local HQ = GROUP:FindByName( "HQ", "Bravo HQ" ) + +local CommandCenter = COMMANDCENTER:New( HQ, "Lima" ) + +local Scoring = SCORING:New( "Detect Demo" ) + +local Mission = MISSION + :New( CommandCenter, "Overlord", "High", "Attack Detect Mission Briefing", coalition.side.RED ) + :AddScoring( Scoring ) + +local FACSet = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterCoalitions("red"):FilterStart() + +local FACAreas = DETECTION_AREAS:New( FACSet, 400 ) +FACAreas:BoundDetectedZones() + + +local AttackGroups = SET_GROUP:New():FilterCoalitions( "red" ):FilterPrefixes( "Attack" ):FilterStart() + +TaskDispatcher = TASK_A2G_DISPATCHER:New( Mission, AttackGroups, FACAreas ) + +--- @param #TaskDispatcher self +-- @param From +-- @param Event +-- @param To +-- @param Tasking.Task_A2G#TASK_A2G Task +-- @param Wrapper.Unit#UNIT TaskUnit +-- @param #string PlayerName +function TaskDispatcher:OnAfterAssign( From, Event, To, Task, TaskUnit, PlayerName ) + Task:SetScoreOnDestroy( "Player " .. PlayerName .. " destroyed a target", 20, TaskUnit ) + Task:SetScoreOnSuccess( "The task has been successfully completed!", 200, TaskUnit ) + Task:SetPenaltyOnFailed( "The task has failed completion!", -100, TaskUnit ) +end + +-- Now this is REALLY neat. I set the goal of the mission to be the destruction of Target #004. +-- This is just an example, but many more examples can follow... + +-- Every time a Task becomes Successful, it will trigger the Complete event in the Mission. +-- The mission designer NEED TO OVERRIDE the OnBeforeComplete to prevent the mission from getting into completion +-- too early! + +function Mission:OnBeforeComplete( From, Event, To ) + local Group004 = GROUP:FindByName( "Target #004" ) + if Group004:IsAlive() == false then + Mission:GetCommandCenter():MessageToCoalition( "Mission Complete!" ) + return true + end + return false +end \ No newline at end of file diff --git a/Moose Test Missions/TAD - Task Dispatching/TAD-210 - A2G Task Dispatching #1 for AREAS and SCORING/TAD-210 - A2G Task Dispatching #1 for AREAS and SCORING.miz b/Moose Test Missions/TAD - Task Dispatching/TAD-210 - A2G Task Dispatching #1 for AREAS and SCORING/TAD-210 - A2G Task Dispatching #1 for AREAS and SCORING.miz new file mode 100644 index 000000000..c239fdfc0 Binary files /dev/null and b/Moose Test Missions/TAD - Task Dispatching/TAD-210 - A2G Task Dispatching #1 for AREAS and SCORING/TAD-210 - A2G Task Dispatching #1 for AREAS and SCORING.miz differ diff --git a/docs/Documentation/AI_Cap.html b/docs/Documentation/AI_Cap.html index f1305bb2a..2d9f1947a 100644 --- a/docs/Documentation/AI_Cap.html +++ b/docs/Documentation/AI_Cap.html @@ -72,7 +72,7 @@

Module AI_Cap

-

Single-Player:Yes / Multi-Player:Yes / AI:Yes / Human:No / Types:Air -- Execute Combat Air Patrol (CAP).

+

AI - Execute Combat Air Patrol (CAP).

Banner Image

diff --git a/docs/Documentation/AI_Cas.html b/docs/Documentation/AI_Cas.html index 77d7da786..be5f59f41 100644 --- a/docs/Documentation/AI_Cas.html +++ b/docs/Documentation/AI_Cas.html @@ -72,8 +72,7 @@

Module AI_Cas

-

Single-Player:Yes / Multi-Player:Yes / AI:Yes / Human:No / Types:Air -- -Provide Close Air Support to friendly ground troops.

+

AI -- Provide Close Air Support to friendly ground troops.

Banner Image

diff --git a/docs/Documentation/AI_Patrol.html b/docs/Documentation/AI_Patrol.html index 2235f2a59..dfe052794 100644 --- a/docs/Documentation/AI_Patrol.html +++ b/docs/Documentation/AI_Patrol.html @@ -72,8 +72,7 @@

Module AI_Patrol

-

Single-Player:Yes / Multi-Player:Yes / AI:Yes / Human:No / Types:Air -- -Air Patrolling or Staging.

+

AI -- Air Patrolling or Staging.

Banner Image

diff --git a/docs/Documentation/Account.html b/docs/Documentation/Account.html index 92e518f35..e57572897 100644 --- a/docs/Documentation/Account.html +++ b/docs/Documentation/Account.html @@ -72,85 +72,11 @@

Module Account

-

(SP) (MP) (FSM) Account for (Detect, count and report) DCS events occuring on DCS objects (units).

+

Actions - ACTACCOUNT classes account for (detect, count & report) various DCS events occuring on Units.

-
- -

#ACT_ACCOUNT FSM class, extends Fsm#FSM_PROCESS

- -

ACT_ACCOUNT state machine:

- -

This class is a state machine: it manages a process that is triggered by events causing state transitions to occur. -All derived classes from this class will start with the class name, followed by a _. See the relevant derived class descriptions below. -Each derived class follows exactly the same process, using the same events and following the same state transitions, -but will have different implementation behaviour upon each event or state transition.

- -

ACT_ACCOUNT Events:

- -

These are the events defined in this class:

- -
    -
  • Start: The process is started. The process will go into the Report state.
  • -
  • Event: A relevant event has occured that needs to be accounted for. The process will go into the Account state.
  • -
  • Report: The process is reporting to the player the accounting status of the DCS events.
  • -
  • More: There are more DCS events that need to be accounted for. The process will go back into the Report state.
  • -
  • NoMore: There are no more DCS events that need to be accounted for. The process will go into the Success state.
  • -
- -

ACT_ACCOUNT Event methods:

- -

Event methods are available (dynamically allocated by the state machine), that accomodate for state transitions occurring in the process. -There are two types of event methods, which you can use to influence the normal mechanisms in the state machine:

- -
    -
  • Immediate: The event method has exactly the name of the event.
  • -
  • Delayed: The event method starts with a __ + the name of the event. The first parameter of the event method is a number value, expressing the delay in seconds when the event will be executed.
  • -
- -

ACT_ACCOUNT States:

- -
    -
  • Assigned: The player is assigned to the task. This is the initialization state for the process.
  • -
  • Waiting: the process is waiting for a DCS event to occur within the simulator. This state is set automatically.
  • -
  • Report: The process is Reporting to the players in the group of the unit. This state is set automatically every 30 seconds.
  • -
  • Account: The relevant DCS event has occurred, and is accounted for.
  • -
  • Success (*): All DCS events were accounted for.
  • -
  • Failed (*): The process has failed.
  • -
- -

(*) End states of the process.

- -

ACT_ACCOUNT state transition methods:

- -

State transition functions can be set by the mission designer customizing or improving the behaviour of the state. -There are 2 moments when state transition methods will be called by the state machine:

- -
    -
  • Before the state transition. - The state transition method needs to start with the name OnBefore + the name of the state. - If the state transition method returns false, then the processing of the state transition will not be done! - If you want to change the behaviour of the AIControllable at this event, return false, - but then you'll need to specify your own logic using the AIControllable!

  • -
  • After the state transition. - The state transition method needs to start with the name OnAfter + the name of the state. - These state transition methods need to provide a return value, which is specified at the function description.

  • -
- -

1) #ACTACCOUNTDEADS FSM class, extends Fsm.Account#ACT_ACCOUNT

- -

The ACTACCOUNTDEADS class accounts (detects, counts and reports) successful kills of DCS units. -The process is given a Set of units that will be tracked upon successful destruction. -The process will end after each target has been successfully destroyed. -Each successful dead will trigger an Account state transition that can be scored, modified or administered.

- - -

ACTACCOUNTDEADS constructor:

- - +

Banner Image


@@ -279,19 +205,19 @@ Each successful dead will trigger an Account state transition that can be scored - ACT_ACCOUNT_DEADS:onafterEvent(ProcessUnit, Event, From, To, EventData) + ACT_ACCOUNT_DEADS:onafterEvent(ProcessUnit, Event, From, To, Task)

StateMachine callback function

- ACT_ACCOUNT_DEADS:onenterAccount(ProcessUnit, Event, From, To, EventData) + ACT_ACCOUNT_DEADS:onenterAccount(ProcessUnit, Event, From, To, Task, EventData)

StateMachine callback function

- ACT_ACCOUNT_DEADS:onenterReport(ProcessUnit, Event, From, To) + ACT_ACCOUNT_DEADS:onenterReport(ProcessUnit, Event, From, To, Task)

StateMachine callback function

@@ -337,7 +263,58 @@ Each successful dead will trigger an Account state transition that can be scored

Type ACT_ACCOUNT

-

ACT_ACCOUNT class

+

#ACT_ACCOUNT FSM class, extends Fsm#FSM_PROCESS

+ +

ACT_ACCOUNT state machine:

+ +

This class is a state machine: it manages a process that is triggered by events causing state transitions to occur.

+ + +

All derived classes from this class will start with the class name, followed by a _. See the relevant derived class descriptions below. +Each derived class follows exactly the same process, using the same events and following the same state transitions, +but will have different implementation behaviour upon each event or state transition.

+ +

ACT_ACCOUNT States

+ +
    +
  • Asigned: The player is assigned.
  • +
  • Waiting: Waiting for an event.
  • +
  • Report: Reporting.
  • +
  • Account: Account for an event.
  • +
  • Accounted: All events have been accounted for, end of the process.
  • +
  • Failed: Failed the process.
  • +
+ +

ACT_ACCOUNT Events

+ +
    +
  • Start: Start the process.
  • +
  • Wait: Wait for an event.
  • +
  • Report: Report the status of the accounting.
  • +
  • Event: An event happened, process the event.
  • +
  • More: More targets.
  • +
  • NoMore (*): No more targets.
  • +
  • Fail (*): The action process has failed.
  • +
+ +

(*) End states of the process.

+ +

ACT_ACCOUNT state transition methods:

+ +

State transition functions can be set by the mission designer customizing or improving the behaviour of the state. +There are 2 moments when state transition methods will be called by the state machine:

+ +
    +
  • Before the state transition. + The state transition method needs to start with the name OnBefore + the name of the state. + If the state transition method returns false, then the processing of the state transition will not be done! + If you want to change the behaviour of the AIControllable at this event, return false, + but then you'll need to specify your own logic using the AIControllable!

  • +
  • After the state transition. + The state transition method needs to start with the name OnAfter + the name of the state. + These state transition methods need to provide a return value, which is specified at the function description.

    +
  • +

Field(s)

@@ -511,7 +488,22 @@ Each successful dead will trigger an Account state transition that can be scored

Type ACT_ACCOUNT_DEADS

-

ACTACCOUNTDEADS class

+

#ACTACCOUNTDEADS FSM class, extends Fsm.Account#ACT_ACCOUNT

+ +

The ACTACCOUNTDEADS class accounts (detects, counts and reports) successful kills of DCS units.

+ + +

The process is given a Set of units that will be tracked upon successful destruction. +The process will end after each target has been successfully destroyed. +Each successful dead will trigger an Account state transition that can be scored, modified or administered.

+ + +

ACTACCOUNTDEADS constructor:

+ +

Field(s)

@@ -683,7 +675,7 @@ Each successful dead will trigger an Account state transition that can be scored
-ACT_ACCOUNT_DEADS:onafterEvent(ProcessUnit, Event, From, To, EventData) +ACT_ACCOUNT_DEADS:onafterEvent(ProcessUnit, Event, From, To, Task)
@@ -714,7 +706,7 @@ Each successful dead will trigger an Account state transition that can be scored
  • -

    EventData :

    +

    Task :

  • @@ -724,7 +716,7 @@ Each successful dead will trigger an Account state transition that can be scored
    -ACT_ACCOUNT_DEADS:onenterAccount(ProcessUnit, Event, From, To, EventData) +ACT_ACCOUNT_DEADS:onenterAccount(ProcessUnit, Event, From, To, Task, EventData)
    @@ -755,6 +747,11 @@ Each successful dead will trigger an Account state transition that can be scored
  • +

    Task :

    + +
  • +
  • +

    EventData :

  • @@ -765,7 +762,7 @@ Each successful dead will trigger an Account state transition that can be scored
    -ACT_ACCOUNT_DEADS:onenterReport(ProcessUnit, Event, From, To) +ACT_ACCOUNT_DEADS:onenterReport(ProcessUnit, Event, From, To, Task)
    @@ -793,6 +790,11 @@ Each successful dead will trigger an Account state transition that can be scored

    #string To :

    + +
  • + +

    Task :

    +
  • diff --git a/docs/Documentation/Detection.html b/docs/Documentation/Detection.html index f00ac4e81..d0329b678 100644 --- a/docs/Documentation/Detection.html +++ b/docs/Documentation/Detection.html @@ -72,273 +72,27 @@

    Module Detection

    -

    This module contains the DETECTION classes.

    +

    Functional - DETECTION_ classes model the detection of enemy units by FACs or RECCEs and group them according various methods.

    -

    -

    # 1) #DETECTION_BASE class, extends Fsm#FSM

    - -

    The #DETECTION_BASE class defines the core functions to administer detected objects. - The #DETECTION_BASE class will detect objects within the battle zone for a list of Groups detecting targets following (a) detection method(s).

    - -

    ## 1.1) DETECTION_BASE constructor

    - -

    Construct a new DETECTION_BASE instance using the DETECTION_BASE.New() method.

    - -

    ## 1.2) DETECTION_BASE initialization

    - -

    By default, detection will return detected objects with all the detection sensors available. - However, you can ask how the objects were found with specific detection methods. - If you use one of the below methods, the detection will work with the detection method specified. - You can specify to apply multiple detection methods.

    - -

    Use the following functions to report the objects it detected using the methods Visual, Optical, Radar, IRST, RWR, DLINK:

    - - - -

    ## 1.3) DETECTION_BASE derived classes group the detected units into a DetectedItems[] list

    - -

    DETECTIONBASE derived classes build a list called DetectedItems[], which is essentially a first later - of grouping of detected units. Each DetectedItem within the DetectedItems[] list contains - a SETUNIT object that contains the detected units that belong to that group.

    - -

    Derived classes will apply different methods to group the detected units. - Examples are per area, per quadrant, per distance, per type. - See further the derived DETECTION classes on which grouping methods are currently supported.

    - -

    Various methods exist how to retrieve the grouped items from a DETECTION_BASE derived class:

    - -
      -
    • The method Detection#DETECTION_BASE.GetDetectedItems() retrieves the DetectedItems[] list.
    • -
    • A DetectedItem from the DetectedItems[] list can be retrieved using the method Detection#DETECTION_BASE.GetDetectedItem( DetectedItemIndex ). - Note that this method returns a DetectedItem element from the list, that contains a Set variable and further information - about the DetectedItem that is set by the DETECTION_BASE derived classes, used to group the DetectedItem.
    • -
    • A DetectedSet from the DetectedItems[] list can be retrieved using the method Detection#DETECTION_BASE.GetDetectedSet( DetectedItemIndex ). - This method retrieves the Set from a DetectedItem element from the DetectedItem list (DetectedItems[ DetectedItemIndex ].Set ).
    • -
    - -

    ## 1.4) Apply additional Filters to fine-tune the detected objects

    - -

    By default, DCS World will return any object that is in LOS and within "visual reach", or detectable through one of the electronic detection means. - That being said, the DCS World detection algorithm can sometimes be unrealistic. - Especially for a visual detection, DCS World is able to report within 1 second a detailed detection of a group of 20 units (including types of the units) that are 10 kilometers away, using only visual capabilities. - Additionally, trees and other obstacles are not accounted during the DCS World detection.

    - -

    Therefore, an additional (optional) filtering has been built into the DETECTION_BASE class, that can be set for visual detected units. - For electronic detection, this filtering is not applied, only for visually detected targets.

    - -

    The following additional filtering can be applied for visual filtering:

    - -
      -
    • A probability factor per kilometer distance.
    • -
    • A probability factor based on the alpha angle between the detected object and the unit detecting. - A detection from a higher altitude allows for better detection than when on the ground.
    • -
    • Define a probability factor for "cloudy zones", which are zones where forests or villages are located. In these zones, detection will be much more difficult. - The mission designer needs to define these cloudy zones within the mission, and needs to register these zones in the DETECTION_ objects additing a probability factor per zone.
    • -
    - -

    I advise however, that, when you first use the DETECTION derived classes, that you don't use these filters. - Only when you experience unrealistic behaviour in your missions, these filters could be applied.

    - -

    ### 1.4.1 ) Distance visual detection probability

    - -

    Upon a visual detection, the further away a detected object is, the less likely it is to be detected properly. - Also, the speed of accurate detection plays a role.

    - -

    A distance probability factor between 0 and 1 can be given, that will model a linear extrapolated probability over 10 km distance.

    - -

    For example, if a probability factor of 0.6 (60%) is given, the extrapolated probabilities over 15 kilometers would like like: - 1 km: 96%, 2 km: 92%, 3 km: 88%, 4 km: 84%, 5 km: 80%, 6 km: 76%, 7 km: 72%, 8 km: 68%, 9 km: 64%, 10 km: 60%, 11 km: 56%, 12 km: 52%, 13 km: 48%, 14 km: 44%, 15 km: 40%.

    - -

    Note that based on this probability factor, not only the detection but also the type of the unit will be applied!

    - -

    Use the method Detection#DETECTION_BASE.SetDistanceProbability() to set the probability factor upon a 10 km distance.

    - -

    ### 1.4.2 ) Alpha Angle visual detection probability

    - -

    Upon a visual detection, the higher the unit is during the detecting process, the more likely the detected unit is to be detected properly. - A detection at a 90% alpha angle is the most optimal, a detection at 10% is less and a detection at 0% is less likely to be correct.

    - -

    A probability factor between 0 and 1 can be given, that will model a progressive extrapolated probability if the target would be detected at a 0° angle.

    - -

    For example, if a alpha angle probability factor of 0.7 is given, the extrapolated probabilities of the different angles would look like: - 0°: 70%, 10°: 75,21%, 20°: 80,26%, 30°: 85%, 40°: 89,28%, 50°: 92,98%, 60°: 95,98%, 70°: 98,19%, 80°: 99,54%, 90°: 100%

    - -

    Use the method Detection#DETECTION_BASE.SetAlphaAngleProbability() to set the probability factor if 0°.

    - -

    ### 1.4.3 ) Cloudy Zones detection probability

    - -

    Upon a visual detection, the more a detected unit is within a cloudy zone, the less likely the detected unit is to be detected successfully. - The Cloudy Zones work with the ZONE_BASE derived classes. The mission designer can define within the mission - zones that reflect cloudy areas where detected units may not be so easily visually detected.

    - -

    Use the method Detection#DETECTION_BASE.SetZoneProbability() to set for a defined number of zones, the probability factors.

    - -

    Note however, that the more zones are defined to be "cloudy" within a detection, the more performance it will take - from the DETECTIONBASE to calculate the presence of the detected unit within each zone. - Expecially for ZONEPOLYGON, try to limit the amount of nodes of the polygon!

    - -

    Typically, this kind of filter would be applied for very specific areas were a detection needs to be very realisting for - AI not to detect so easily targets within a forrest or village rich area.

    - -

    ## 1.5 ) Accept / Reject detected units

    - -

    DETECTION_BASE can accept or reject successful detections based on the location of the detected object, - if it is located in range or located inside or outside of specific zones.

    - -

    ### 1.5.1 ) Detection acceptance of within range limit

    - -

    A range can be set that will limit a successful detection for a unit. - Use the method Detection#DETECTION_BASE.SetAcceptRange() to apply a range in meters till where detected units will be accepted.

    - -
      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 )
    -
    -  -- This will accept detected units if the range is below 5000 meters.
    -  Detection:SetAcceptRange( 5000 ) 
    -
    -  -- Start the Detection.
    -  Detection:Start()
    -
    - - -

    ### 1.5.2 ) Detection acceptance if within zone(s).

    - -

    Specific ZONEBASE object(s) can be given as a parameter, which will only accept a detection if the unit is within the specified ZONEBASE object(s). - Use the method Detection#DETECTION_BASE.SetAcceptZones() will accept detected units if they are within the specified zones.

    - -
      local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers.
    -
    -  -- Search fo the zones where units are to be accepted.
    -  local ZoneAccept1 = ZONE:New( "AcceptZone1" )
    -  local ZoneAccept2 = ZONE:New( "AcceptZone2" )
    -
    -  -- Build a detect object.
    -  local Detection = DETECTION_BASE:New( SetGroup )
    -
    -  -- This will accept detected units by Detection when the unit is within ZoneAccept1 OR ZoneAccept2.
    -  Detection:SetAcceptZones( { ZoneAccept1, ZoneAccept2 } ) 
    -
    -  -- Start the Detection.
    -  Detection:Start()
    -
    - -

    ### 1.5.3 ) Detection rejectance if within zone(s).

    - -

    Specific ZONEBASE object(s) can be given as a parameter, which will reject detection if the unit is within the specified ZONEBASE object(s). - Use the method Detection#DETECTION_BASE.SetRejectZones() will reject detected units if they are within the specified zones. - An example of how to use the method is shown below.

    - -
      local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers.
    -
    -  -- Search fo the zones where units are to be rejected.
    -  local ZoneReject1 = ZONE:New( "RejectZone1" )
    -  local ZoneReject2 = ZONE:New( "RejectZone2" )
    -
    -  -- Build a detect object.
    -  local Detection = DETECTION_BASE:New( SetGroup )
    -
    -  -- This will reject detected units by Detection when the unit is within ZoneReject1 OR ZoneReject2.
    -  Detection:SetRejectZones( { ZoneReject1, ZoneReject2 } ) 
    -
    -  -- Start the Detection.
    -  Detection:Start()
    -
    - -

    ## 1.6) DETECTION_BASE is a Finite State Machine

    - -

    Various Events and State Transitions can be tailored using DETECTION_BASE.

    - -

    ### 1.6.1) DETECTION_BASE States

    - -
      -
    • Detecting: The detection is running.
    • -
    • Stopped: The detection is stopped.
    • -
    - -

    ### 1.6.2) DETECTION_BASE Events

    - -
      -
    • Start: Start the detection process.
    • -
    • Detect: Detect new units.
    • -
    • Detected: New units have been detected.
    • -
    • Stop: Stop the detection process.
    • -
    +

    Banner Image


    -

    # 2) Detection#DETECTION_UNITS class, extends Detection#DETECTION_BASE

    - -

    The Detection#DETECTION_UNITS class will detect units within the battle zone. - It will build a DetectedItems list filled with DetectedItems. Each DetectedItem will contain a field Set, which contains a Set#SET_UNIT containing ONE UNIT object reference. - Beware that when the amount of units detected is large, the DetectedItems list will be large also.

    - -

    # 3) Detection#DETECTION_TYPES class, extends Detection#DETECTION_BASE

    - -

    The Detection#DETECTION_TYPES class will detect units within the battle zone. - It will build a DetectedItems[] list filled with DetectedItems, grouped by the type of units detected. - Each DetectedItem will contain a field Set, which contains a Set#SET_UNIT containing ONE UNIT object reference. - Beware that when the amount of different types detected is large, the DetectedItems[] list will be large also.

    - -

    # 4) Detection#DETECTION_AREAS class, extends Detection#DETECTION_BASE

    - -

    The Detection#DETECTION_AREAS class will detect units within the battle zone for a list of Groups detecting targets following (a) detection method(s), - and will build a list (table) of Set#SET_UNITs containing the Unit#UNITs detected. - The class is group the detected units within zones given a DetectedZoneRange parameter. - A set with multiple detected zones will be created as there are groups of units detected.

    - -

    ## 4.1) Retrieve the Detected Unit Sets and Detected Zones

    - -

    The methods to manage the DetectedItems[].Set(s) are implemented in Detection#DECTECTION_BASE and - the methods to manage the DetectedItems[].Zone(s) is implemented in Detection#DETECTION_AREAS.

    - -

    Retrieve the DetectedItems[].Set with the method Detection#DETECTION_BASE.GetDetectedSet(). A Set#SET_UNIT object will be returned.

    - -

    Retrieve the formed Zones as a result of the grouping the detected units within the DetectionZoneRange, use the method Detection#DETECTION_BASE.GetDetectionZones(). - To understand the amount of zones created, use the method Detection#DETECTION_BASE.GetDetectionZoneCount(). - If you want to obtain a specific zone from the DetectedZones, use the method Detection#DETECTION_BASE.GetDetectionZone() with a given index.

    - -

    ## 4.4) Flare or Smoke detected units

    - -

    Use the methods Detection#DETECTION_AREAS.FlareDetectedUnits() or Detection#DETECTION_AREAS.SmokeDetectedUnits() to flare or smoke the detected units when a new detection has taken place.

    - -

    ## 4.5) Flare or Smoke or Bound detected zones

    - -

    Use the methods:

    - - - -

    the detected zones when a new detection has taken place.

    - -
    - -

    ### Contributions:

    +

    Contributions:

    • Mechanist : Early concept of DETECTION_AREAS.
    -

    ### Authors:

    +

    Authors:

      -
    • FlightControl : Analysis, Design, Programming, Testing -
    • +
    • FlightControl : Analysis, Design, Programming, Testing
    +

    Global(s)

    @@ -1321,7 +1075,42 @@

    Type DETECTION_AREAS

    -

    DETECTION_AREAS class

    +

    # 4) DETECTION_AREAS class, extends Detection#DETECTION_BASE

    + +

    The DETECTION_AREAS class will detect units within the battle zone for a list of Groups detecting targets following (a) detection method(s), + and will build a list (table) of Set#SET_UNITs containing the Unit#UNITs detected.

    + + +

    The class is group the detected units within zones given a DetectedZoneRange parameter. + A set with multiple detected zones will be created as there are groups of units detected.

    + +

    ## 4.1) Retrieve the Detected Unit Sets and Detected Zones

    + +

    The methods to manage the DetectedItems[].Set(s) are implemented in Detection#DECTECTION_BASE and + the methods to manage the DetectedItems[].Zone(s) is implemented in Detection#DETECTION_AREAS.

    + +

    Retrieve the DetectedItems[].Set with the method Detection#DETECTION_BASE.GetDetectedSet(). A Set#SET_UNIT object will be returned.

    + +

    Retrieve the formed Zones as a result of the grouping the detected units within the DetectionZoneRange, use the method Detection#DETECTION_BASE.GetDetectionZones(). + To understand the amount of zones created, use the method Detection#DETECTION_BASE.GetDetectionZoneCount(). + If you want to obtain a specific zone from the DetectedZones, use the method Detection#DETECTION_BASE.GetDetectionZone() with a given index.

    + +

    ## 4.4) Flare or Smoke detected units

    + +

    Use the methods Detection#DETECTION_AREAS.FlareDetectedUnits() or Detection#DETECTION_AREAS.SmokeDetectedUnits() to flare or smoke the detected units when a new detection has taken place.

    + +

    ## 4.5) Flare or Smoke or Bound detected zones

    + +

    Use the methods:

    + + + +

    the detected zones when a new detection has taken place. +

    Field(s)

    @@ -1734,7 +1523,206 @@ self

    Type DETECTION_BASE

    -

    DETECTION_BASE class

    +

    1) DETECTION_BASE class, extends Fsm#FSM

    + +

    The DETECTION_BASE class defines the core functions to administer detected objects.

    + + +

    The DETECTION_BASE class will detect objects within the battle zone for a list of Groups detecting targets following (a) detection method(s).

    + +

    1.1) DETECTION_BASE constructor

    + +

    Construct a new DETECTION_BASE instance using the DETECTION_BASE.New() method.

    + +

    1.2) DETECTION_BASE initialization

    + +

    By default, detection will return detected objects with all the detection sensors available. +However, you can ask how the objects were found with specific detection methods. +If you use one of the below methods, the detection will work with the detection method specified. +You can specify to apply multiple detection methods.

    + +

    Use the following functions to report the objects it detected using the methods Visual, Optical, Radar, IRST, RWR, DLINK:

    + + + +

    1.3) DETECTION_BASE derived classes group the detected units into a DetectedItems[] list

    + +

    DETECTIONBASE derived classes build a list called DetectedItems[], which is essentially a first later +of grouping of detected units. Each DetectedItem within the DetectedItems[] list contains +a SETUNIT object that contains the detected units that belong to that group.

    + +

    Derived classes will apply different methods to group the detected units. +Examples are per area, per quadrant, per distance, per type. +See further the derived DETECTION classes on which grouping methods are currently supported.

    + +

    Various methods exist how to retrieve the grouped items from a DETECTION_BASE derived class:

    + +
      +
    • The method Detection#DETECTION_BASE.GetDetectedItems() retrieves the DetectedItems[] list.
    • +
    • A DetectedItem from the DetectedItems[] list can be retrieved using the method Detection#DETECTION_BASE.GetDetectedItem( DetectedItemIndex ). + Note that this method returns a DetectedItem element from the list, that contains a Set variable and further information + about the DetectedItem that is set by the DETECTION_BASE derived classes, used to group the DetectedItem.
    • +
    • A DetectedSet from the DetectedItems[] list can be retrieved using the method Detection#DETECTION_BASE.GetDetectedSet( DetectedItemIndex ). + This method retrieves the Set from a DetectedItem element from the DetectedItem list (DetectedItems[ DetectedItemIndex ].Set ).
    • +
    + +

    1.4) Apply additional Filters to fine-tune the detected objects

    + +

    By default, DCS World will return any object that is in LOS and within "visual reach", or detectable through one of the electronic detection means. +That being said, the DCS World detection algorithm can sometimes be unrealistic. +Especially for a visual detection, DCS World is able to report within 1 second a detailed detection of a group of 20 units (including types of the units) that are 10 kilometers away, using only visual capabilities. +Additionally, trees and other obstacles are not accounted during the DCS World detection.

    + +

    Therefore, an additional (optional) filtering has been built into the DETECTION_BASE class, that can be set for visual detected units. +For electronic detection, this filtering is not applied, only for visually detected targets.

    + +

    The following additional filtering can be applied for visual filtering:

    + +
      +
    • A probability factor per kilometer distance.
    • +
    • A probability factor based on the alpha angle between the detected object and the unit detecting. + A detection from a higher altitude allows for better detection than when on the ground.
    • +
    • Define a probability factor for "cloudy zones", which are zones where forests or villages are located. In these zones, detection will be much more difficult. + The mission designer needs to define these cloudy zones within the mission, and needs to register these zones in the DETECTION_ objects additing a probability factor per zone.
    • +
    + +

    I advise however, that, when you first use the DETECTION derived classes, that you don't use these filters. +Only when you experience unrealistic behaviour in your missions, these filters could be applied.

    + +

    1.4.1 ) Distance visual detection probability

    + +

    Upon a visual detection, the further away a detected object is, the less likely it is to be detected properly. +Also, the speed of accurate detection plays a role.

    + +

    A distance probability factor between 0 and 1 can be given, that will model a linear extrapolated probability over 10 km distance.

    + +

    For example, if a probability factor of 0.6 (60%) is given, the extrapolated probabilities over 15 kilometers would like like: +1 km: 96%, 2 km: 92%, 3 km: 88%, 4 km: 84%, 5 km: 80%, 6 km: 76%, 7 km: 72%, 8 km: 68%, 9 km: 64%, 10 km: 60%, 11 km: 56%, 12 km: 52%, 13 km: 48%, 14 km: 44%, 15 km: 40%.

    + +

    Note that based on this probability factor, not only the detection but also the type of the unit will be applied!

    + +

    Use the method Detection#DETECTION_BASE.SetDistanceProbability() to set the probability factor upon a 10 km distance.

    + +

    1.4.2 ) Alpha Angle visual detection probability

    + +

    Upon a visual detection, the higher the unit is during the detecting process, the more likely the detected unit is to be detected properly. +A detection at a 90% alpha angle is the most optimal, a detection at 10% is less and a detection at 0% is less likely to be correct.

    + +

    A probability factor between 0 and 1 can be given, that will model a progressive extrapolated probability if the target would be detected at a 0° angle.

    + +

    For example, if a alpha angle probability factor of 0.7 is given, the extrapolated probabilities of the different angles would look like: +0°: 70%, 10°: 75,21%, 20°: 80,26%, 30°: 85%, 40°: 89,28%, 50°: 92,98%, 60°: 95,98%, 70°: 98,19%, 80°: 99,54%, 90°: 100%

    + +

    Use the method Detection#DETECTION_BASE.SetAlphaAngleProbability() to set the probability factor if 0°.

    + +

    1.4.3 ) Cloudy Zones detection probability

    + +

    Upon a visual detection, the more a detected unit is within a cloudy zone, the less likely the detected unit is to be detected successfully. +The Cloudy Zones work with the ZONE_BASE derived classes. The mission designer can define within the mission +zones that reflect cloudy areas where detected units may not be so easily visually detected.

    + +

    Use the method Detection#DETECTION_BASE.SetZoneProbability() to set for a defined number of zones, the probability factors.

    + +

    Note however, that the more zones are defined to be "cloudy" within a detection, the more performance it will take +from the DETECTIONBASE to calculate the presence of the detected unit within each zone. +Expecially for ZONEPOLYGON, try to limit the amount of nodes of the polygon!

    + +

    Typically, this kind of filter would be applied for very specific areas were a detection needs to be very realisting for +AI not to detect so easily targets within a forrest or village rich area.

    + +

    1.5 ) Accept / Reject detected units

    + +

    DETECTION_BASE can accept or reject successful detections based on the location of the detected object, +if it is located in range or located inside or outside of specific zones.

    + +

    1.5.1 ) Detection acceptance of within range limit

    + +

    A range can be set that will limit a successful detection for a unit. +Use the method Detection#DETECTION_BASE.SetAcceptRange() to apply a range in meters till where detected units will be accepted.

    + +
     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 )
    +
    + -- This will accept detected units if the range is below 5000 meters.
    + Detection:SetAcceptRange( 5000 ) 
    +
    + -- Start the Detection.
    + Detection:Start()
    +
    + + +

    1.5.2 ) Detection acceptance if within zone(s).

    + +

    Specific ZONEBASE object(s) can be given as a parameter, which will only accept a detection if the unit is within the specified ZONEBASE object(s). +Use the method Detection#DETECTION_BASE.SetAcceptZones() will accept detected units if they are within the specified zones.

    + +
     local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers.
    +
    + -- Search fo the zones where units are to be accepted.
    + local ZoneAccept1 = ZONE:New( "AcceptZone1" )
    + local ZoneAccept2 = ZONE:New( "AcceptZone2" )
    +
    + -- Build a detect object.
    + local Detection = DETECTION_BASE:New( SetGroup )
    +
    + -- This will accept detected units by Detection when the unit is within ZoneAccept1 OR ZoneAccept2.
    + Detection:SetAcceptZones( { ZoneAccept1, ZoneAccept2 } ) 
    +
    + -- Start the Detection.
    + Detection:Start()
    +
    + +

    1.5.3 ) Detection rejectance if within zone(s).

    + +

    Specific ZONEBASE object(s) can be given as a parameter, which will reject detection if the unit is within the specified ZONEBASE object(s). +Use the method Detection#DETECTION_BASE.SetRejectZones() will reject detected units if they are within the specified zones. +An example of how to use the method is shown below.

    + +
     local SetGroup = SET_GROUP:New():FilterPrefixes( "FAC" ):FilterStart() -- Build a SetGroup of Forward Air Controllers.
    +
    + -- Search fo the zones where units are to be rejected.
    + local ZoneReject1 = ZONE:New( "RejectZone1" )
    + local ZoneReject2 = ZONE:New( "RejectZone2" )
    +
    + -- Build a detect object.
    + local Detection = DETECTION_BASE:New( SetGroup )
    +
    + -- This will reject detected units by Detection when the unit is within ZoneReject1 OR ZoneReject2.
    + Detection:SetRejectZones( { ZoneReject1, ZoneReject2 } ) 
    +
    + -- Start the Detection.
    + Detection:Start()
    +
    + +

    1.6) DETECTION_BASE is a Finite State Machine

    + +

    Various Events and State Transitions can be tailored using DETECTION_BASE.

    + +

    1.6.1) DETECTION_BASE States

    + +
      +
    • Detecting: The detection is running.
    • +
    • Stopped: The detection is stopped.
    • +
    + +

    1.6.2) DETECTION_BASE Events

    + +
      +
    • Start: Start the detection process.
    • +
    • Detect: Detect new units.
    • +
    • Detected: New units have been detected.
    • +
    • Stop: Stop the detection process.
    • +
    +

    Field(s)

    @@ -2243,7 +2231,7 @@ self

    - + #number DETECTION_BASE.DetectionInterval @@ -3969,7 +3957,15 @@ The To State string.

    Type DETECTION_TYPES

    -

    DETECTION_TYPES class

    +

    3) DETECTION_TYPES class, extends Detection#DETECTION_BASE

    + +

    The DETECTION_TYPES class will detect units within the battle zone.

    + + +

    It will build a DetectedItems[] list filled with DetectedItems, grouped by the type of units detected. +Each DetectedItem will contain a field Set, which contains a Set#SET_UNIT containing ONE UNIT object reference. +Beware that when the amount of different types detected is large, the DetectedItems[] list will be large also.

    +

    Field(s)

    @@ -4197,7 +4193,14 @@ self

    Type DETECTION_UNITS

    -

    DETECTION_UNITS class

    +

    2) DETECTION_UNITS class, extends Detection#DETECTION_BASE

    + +

    The DETECTION_UNITS class will detect units within the battle zone.

    + + +

    It will build a DetectedItems list filled with DetectedItems. Each DetectedItem will contain a field Set, which contains a Set#SET_UNIT containing ONE UNIT object reference. +Beware that when the amount of units detected is large, the DetectedItems list will be large also.

    +

    Field(s)

    diff --git a/docs/Documentation/DetectionManager.html b/docs/Documentation/DetectionManager.html index 4828a274a..e968ee9b0 100644 --- a/docs/Documentation/DetectionManager.html +++ b/docs/Documentation/DetectionManager.html @@ -78,7 +78,7 @@
    -

    1) DetectionManager#DETECTION_MANAGER class, extends Base#BASE

    +

    1) DetectionManager#DETECTION_MANAGER class, extends Fsm#FSM

    The DetectionManager#DETECTION_MANAGER class defines the core functions to report detected objects to groups. Reportings can be done in several manners, and it is up to the derived classes if DETECTION_MANAGER to model the reporting behaviour.

    @@ -139,12 +139,6 @@ If an ad-hoc report is requested, use the method DETECTION_MANAGER.Detection
    - - - - @@ -160,15 +154,9 @@ If an ad-hoc report is requested, use the method DETECTION_MANAGER:ReportDetected(Detection) + - - - - @@ -187,12 +175,6 @@ If an ad-hoc report is requested, use the method DETECTION_MANAGER:SetReportInterval(ReportInterval) - - - - @@ -208,7 +190,13 @@ If an ad-hoc report is requested, use the method DETECTION_MANAGER._ScheduleDelayTime + + + + + @@ -317,20 +305,6 @@ If an ad-hoc report is requested, use the method -
    - - - -DETECTION_MANAGER.FacScheduler - -
    -
    - - -
    @@ -385,8 +359,8 @@ self

    - -DETECTION_MANAGER:ReportDetected(Detection) + +DETECTION_MANAGER:ProcessDetected(Detection)
    @@ -406,39 +380,6 @@ self

    #DETECTION_MANAGER: self

    -
    -
    -
    -
    - - -DETECTION_MANAGER:Schedule(DelayTime, ReportInterval) - -
    -
    - -

    Schedule the FAC reporting.

    - -

    Parameters

    -
      -
    • - -

      #number DelayTime : -The delay in seconds to wait the reporting.

      - -
    • -
    • - -

      #number ReportInterval : -The repeat interval in seconds for the reporting to happen repeatedly.

      - -
    • -
    -

    Return value

    - -

    #DETECTION_MANAGER: -self

    -
    @@ -507,27 +448,6 @@ The interval in seconds when a report needs to be done.

    #DETECTION_MANAGER: self

    - -
    -
    -
    - - -DETECTION_MANAGER:_FacScheduler(SchedulerName) - -
    -
    - -

    Report the detected Unit#UNITs detected within the Detection#DETECTION_BASE object to the Set#SET_GROUPs.

    - -

    Parameter

    -
      -
    • - -

      SchedulerName :

      - -
    • -
    @@ -561,15 +481,63 @@ self

    - - -DETECTION_MANAGER._ScheduleDelayTime + +DETECTION_MANAGER:onafterReport(From, Event, To)
    +

    Parameters

    +
      +
    • + +

      From :

      + +
    • +
    • + +

      Event :

      + +
    • +
    • + +

      To :

      + +
    • +
    +
    +
    +
    +
    + + +DETECTION_MANAGER:onafterStart(From, Event, To) + +
    +
    + + + +

    Parameters

    +
      +
    • + +

      From :

      + +
    • +
    • + +

      Event :

      + +
    • +
    • + +

      To :

      + +
    • +
    diff --git a/docs/Documentation/MOVEMENT.html b/docs/Documentation/MOVEMENT.html index f81accb1c..824e74b60 100644 --- a/docs/Documentation/MOVEMENT.html +++ b/docs/Documentation/MOVEMENT.html @@ -190,6 +190,7 @@ on defined intervals (currently every minute).

    + #number MOVEMENT.AliveUnits @@ -198,6 +199,9 @@ on defined intervals (currently every minute).

    + +

    Contains the counter how many units are currently alive

    +
    diff --git a/docs/Documentation/Spawn.html b/docs/Documentation/Spawn.html index 7814eda9f..5ec635661 100644 --- a/docs/Documentation/Spawn.html +++ b/docs/Documentation/Spawn.html @@ -1870,6 +1870,9 @@ The group that was spawned. You can use this group for further actions.

    + +

    Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning.

    +
    @@ -2731,7 +2734,7 @@ Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) -

    When the first Spawn executes, all the Groups need to be made visible before start.

    +

    Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned.

    diff --git a/docs/Documentation/Task.html b/docs/Documentation/Task.html index 3ea8ea160..05b4eba8a 100644 --- a/docs/Documentation/Task.html +++ b/docs/Documentation/Task.html @@ -183,6 +183,12 @@ Use the method TASK.AddScore() to add scores whe
    + + + + @@ -495,6 +501,12 @@ Use the method TASK.AddScore() to add scores whe + + + + @@ -714,7 +726,7 @@ Use the method TASK.AddScore() to add scores whe - + @@ -940,6 +952,20 @@ The CLIENT or UNIT of the Player aborting the Task.

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

    + + +
    +
    + + + +TASK.Dispatcher + +
    +
    + + +
    @@ -2012,6 +2038,32 @@ self

    #TASK: self

    + +
    +
    +
    + + +TASK:SetDispatcher(Dispatcher) + +
    +
    + +

    Set dispatcher of a task

    + +

    Parameter

    + +

    Return value

    + +

    #TASK:

    + +
    @@ -2714,7 +2766,7 @@ self

    -TASK:onenterAssigned(Event, From, To) +TASK:onenterAssigned(Event, From, To, PlayerUnit, PlayerName)
    @@ -2737,6 +2789,16 @@ self

    #string To :

    + +
  • + +

    PlayerUnit :

    + +
  • +
  • + +

    PlayerName :

    +
  • diff --git a/docs/Documentation/Task_A2G_Dispatcher.html b/docs/Documentation/Task_A2G_Dispatcher.html index b653d16ca..f9d59507a 100644 --- a/docs/Documentation/Task_A2G_Dispatcher.html +++ b/docs/Documentation/Task_A2G_Dispatcher.html @@ -180,6 +180,12 @@ Find a summary below describing for which situation a task type is created:

    + + + + @@ -439,6 +445,55 @@ self

    + +TASK_A2G_DISPATCHER:OnAfterAssign(From, Event, To, Task, TaskUnit, PlayerName) + +
    +
    + +

    OnAfter Transition Handler for Event Assign.

    + +

    Parameters

    +
      +
    • + +

      #string From : +The From State string.

      + +
    • +
    • + +

      #string Event : +The Event string.

      + +
    • +
    • + +

      #string To : +The To State string.

      + +
    • +
    • + +

      Tasking.TaskA2G#TASKA2G Task :

      + +
    • +
    • + +

      Wrapper.Unit#UNIT TaskUnit :

      + +
    • +
    • + +

      #string PlayerName :

      + +
    • +
    +
    +
    +
    +
    + TASK_A2G_DISPATCHER:ProcessDetected(Detection) diff --git a/docs/Documentation/index.html b/docs/Documentation/index.html index e511745e6..7a0b14173 100644 --- a/docs/Documentation/index.html +++ b/docs/Documentation/index.html @@ -92,7 +92,7 @@ CLIENTS in a SET_CLIENT collection, which are not occupied by human players.

    @@ -214,7 +212,7 @@ and automatically engage any airborne enemies that are within a certain range or diff --git a/docs/Presentations/ACT_ACCOUNT/Dia1.JPG b/docs/Presentations/ACT_ACCOUNT/Dia1.JPG new file mode 100644 index 000000000..dbb082a48 Binary files /dev/null and b/docs/Presentations/ACT_ACCOUNT/Dia1.JPG differ diff --git a/docs/Presentations/DETECTION/Dia1.JPG b/docs/Presentations/DETECTION/Dia1.JPG new file mode 100644 index 000000000..568646fa4 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia1.JPG differ diff --git a/docs/Presentations/DETECTION/Dia10.JPG b/docs/Presentations/DETECTION/Dia10.JPG new file mode 100644 index 000000000..1d6cab399 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia10.JPG differ diff --git a/docs/Presentations/DETECTION/Dia11.JPG b/docs/Presentations/DETECTION/Dia11.JPG new file mode 100644 index 000000000..0ce4a6d8a Binary files /dev/null and b/docs/Presentations/DETECTION/Dia11.JPG differ diff --git a/docs/Presentations/DETECTION/Dia12.JPG b/docs/Presentations/DETECTION/Dia12.JPG new file mode 100644 index 000000000..befe2f3a3 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia12.JPG differ diff --git a/docs/Presentations/DETECTION/Dia13.JPG b/docs/Presentations/DETECTION/Dia13.JPG new file mode 100644 index 000000000..2b2e3182c Binary files /dev/null and b/docs/Presentations/DETECTION/Dia13.JPG differ diff --git a/docs/Presentations/DETECTION/Dia14.JPG b/docs/Presentations/DETECTION/Dia14.JPG new file mode 100644 index 000000000..ca35da8f9 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia14.JPG differ diff --git a/docs/Presentations/DETECTION/Dia15.JPG b/docs/Presentations/DETECTION/Dia15.JPG new file mode 100644 index 000000000..746860f9d Binary files /dev/null and b/docs/Presentations/DETECTION/Dia15.JPG differ diff --git a/docs/Presentations/DETECTION/Dia16.JPG b/docs/Presentations/DETECTION/Dia16.JPG new file mode 100644 index 000000000..957c00307 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia16.JPG differ diff --git a/docs/Presentations/DETECTION/Dia17.JPG b/docs/Presentations/DETECTION/Dia17.JPG new file mode 100644 index 000000000..a95e866c2 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia17.JPG differ diff --git a/docs/Presentations/DETECTION/Dia18.JPG b/docs/Presentations/DETECTION/Dia18.JPG new file mode 100644 index 000000000..98b861148 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia18.JPG differ diff --git a/docs/Presentations/DETECTION/Dia19.JPG b/docs/Presentations/DETECTION/Dia19.JPG new file mode 100644 index 000000000..02a90e680 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia19.JPG differ diff --git a/docs/Presentations/DETECTION/Dia2.JPG b/docs/Presentations/DETECTION/Dia2.JPG new file mode 100644 index 000000000..a3dcfd13b Binary files /dev/null and b/docs/Presentations/DETECTION/Dia2.JPG differ diff --git a/docs/Presentations/DETECTION/Dia20.JPG b/docs/Presentations/DETECTION/Dia20.JPG new file mode 100644 index 000000000..8268dd239 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia20.JPG differ diff --git a/docs/Presentations/DETECTION/Dia21.JPG b/docs/Presentations/DETECTION/Dia21.JPG new file mode 100644 index 000000000..0b299e044 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia21.JPG differ diff --git a/docs/Presentations/DETECTION/Dia22.JPG b/docs/Presentations/DETECTION/Dia22.JPG new file mode 100644 index 000000000..460fd1a19 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia22.JPG differ diff --git a/docs/Presentations/DETECTION/Dia23.JPG b/docs/Presentations/DETECTION/Dia23.JPG new file mode 100644 index 000000000..da9dc5a0d Binary files /dev/null and b/docs/Presentations/DETECTION/Dia23.JPG differ diff --git a/docs/Presentations/DETECTION/Dia24.JPG b/docs/Presentations/DETECTION/Dia24.JPG new file mode 100644 index 000000000..a521d0c09 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia24.JPG differ diff --git a/docs/Presentations/DETECTION/Dia25.JPG b/docs/Presentations/DETECTION/Dia25.JPG new file mode 100644 index 000000000..0206d8f96 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia25.JPG differ diff --git a/docs/Presentations/DETECTION/Dia26.JPG b/docs/Presentations/DETECTION/Dia26.JPG new file mode 100644 index 000000000..2d7109c90 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia26.JPG differ diff --git a/docs/Presentations/DETECTION/Dia3.JPG b/docs/Presentations/DETECTION/Dia3.JPG new file mode 100644 index 000000000..1f2c58924 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia3.JPG differ diff --git a/docs/Presentations/DETECTION/Dia4.JPG b/docs/Presentations/DETECTION/Dia4.JPG new file mode 100644 index 000000000..b9450da5c Binary files /dev/null and b/docs/Presentations/DETECTION/Dia4.JPG differ diff --git a/docs/Presentations/DETECTION/Dia5.JPG b/docs/Presentations/DETECTION/Dia5.JPG new file mode 100644 index 000000000..0df32d026 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia5.JPG differ diff --git a/docs/Presentations/DETECTION/Dia6.JPG b/docs/Presentations/DETECTION/Dia6.JPG new file mode 100644 index 000000000..6707c5928 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia6.JPG differ diff --git a/docs/Presentations/DETECTION/Dia7.JPG b/docs/Presentations/DETECTION/Dia7.JPG new file mode 100644 index 000000000..f3e509fe3 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia7.JPG differ diff --git a/docs/Presentations/DETECTION/Dia8.JPG b/docs/Presentations/DETECTION/Dia8.JPG new file mode 100644 index 000000000..388e6419d Binary files /dev/null and b/docs/Presentations/DETECTION/Dia8.JPG differ diff --git a/docs/Presentations/DETECTION/Dia9.JPG b/docs/Presentations/DETECTION/Dia9.JPG new file mode 100644 index 000000000..9b65f8733 Binary files /dev/null and b/docs/Presentations/DETECTION/Dia9.JPG differ

    The DETECTION_BASE object that is used to report the detected objects.

    -
    DETECTION_MANAGER.FacScheduler -
    DETECTION_MANAGER:ProcessDetected(Detection)

    Reports the detected items to the Set#SET_GROUP.

    -
    DETECTION_MANAGER:Schedule(DelayTime, ReportInterval) -

    Schedule the FAC reporting.

    Set the reporting time interval.

    -
    DETECTION_MANAGER:_FacScheduler(SchedulerName) -

    Report the detected Unit#UNITs detected within the Detection#DETECTION_BASE object to the Set#SET_GROUPs.

    DETECTION_MANAGER:onafterReport(From, Event, To) + +
    DETECTION_MANAGER:onafterStart(From, Event, To) TASK:CrashUnit(PlayerUnit)

    A PlayerUnit crashed in a Task.

    +
    TASK.Dispatcher +
    TASK:SetBriefing(TaskBriefing)

    Sets a Task briefing.

    +
    TASK:SetDispatcher(Dispatcher) +

    Set dispatcher of a task

    TASK:onenterAssigned(Event, From, To)TASK:onenterAssigned(Event, From, To, PlayerUnit, PlayerName)

    FSM function for a TASK

    TASK_A2G_DISPATCHER:New(The, SetGroup, Detection, Mission)

    TASKA2GDISPATCHER constructor.

    +
    TASK_A2G_DISPATCHER:OnAfterAssign(From, Event, To, Task, TaskUnit, PlayerName) +

    OnAfter Transition Handler for Event Assign.

    AI_Cap -

    Single-Player:Yes / Multi-Player:Yes / AI:Yes / Human:No / Types:Air -- Execute Combat Air Patrol (CAP).

    +

    AI - Execute Combat Air Patrol (CAP).

    Banner Image

    @@ -107,8 +107,7 @@ and automatically engage any airborne enemies that are within a certain range or
    AI_Cas -

    Single-Player:Yes / Multi-Player:Yes / AI:Yes / Human:No / Types:Air -- -Provide Close Air Support to friendly ground troops.

    +

    AI -- Provide Close Air Support to friendly ground troops.

    Banner Image

    @@ -122,8 +121,7 @@ and automatically engage any airborne enemies that are within a certain range or
    AI_Patrol -

    Single-Player:Yes / Multi-Player:Yes / AI:Yes / Human:No / Types:Air -- -Air Patrolling or Staging.

    +

    AI -- Air Patrolling or Staging.

    Banner Image

    @@ -137,7 +135,7 @@ and automatically engage any airborne enemies that are within a certain range or
    Account -

    (SP) (MP) (FSM) Account for (Detect, count and report) DCS events occuring on DCS objects (units).

    +

    Actions - ACTACCOUNT classes account for (detect, count & report) various DCS events occuring on Units.

    Detection -

    This module contains the DETECTION classes.

    +

    Functional - DETECTION_ classes model the detection of enemy units by FACs or RECCEs and group them according various methods.