This commit is contained in:
FlightControl_Master 2017-08-11 14:14:35 +02:00
parent 49bf6010f8
commit 27f77c5df0
21 changed files with 706 additions and 650 deletions

View File

@ -0,0 +1,86 @@
--- The REPORT class
-- @type REPORT
-- @extends Core.Base#BASE
REPORT = {
ClassName = "REPORT",
Title = "",
}
--- Create a new REPORT.
-- @param #REPORT self
-- @param #string Title
-- @return #REPORT
function REPORT:New( Title )
local self = BASE:Inherit( self, BASE:New() ) -- #REPORT
self.Report = {}
self:SetTitle( Title or "" )
self:SetIndent( 3 )
return self
end
--- Has the REPORT Text?
-- @param #REPORT self
-- @return #boolean
function REPORT:HasText() --R2.1
return #self.Report > 0
end
--- Set indent of a REPORT.
-- @param #REPORT self
-- @param #number Indent
-- @return #REPORT
function REPORT:SetIndent( Indent ) --R2.1
self.Indent = Indent
return self
end
--- Add a new line to a REPORT.
-- @param #REPORT self
-- @param #string Text
-- @return #REPORT
function REPORT:Add( Text )
self.Report[#self.Report+1] = Text
return self
end
--- Add a new line to a REPORT.
-- @param #REPORT self
-- @param #string Text
-- @return #REPORT
function REPORT:AddIndent( Text ) --R2.1
self.Report[#self.Report+1] = string.rep(" ", self.Indent ) .. Text:gsub("\n","\n"..string.rep( " ", self.Indent ) )
return self
end
--- Produces the text of the report, taking into account an optional delimeter, which is \n by default.
-- @param #REPORT self
-- @param #string Delimiter (optional) A delimiter text.
-- @return #string The report text.
function REPORT:Text( Delimiter )
Delimiter = Delimiter or "\n"
local ReportText = ( self.Title ~= "" and self.Title .. Delimiter or self.Title ) .. table.concat( self.Report, Delimiter ) or ""
return ReportText
end
--- Sets the title of the report.
-- @param #REPORT self
-- @param #string Title The title of the report.
-- @return #REPORT
function REPORT:SetTitle( Title )
self.Title = Title
return self
end
--- Gets the amount of report items contained in the report.
-- @param #REPORT self
-- @return #number Returns the number of report items contained in the report. 0 is returned if no report items are contained in the report. The title is not counted for.
function REPORT:GetCount()
return #self.Report
end

View File

@ -70,10 +70,14 @@ do -- DESIGNATE
-- The RecceSet is continuously detecting for potential Targets, executing its task as part of the DetectionObject.
-- Once Targets have been detected, the DesignateObject will trigger the **Detect Event**.
--
-- In order to prevent an overflow in the DesignateObject of detected targets, there is a maximum
-- amount of DetectionItems that can be put in **scope** of the DesignateObject.
-- We call this the **MaximumDesignations** term.
--
-- As part of the Detect Event, the DetectionItems list is used by the DesignateObject to provide the Players with:
--
-- * The RecceGroups are reporting to each AttackGroup, sending **Messages** containing the Threat Level and the TargetSet composition.
-- * **Menu options** are created and updated for each AttackGroup, containing the Threat Level and the TargetSet composition.
-- * **Menu options** are created and updated for each AttackGroup, containing the Detection ID and the Coordinates.
--
-- A Player can then select an action from the Designate Menu.
--
@ -109,7 +113,7 @@ do -- DESIGNATE
--
-- ### 2.1 DESIGNATE States
--
-- * **Designating** ( Group ): The process is not started yet.
-- * **Designating** ( Group ): The designation process.
--
-- ### 2.2 DESIGNATE Events
--
@ -119,9 +123,17 @@ do -- DESIGNATE
-- * **@{#DESIGNATE.Smoke}**: Smoke the targets with the specified Index.
-- * **@{#DESIGNATE.Status}**: Report designation status.
--
-- ## 3. Laser codes
-- ## 3. Maximum Designations
--
-- ### 3.1 Set possible laser codes
-- In order to prevent an overflow of designations due to many Detected Targets, there is a
-- Maximum Designations scope that is set in the DesignationObject.
--
-- The method @{#DESIGNATE.SetMaximumDesignations}() will put a limit on the amount of designations put in scope of the DesignationObject.
-- Using the menu system, the player can "forget" a designation, so that gradually a new designation can be put in scope when detected.
--
-- ## 4. Laser codes
--
-- ### 4.1 Set possible laser codes
--
-- An array of laser codes can be provided, that will be used by the DESIGNATE when lasing.
-- The laser code is communicated by the Recce when it is lasing a larget.
@ -139,11 +151,11 @@ do -- DESIGNATE
--
-- The above sets a collection of possible laser codes that can be assigned. **Note the { } notation!**
--
-- ### 3.2 Auto generate laser codes
-- ### 4.2 Auto generate laser codes
--
-- Use the method @{#DESIGNATE.GenerateLaserCodes}() to generate all possible laser codes. Logic implemented and advised by Ciribob!
--
-- ## 4. Autolase to automatically lase detected targets.
-- ## 5. Autolase to automatically lase detected targets.
--
-- DetectionItems can be auto lased once detected by Recces. As such, there is almost no action required from the Players using the Designate Menu.
-- The **auto lase** function can be activated through the Designation Menu.
@ -154,7 +166,7 @@ do -- DESIGNATE
--
-- Activate the auto lasing.
--
-- ## 5. Target prioritization on threat level
-- ## 6. Target prioritization on threat level
--
-- Targets can be detected of different types in one DetectionItem. Depending on the type of the Target, a different threat level applies in an Air to Ground combat context.
-- SAMs are of a higher threat than normal tanks. So, if the Target type was recognized, the Recces will select those targets that form the biggest threat first,
@ -376,12 +388,15 @@ do -- DESIGNATE
self:SetAutoLase( false ) -- set self.Autolase
self:SetThreatLevelPrioritization( false ) -- self.ThreatLevelPrioritization, default is threat level priorization off
self:SetMaximumDesignations( 5 ) -- Sets the maximum designations. The default is 5 designations.
self.LaserCodesUsed = {}
self.Detection:__Start( 2 )
self:__Detect( -15 )
return self
end
@ -405,6 +420,16 @@ do -- DESIGNATE
end
--- Set the maximum amount of designations.
-- @param #DESIGNATE self
-- @param #number MaximumDesignations
-- @return #DESIGNATE
function DESIGNATE:SetMaximumDesignations( MaximumDesignations )
self.MaximumDesignations = MaximumDesignations
return self
end
--- Set an array of possible laser codes.
-- Each new lase will select a code from this table.
-- @param #DESIGNATE self
@ -490,7 +515,7 @@ do -- DESIGNATE
CC:MessageToSetGroup( "Auto Lase " .. AutoLaseOnOff .. ".", 15, self.AttackSet )
end
self:ActivateAutoLase()
self:CoordinateLase()
self:SetDesignateMenu()
return self
@ -525,15 +550,93 @@ do -- DESIGNATE
-- @return #DESIGNATE
function DESIGNATE:onafterDetect()
self:__Detect( -60 )
self:__Detect( -math.random( 60 ) )
self:ActivateAutoLase()
self:DesignationScope()
self:CoordinateLase()
self:SendStatus()
self:SetDesignateMenu()
return self
end
--- Adapt the designation scope according the detected items.
-- @param #DESIGNATE self
-- @return #DESIGNATE
function DESIGNATE:DesignationScope()
local DetectedItems = self.Detection:GetDetectedItems()
local DetectedItemCount = 0
for DesignateIndex, Designating in pairs( self.Designating ) do
local DetectedItem = DetectedItems[DesignateIndex]
if DetectedItem then
-- Check LOS...
local IsDetected = self.Detection:IsDetectedItemDetected( DetectedItem )
self:F({IsDetected = IsDetected, DetectedItem })
if IsDetected == false then
self:F("Removing")
-- This Detection is obsolete, remove from the designate scope
self.Designating[DesignateIndex] = nil
self.AttackSet:ForEachGroup(
function( AttackGroup )
local DetectionText = self.Detection:DetectedItemReportSummary( DesignateIndex, AttackGroup ):Text( ", " )
self.CC:GetPositionable():MessageToGroup( "Targets out of LOS\n" .. DetectionText, 10, AttackGroup, "Designate" )
end
)
else
DetectedItemCount = DetectedItemCount + 1
end
else
-- This Detection is obsolete, remove from the designate scope
self.Designating[DesignateIndex] = nil
end
end
if DetectedItemCount < 5 then
for DesignateIndex, DetectedItem in pairs( DetectedItems ) do
local IsDetected = self.Detection:IsDetectedItemDetected( DetectedItem )
if IsDetected == true then
if self.Designating[DesignateIndex] == nil then
-- ok, we added one item to the designate scope.
self.AttackSet:ForEachGroup(
function( AttackGroup )
local DetectionText = self.Detection:DetectedItemReportSummary( DesignateIndex, AttackGroup ):Text( ", " )
self.CC:GetPositionable():MessageToGroup( "Targets detected at \n" .. DetectionText, 10, AttackGroup, "Designate" )
end
)
self.Designating[DesignateIndex] = ""
break
end
end
end
end
return self
end
--- Coordinates the Auto Lase.
-- @param #DESIGNATE self
-- @return #DESIGNATE
function DESIGNATE:CoordinateLase()
local DetectedItems = self.Detection:GetDetectedItems()
for DesignateIndex, Designating in pairs( self.Designating ) do
local DetectedItem = DetectedItems[DesignateIndex]
if DetectedItem then
if self.AutoLase then
self:LaseOn( DesignateIndex, self.LaseDuration )
end
end
end
return self
end
--- Sends the status to the Attack Groups.
-- @param #DESIGNATE self
-- @param Wrapper.Group#GROUP AttackGroup
@ -550,20 +653,23 @@ do -- DESIGNATE
if self.FlashStatusMenu[AttackGroup] or ( MenuAttackGroup and ( AttackGroup:GetName() == MenuAttackGroup:GetName() ) ) then
local DetectedReport = REPORT:New( "Targets designated:\n" )
local DetectedReport = REPORT:New( "Detected Targets: \n" )
local DetectedItems = self.Detection:GetDetectedItems()
for Index, DetectedItemData in pairs( DetectedItems ) do
local Report = self.Detection:DetectedItemReportSummary( Index, AttackGroup )
DetectedReport:Add(" - " .. Report)
for DesignateIndex, Designating in pairs( self.Designating ) do
local DetectedItem = DetectedItems[DesignateIndex]
if DetectedItem then
local Report = self.Detection:DetectedItemReportSummary( DesignateIndex, AttackGroup ):Text( ", " )
DetectedReport:Add( " - " .. Report )
DetectedReport:Add( string.rep( "-", 140 ) )
end
end
local CC = self.CC:GetPositionable()
CC:MessageToGroup( DetectedReport:Text( "\n" ), Duration, AttackGroup )
local DesignationReport = REPORT:New( "Targets marked:\n" )
local DesignationReport = REPORT:New( "Marking Targets:\n" )
self.RecceSet:ForEachGroup(
function( RecceGroup )
@ -585,40 +691,6 @@ do -- DESIGNATE
return self
end
--- Coordinates the Auto Lase.
-- @param #DESIGNATE self
-- @return #DESIGNATE
function DESIGNATE:ActivateAutoLase()
self.AttackSet:Flush()
self.AttackSet:ForEachGroup(
--- @param Wrapper.Group#GROUP GroupReport
function( AttackGroup )
local DetectedItems = self.Detection:GetDetectedItems()
local DetectedItemCount = 0
for Index, DetectedItemData in pairs( DetectedItems ) do
if self.AutoLase then
if not self.Designating[Index] then
self:LaseOn( Index, self.LaseDuration )
end
end
DetectedItemCount = DetectedItemCount + 1
if DetectedItemCount >= 5 then
break
end
end
end
)
return self
end
--- Sets the Designate Menu.
-- @param #DESIGNATE self
-- @return #DESIGNATE
@ -665,38 +737,43 @@ do -- DESIGNATE
local DetectedItemCount = 0
for Index, DetectedItemData in pairs( DetectedItems ) do
for DesignateIndex, Designating in pairs( self.Designating ) do
local DetectedItem = DetectedItems[DesignateIndex]
if DetectedItem then
local Report = self.Detection:DetectedItemMenu( Index, AttackGroup )
if not self.Designating[Index] then
local DetectedMenu = MENU_GROUP:New( AttackGroup, Report, MenuDesignate ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Lase target 60 secs", DetectedMenu, self.MenuLaseOn, self, Index, 60 ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Lase target 120 secs", DetectedMenu, self.MenuLaseOn, self, Index, 120 ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Smoke red", DetectedMenu, self.MenuSmoke, self, Index, SMOKECOLOR.Red ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Smoke blue", DetectedMenu, self.MenuSmoke, self, Index, SMOKECOLOR.Blue ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Smoke green", DetectedMenu, self.MenuSmoke, self, Index, SMOKECOLOR.Green ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Smoke white", DetectedMenu, self.MenuSmoke, self, Index, SMOKECOLOR.White ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Smoke orange", DetectedMenu, self.MenuSmoke, self, Index, SMOKECOLOR.Orange ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Illuminate", DetectedMenu, self.MenuIlluminate, self, Index ):SetTime( MenuTime ):SetTag( "Designate" )
else
if self.Designating[Index] == "Laser" then
Report = "Lasing " .. Report
elseif self.Designating[Index] == "Smoke" then
Report = "Smoking " .. Report
elseif self.Designating[Index] == "Illuminate" then
Report = "Illuminating " .. Report
end
local DetectedMenu = MENU_GROUP:New( AttackGroup, Report, MenuDesignate ):SetTime( MenuTime ):SetTag( "Designate" )
if self.Designating[Index] == "Laser" then
MENU_GROUP_COMMAND:New( AttackGroup, "Stop lasing", DetectedMenu, self.MenuLaseOff, self, Index ):SetTime( MenuTime ):SetTag( "Designate" )
local Coord = self.Detection:GetDetectedItemCoordinate( DesignateIndex )
local ID = self.Detection:GetDetectedItemID( DesignateIndex )
local MenuText = ID .. ", " .. Coord:ToString( AttackGroup )
if Designating == "" then
MenuText = "(-) " .. MenuText
local DetectedMenu = MENU_GROUP:New( AttackGroup, MenuText, MenuDesignate ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Search other target", DetectedMenu, self.MenuForget, self, DesignateIndex ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Lase target 60 secs", DetectedMenu, self.MenuLaseOn, self, DesignateIndex, 60 ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Lase target 120 secs", DetectedMenu, self.MenuLaseOn, self, DesignateIndex, 120 ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Smoke red", DetectedMenu, self.MenuSmoke, self, DesignateIndex, SMOKECOLOR.Red ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Smoke blue", DetectedMenu, self.MenuSmoke, self, DesignateIndex, SMOKECOLOR.Blue ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Smoke green", DetectedMenu, self.MenuSmoke, self, DesignateIndex, SMOKECOLOR.Green ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Smoke white", DetectedMenu, self.MenuSmoke, self, DesignateIndex, SMOKECOLOR.White ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Smoke orange", DetectedMenu, self.MenuSmoke, self, DesignateIndex, SMOKECOLOR.Orange ):SetTime( MenuTime ):SetTag( "Designate" )
MENU_GROUP_COMMAND:New( AttackGroup, "Illuminate", DetectedMenu, self.MenuIlluminate, self, DesignateIndex ):SetTime( MenuTime ):SetTag( "Designate" )
else
if Designating == "Laser" then
MenuText = "(L) " .. MenuText
elseif Designating == "Smoke" then
MenuText = "(S) " .. MenuText
elseif Designating == "Illuminate" then
MenuText = "(I) " .. MenuText
end
local DetectedMenu = MENU_GROUP:New( AttackGroup, MenuText, MenuDesignate ):SetTime( MenuTime ):SetTag( "Designate" )
if Designating == "Laser" then
MENU_GROUP_COMMAND:New( AttackGroup, "Stop lasing", DetectedMenu, self.MenuLaseOff, self, DesignateIndex ):SetTime( MenuTime ):SetTag( "Designate" )
else
end
end
end
DetectedItemCount = DetectedItemCount + 1
if DetectedItemCount >= 5 then
break
end
end
MenuDesignate:Remove( MenuTime, "Designate" )
end
@ -725,6 +802,16 @@ do -- DESIGNATE
end
---
-- @param #DESIGNATE self
function DESIGNATE:MenuForget( Index )
self:E("Forget")
self.Designating[Index] = nil
self:SetDesignateMenu()
end
---
-- @param #DESIGNATE self
function DESIGNATE:MenuAutoLase( AutoLase )
@ -741,7 +828,7 @@ do -- DESIGNATE
self:E("Designate through Smoke")
self.Designating[Index] = "Smoke"
self:__Smoke( 1, Index, Color )
self:Smoke( Index, Color )
end
---
@ -762,6 +849,7 @@ do -- DESIGNATE
self:E("Designate through Lase")
self:__LaseOn( 1, Index, Duration )
self:SetDesignateMenu()
end
---
@ -770,8 +858,9 @@ do -- DESIGNATE
self:E("Lasing off")
self.Designating[Index] = nil
self.Designating[Index] = ""
self:__LaseOff( 1, Index )
self:SetDesignateMenu()
end
---
@ -858,7 +947,7 @@ do -- DESIGNATE
end
)
self:__Lasing( 15, Index, Duration )
self:__Lasing( 30, Index, Duration )
self:SetDesignateMenu()
@ -910,10 +999,10 @@ do -- DESIGNATE
local RecceUnit = RecceGroup:GetUnit( 1 )
if RecceUnit then
RecceUnit:MessageToSetGroup( "Smoking " .. SmokeUnit:GetTypeName() .. ".", 5, self.AttackSet )
SCHEDULER:New( self,
SCHEDULER:New( nil,
function()
if SmokeUnit:IsAlive() then
SmokeUnit:Smoke( Color, 150 )
SmokeUnit:Smoke( Color, 50 )
end
self:Done( Index )
end, {}, math.random( 5, 20 )

View File

@ -692,6 +692,8 @@ do -- DETECTION_BASE
self.DetectedObjects[DetectedObjectName].Distance = Distance
self.DetectedObjects[DetectedObjectName].DetectionTimeStamp = DetectionTimeStamp
self:F( { DetectedObject = self.DetectedObjects[DetectedObjectName] } )
local DetectedUnit = UNIT:FindByName( DetectedObjectName )
DetectedUnits[DetectedObjectName] = DetectedUnit
@ -1493,6 +1495,7 @@ do -- DETECTION_BASE
for UnitName, UnitData in pairs( DetectedItem.Set:GetSet() ) do
local DetectedObject = self.DetectedObjects[UnitName]
self:F({UnitName = UnitName, IsDetected = DetectedObject.IsDetected})
if DetectedObject.IsDetected then
IsDetected = true
break
@ -1514,37 +1517,6 @@ do -- DETECTION_BASE
return DetectedItem.IsDetected
end
do -- Coordinates
--- Get the COORDINATE of a detection item using a given numeric index.
-- @param #DETECTION_BASE self
-- @param #number Index
-- @return Core.Point#COORDINATE
function DETECTION_BASE:GetDetectedItemCoordinate( Index )
-- If the Zone is set, return the coordinate of the Zone.
local DetectedItemSet = self:GetDetectedSet( Index )
local FirstUnit = DetectedItemSet:GetFirst()
local DetectedZone = self:GetDetectedItemZone( Index )
if DetectedZone then
local Coordinate = DetectedZone:GetPointVec2()
Coordinate:SetHeading(FirstUnit:GetHeading())
Coordinate:SetAlt( FirstUnit:GetAltitude() )
return Coordinate
end
-- If no Zone is set, return the coordinate of the first unit in the Set
if FirstUnit then
local Coordinate = FirstUnit:GetPointVec3()
FirstUnit:SetHeading(FirstUnit:GetHeading())
return Coordinate
end
return nil
end
end
do -- Zones
@ -1566,6 +1538,32 @@ do -- DETECTION_BASE
end
--- Get the detected item coordinate.
-- @param #DETECTION_BASE self
-- @param Index
-- @return Core.Point#COORDINATE
function DETECTION_BASE:GetDetectedItemCoordinate( Index )
self:F( { Index = Index } )
return nil
end
--- Has the detected item LOS (Line Of Sight) with one of the Recce?
-- @param #DETECTION_BASE self
-- @param Index
-- @return #boolean true is LOS, false if no LOS.
function DETECTION_BASE:HasDetectedItemLOS( Index )
self:F( { Index = Index } )
local DetectedItem = self:GetDetectedItem( Index )
if DetectedItem then
return DetectedItem.LOS
end
return nil
end
--- Menu of a detected item using a given numeric index.
-- @param #DETECTION_BASE self
-- @param Index
@ -1581,7 +1579,7 @@ do -- DETECTION_BASE
-- @param Index
-- @param Wrapper.Group#GROUP AttackGroup The group to generate the report for.
-- @param Core.Settings#SETTINGS Settings Message formatting settings to use.
-- @return #string
-- @return Core.Report#REPORT
function DETECTION_BASE:DetectedItemReportSummary( Index, AttackGroup, Settings )
self:F( Index )
return nil
@ -1657,6 +1655,27 @@ do -- DETECTION_UNITS
return self
end
--- Get the detected item coordinate.
-- @param #DETECTION_UNITS self
-- @param Index
-- @return Core.Point#COORDINATE
function DETECTION_UNITS:GetDetectedItemCoordinate( Index )
self:F( { Index = Index } )
local DetectedItem = self:GetDetectedItem( Index )
local DetectedSet = self:GetDetectedSet( Index )
if DetectedSet then
local DetectedItemUnit = DetectedSet:GetFirst() -- Wrapper.Unit#UNIT
if DetectedItemUnit and DetectedItemUnit:IsAlive() then
local DetectedItemCoordinate = DetectedItemUnit:GetCoordinate()
DetectedItemCoordinate:SetHeading( DetectedItemUnit:GetHeading() )
return DetectedItemCoordinate
end
end
end
--- Make text documenting the changes of the detected zone.
-- @param #DETECTION_UNITS self
-- @param #DETECTION_UNITS.DetectedItem DetectedItem
@ -1827,7 +1846,7 @@ do -- DETECTION_UNITS
-- @param Index
-- @param Wrapper.Group#GROUP AttackGroup The group to generate the report for.
-- @param Core.Settings#SETTINGS Settings Message formatting settings to use.
-- @return #string
-- @return Core.Report#REPORT The report of the detection items.
function DETECTION_UNITS:DetectedItemReportSummary( Index, AttackGroup, Settings )
self:F( { Index, self.DetectedItems } )
@ -1874,20 +1893,14 @@ do -- DETECTION_UNITS
local ThreatLevelA2G = DetectedItemUnit:GetThreatLevel( DetectedItem )
ReportSummary = string.format(
"%s - %s\n - Threat: [%s]\n - Type: %s%s",
DetectedItemID,
DetectedItemCoordText,
string.rep( "", ThreatLevelA2G ),
UnitCategoryText,
UnitDistanceText
)
local Report = REPORT:New()
Report:Add(DetectedItemID .. ", " .. DetectedItemCoordText)
Report:Add( string.format( "Threat: [%s]", string.rep( "", ThreatLevelA2G ) ) )
Report:Add( string.format("Type: %s%s", UnitCategoryText, UnitDistanceText ) )
return Report
end
self:T( ReportSummary )
return ReportSummary
end
return nil
end
@ -1946,6 +1959,25 @@ do -- DETECTION_TYPES
return self
end
--- Get the detected item coordinate.
-- @param #DETECTION_TYPES self
-- @param DetectedTypeName
-- @return #Core.Point#COORDINATE
function DETECTION_TYPES:GetDetectedItemCoordinate( DetectedTypeName )
self:F( { DetectedTypeName = DetectedTypeName } )
local DetectedItem = self:GetDetectedItem( DetectedTypeName )
local DetectedSet = self:GetDetectedSet( DetectedTypeName )
if DetectedItem then
local DetectedItemUnit = DetectedSet:GetFirst()
local DetectedItemCoordinate = DetectedItemUnit:GetCoordinate()
DetectedItemCoordinate:SetHeading( DetectedItemUnit:GetHeading() )
return DetectedItemCoordinate
end
end
--- Make text documenting the changes of the detected zone.
-- @param #DETECTION_TYPES self
@ -2055,6 +2087,7 @@ do -- DETECTION_TYPES
--self:NearestFAC( DetectedItem )
end
end
--- Menu of a DetectedItem using a given numeric index.
@ -2095,7 +2128,7 @@ do -- DETECTION_TYPES
-- @param Index
-- @param Wrapper.Group#GROUP AttackGroup The group to generate the report for.
-- @param Core.Settings#SETTINGS Settings Message formatting settings to use.
-- @return #string
-- @return Core.Report#REPORT The report of the detection items.
function DETECTION_TYPES:DetectedItemReportSummary( DetectedTypeName, AttackGroup, Settings )
self:F( DetectedTypeName )
@ -2115,17 +2148,11 @@ do -- DETECTION_TYPES
local DetectedItemCoordinate = DetectedItemUnit:GetCoordinate()
local DetectedItemCoordText = DetectedItemCoordinate:ToString( AttackGroup, Settings )
local ReportSummary = string.format(
"%s - %s\n - Threat: [%s]\n - Type: %2d of %s",
DetectedItemID,
DetectedItemCoordText,
string.rep( "", ThreatLevelA2G ),
DetectedItemsCount,
DetectedItemType
)
self:T( ReportSummary )
return ReportSummary
local Report = REPORT:New()
Report:Add(DetectedItemID .. ", " .. DetectedItemCoordText)
Report:Add( string.format( "Threat: [%s]", string.rep( "", ThreatLevelA2G ) ) )
Report:Add( string.format("Type: %2d of %s", DetectedItemsCount, DetectedItemType ) )
return Report
end
end
@ -2217,6 +2244,33 @@ do -- DETECTION_AREAS
return self
end
--- Get the detected item coordinate.
-- In this case, the coordinate is the center of the zone of the area, not the center unit!
-- So if units move, the retrieved coordinate can be different from the units positions.
-- @param #DETECTION_AREAS self
-- @param Index
-- @return Core.Point#COORDINATE The coordinate.
function DETECTION_AREAS:GetDetectedItemCoordinate( Index )
self:F( { Index = Index } )
local DetectedItem = self:GetDetectedItem( Index )
local DetectedItemSet = self:GetDetectedSet( Index )
local FirstUnit = DetectedItemSet:GetFirst()
if DetectedItem then
local DetectedZone = self:GetDetectedItemZone( Index )
-- TODO: Rework to COORDINATE. Problem with SetAlt.
local DetectedItemCoordinate = DetectedZone:GetPointVec2()
-- These need to be done to understand the heading and altitude of the first unit in the zone.
DetectedItemCoordinate:SetHeading( FirstUnit:GetHeading() )
DetectedItemCoordinate:SetAlt( FirstUnit:GetAltitude() )
return DetectedItemCoordinate
end
return nil
end
--- Menu of a detected item using a given numeric index.
-- @param #DETECTION_AREAS self
-- @param Index
@ -2252,7 +2306,7 @@ do -- DETECTION_AREAS
-- @param Index
-- @param Wrapper.Group#GROUP AttackGroup The group to get the settings for.
-- @param Core.Settings#SETTINGS Settings (Optional) Message formatting settings to use.
-- @return #string
-- @return Core.Report#REPORT The report of the detection items.
function DETECTION_AREAS:DetectedItemReportSummary( Index, AttackGroup, Settings )
self:F( Index )
@ -2271,16 +2325,12 @@ do -- DETECTION_AREAS
local DetectedItemsCount = DetectedSet:Count()
local DetectedItemsTypes = DetectedSet:GetTypeNames()
local ReportSummary = string.format(
"%s - %s\n - Threat: [%s]\n - Type: %2d of %s",
DetectedItemID,
DetectedItemCoordText,
string.rep( "", ThreatLevelA2G ),
DetectedItemsCount,
DetectedItemsTypes
)
local Report = REPORT:New()
Report:Add(DetectedItemID .. ", " .. DetectedItemCoordText)
Report:Add( string.format( "Threat: [%s]", string.rep( "", ThreatLevelA2G ) ) )
Report:Add( string.format("Type: %2d of %s", DetectedItemsCount, DetectedItemsTypes ) )
return ReportSummary
return Report
end
return nil

View File

@ -1171,7 +1171,7 @@ function ESCORT:_ReportTargetsScheduler()
if ClientEscortGroupName == EscortGroupName then
DetectedMsgs[#DetectedMsgs+1] = DetectedItemReportSummary
DetectedMsgs[#DetectedMsgs+1] = DetectedItemReportSummary:Text("\n")
MENU_CLIENT_COMMAND:New( self.EscortClient,
DetectedItemReportSummary,

View File

@ -13,92 +13,6 @@
--- The REPORT class
-- @type REPORT
-- @extends Core.Base#BASE
REPORT = {
ClassName = "REPORT",
Title = "",
}
--- Create a new REPORT.
-- @param #REPORT self
-- @param #string Title
-- @return #REPORT
function REPORT:New( Title )
local self = BASE:Inherit( self, BASE:New() ) -- #REPORT
self.Report = {}
self:SetTitle( Title or "" )
self:SetIndent( 3 )
return self
end
--- Has the REPORT Text?
-- @param #REPORT self
-- @return #boolean
function REPORT:HasText() --R2.1
return #self.Report > 0
end
--- Set indent of a REPORT.
-- @param #REPORT self
-- @param #number Indent
-- @return #REPORT
function REPORT:SetIndent( Indent ) --R2.1
self.Indent = Indent
return self
end
--- Add a new line to a REPORT.
-- @param #REPORT self
-- @param #string Text
-- @return #REPORT
function REPORT:Add( Text )
self.Report[#self.Report+1] = Text
return self
end
--- Add a new line to a REPORT.
-- @param #REPORT self
-- @param #string Text
-- @return #REPORT
function REPORT:AddIndent( Text ) --R2.1
self.Report[#self.Report+1] = string.rep(" ", self.Indent ) .. Text:gsub("\n","\n"..string.rep( " ", self.Indent ) )
return self
end
--- Produces the text of the report, taking into account an optional delimeter, which is \n by default.
-- @param #REPORT self
-- @param #string Delimiter (optional) A delimiter text.
-- @return #string The report text.
function REPORT:Text( Delimiter )
Delimiter = Delimiter or "\n"
local ReportText = ( self.Title ~= "" and self.Title .. Delimiter or self.Title ) .. table.concat( self.Report, Delimiter ) or ""
return ReportText
end
--- Sets the title of the report.
-- @param #REPORT self
-- @param #string Title The title of the report.
-- @return #REPORT
function REPORT:SetTitle( Title )
self.Title = Title
return self
end
--- Gets the amount of report items contained in the report.
-- @param #REPORT self
-- @return #number Returns the number of report items contained in the report. 0 is returned if no report items are contained in the report. The title is not counted for.
function REPORT:GetCount()
return #self.Report
end
--- The COMMANDCENTER class

View File

@ -2,6 +2,7 @@ Utilities/Routines.lua
Utilities/Utils.lua
Core/Base.lua
Core/Report.lua
Core/Scheduler.lua
Core/ScheduleDispatcher.lua
Core/Event.lua

View File

@ -1,5 +1,5 @@
env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' )
env.info( 'Moose Generation Timestamp: 20170725_0806' )
env.info( 'Moose Generation Timestamp: 20170811_0800' )
local base = _G
@ -24,6 +24,7 @@ __Moose.Includes = {}
__Moose.Include( 'Utilities/Routines.lua' )
__Moose.Include( 'Utilities/Utils.lua' )
__Moose.Include( 'Core/Base.lua' )
__Moose.Include( 'Core/Report.lua' )
__Moose.Include( 'Core/Scheduler.lua' )
__Moose.Include( 'Core/ScheduleDispatcher.lua' )
__Moose.Include( 'Core/Event.lua' )

View File

@ -661,7 +661,6 @@
<dl class="function">
<dt>
<em>#number</em>
<a id="#(AI_A2A).IdleCount" >
<strong>AI_A2A.IdleCount</strong>
</a>

View File

@ -3542,6 +3542,7 @@ The range till cargo will board.</p>
<dl class="function">
<dt>
<em>#number</em>
<a id="#(CARGO_UNIT).RunCount" >
<strong>CARGO_UNIT.RunCount</strong>
</a>

View File

@ -127,12 +127,6 @@
<h1>COMMANDCENTER class, extends <a href="Base.html##(BASE)">Base#BASE</a></h1>
<p> The COMMANDCENTER class governs multiple missions, the tasking and the reporting.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="#REPORT">REPORT</a></td>
<td class="summary">
</td>
</tr>
</table>
@ -270,82 +264,6 @@ and will be replaced by a navigation using Reference Zones.</p>
<td class="name" nowrap="nowrap"><a href="##(COMMANDCENTER).SetReferenceZones">COMMANDCENTER:SetReferenceZones(ReferenceZonePrefix)</a></td>
<td class="summary">
<p>Set special Reference Zones known by the Command Center to guide airborne pilots during WWII.</p>
</td>
</tr>
</table>
<h2><a id="#(REPORT)">Type <code>REPORT</code></a></h2>
<table class="function_list">
<tr>
<td class="name" nowrap="nowrap"><a href="##(REPORT).Add">REPORT:Add(Text)</a></td>
<td class="summary">
<p>Add a new line to a REPORT.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(REPORT).AddIndent">REPORT:AddIndent(Text)</a></td>
<td class="summary">
<p>Add a new line to a REPORT.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(REPORT).ClassName">REPORT.ClassName</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(REPORT).GetCount">REPORT:GetCount()</a></td>
<td class="summary">
<p>Gets the amount of report items contained in the report.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(REPORT).HasText">REPORT:HasText()</a></td>
<td class="summary">
<p>Has the REPORT Text?</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(REPORT).Indent">REPORT.Indent</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(REPORT).New">REPORT:New(Title)</a></td>
<td class="summary">
<p>Create a new REPORT.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(REPORT).Report">REPORT.Report</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(REPORT).SetIndent">REPORT:SetIndent(Indent)</a></td>
<td class="summary">
<p>Set indent of a REPORT.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(REPORT).SetTitle">REPORT:SetTitle(Title)</a></td>
<td class="summary">
<p>Sets the title of the report.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(REPORT).Text">REPORT:Text(Delimiter)</a></td>
<td class="summary">
<p>Produces the text of the report, taking into account an optional delimeter, which is \n by default.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(REPORT).Title">REPORT.Title</a></td>
<td class="summary">
</td>
</tr>
</table>
@ -414,20 +332,6 @@ This is done by using the method <a href="##(COMMANDCENTER).SetReferenceZones">C
For the moment, only one Reference Zone class can be specified, but in the future, more classes will become possible.</p>
</dd>
</dl>
<dl class="function">
<dt>
<em><a href="##(REPORT)">#REPORT</a></em>
<a id="REPORT" >
<strong>REPORT</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<h2><a id="#(CommandCenter)" >Type <code>CommandCenter</code></a></h2>
@ -937,262 +841,6 @@ The name before the #-mark indicating the class of the Reference Zones.</p>
<p><em><a href="##(COMMANDCENTER)">#COMMANDCENTER</a>:</em></p>
</dd>
</dl>
<h2><a id="#(REPORT)" >Type <code>REPORT</code></a></h2>
<p>The REPORT class</p>
<h3>Field(s)</h3>
<dl class="function">
<dt>
<a id="#(REPORT).Add" >
<strong>REPORT:Add(Text)</strong>
</a>
</dt>
<dd>
<p>Add a new line to a REPORT.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#string Text </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(REPORT)">#REPORT</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(REPORT).AddIndent" >
<strong>REPORT:AddIndent(Text)</strong>
</a>
</dt>
<dd>
<p>Add a new line to a REPORT.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#string Text </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(REPORT)">#REPORT</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<em>#string</em>
<a id="#(REPORT).ClassName" >
<strong>REPORT.ClassName</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(REPORT).GetCount" >
<strong>REPORT:GetCount()</strong>
</a>
</dt>
<dd>
<p>Gets the amount of report items contained in the report.</p>
<h3>Return value</h3>
<p><em>#number:</em>
Returns the number of report items contained in the report. 0 is returned if no report items are contained in the report. The title is not counted for.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(REPORT).HasText" >
<strong>REPORT:HasText()</strong>
</a>
</dt>
<dd>
<p>Has the REPORT Text?</p>
<h3>Return value</h3>
<p><em>#boolean:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(REPORT).Indent" >
<strong>REPORT.Indent</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(REPORT).New" >
<strong>REPORT:New(Title)</strong>
</a>
</dt>
<dd>
<p>Create a new REPORT.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#string Title </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(REPORT)">#REPORT</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(REPORT).Report" >
<strong>REPORT.Report</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(REPORT).SetIndent" >
<strong>REPORT:SetIndent(Indent)</strong>
</a>
</dt>
<dd>
<p>Set indent of a REPORT.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#number Indent </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(REPORT)">#REPORT</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(REPORT).SetTitle" >
<strong>REPORT:SetTitle(Title)</strong>
</a>
</dt>
<dd>
<p>Sets the title of the report.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#string Title </em></code>:
The title of the report.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(REPORT)">#REPORT</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(REPORT).Text" >
<strong>REPORT:Text(Delimiter)</strong>
</a>
</dt>
<dd>
<p>Produces the text of the report, taking into account an optional delimeter, which is \n by default.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#string Delimiter </em></code>:
(optional) A delimiter text.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em>#string:</em>
The report text.</p>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(REPORT).Title" >
<strong>REPORT.Title</strong>
</a>
</dt>
<dd>
</dd>
</dl>

View File

@ -836,7 +836,7 @@ The method <a href="##(CONTROLLABLE).SetTaskAtWaypoint">CONTROLLABLE.SetTaskAtWa
<li><a href="##(CONTROLLABLE).RouteAirTo">CONTROLLABLE.RouteAirTo</a>(): Make the AIR Controllable to fly towards a specific coordinate. </li>
</ul>
<h2>CONTROLLABLE Option methods</h2>
<h2>Option methods</h2>
<p>Controllable <strong>Option methods</strong> change the behaviour of the Controllable while being alive.</p>

View File

@ -108,6 +108,7 @@
<p><strong>Functional</strong> -- Management of target <strong>Designation</strong>.</p>
<p>Lase, smoke and illuminate targets.</p>
<p>--<img src="..\Presentations\DESIGNATE\Dia1.JPG" alt="Banner Image"/></p>
@ -163,12 +164,6 @@ each detected set of potential targets can be lased or smoked...</p>
<h2><a id="#(DESIGNATE)">Type <code>DESIGNATE</code></a></h2>
<table class="function_list">
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).ActivateAutoLase">DESIGNATE:ActivateAutoLase()</a></td>
<td class="summary">
<p>Coordinates the Auto Lase.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).AttackSet">DESIGNATE.AttackSet</a></td>
<td class="summary">
@ -184,12 +179,24 @@ each detected set of potential targets can be lased or smoked...</p>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).CC">DESIGNATE.CC</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).CoordinateLase">DESIGNATE:CoordinateLase()</a></td>
<td class="summary">
<p>Coordinates the Auto Lase.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).Designating">DESIGNATE.Designating</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).DesignationScope">DESIGNATE:DesignationScope()</a></td>
<td class="summary">
<p>Adapt the designation scope according the detected items.</p>
</td>
</tr>
<tr>
@ -250,6 +257,12 @@ each detected set of potential targets can be lased or smoked...</p>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).LaserCodesUsed">DESIGNATE.LaserCodesUsed</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).MaximumDesignations">DESIGNATE.MaximumDesignations</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -268,6 +281,12 @@ each detected set of potential targets can be lased or smoked...</p>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).MenuFlashStatus">DESIGNATE:MenuFlashStatus(AttackGroup, Flash)</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).MenuForget">DESIGNATE:MenuForget(Index)</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -424,6 +443,12 @@ each detected set of potential targets can be lased or smoked...</p>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).SetLaserCodes">DESIGNATE:SetLaserCodes(<, LaserCodes)</a></td>
<td class="summary">
<p>Set an array of possible laser codes.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DESIGNATE).SetMaximumDesignations">DESIGNATE:SetMaximumDesignations(MaximumDesignations)</a></td>
<td class="summary">
<p>Set the maximum amount of designations.</p>
</td>
</tr>
<tr>
@ -585,11 +610,15 @@ each detected set of potential targets can be lased or smoked...</p>
<p>The RecceSet is continuously detecting for potential Targets, executing its task as part of the DetectionObject.
Once Targets have been detected, the DesignateObject will trigger the <strong>Detect Event</strong>.</p>
<p>In order to prevent an overflow in the DesignateObject of detected targets, there is a maximum
amount of DetectionItems that can be put in <strong>scope</strong> of the DesignateObject.
We call this the <strong>MaximumDesignations</strong> term.</p>
<p>As part of the Detect Event, the DetectionItems list is used by the DesignateObject to provide the Players with:</p>
<ul>
<li>The RecceGroups are reporting to each AttackGroup, sending <strong>Messages</strong> containing the Threat Level and the TargetSet composition.</li>
<li><strong>Menu options</strong> are created and updated for each AttackGroup, containing the Threat Level and the TargetSet composition.</li>
<li><strong>Menu options</strong> are created and updated for each AttackGroup, containing the Detection ID and the Coordinates.</li>
</ul>
<p>A Player can then select an action from the Designate Menu. </p>
@ -633,7 +662,7 @@ Once Targets have been detected, the DesignateObject will trigger the <strong>De
<h3>2.1 DESIGNATE States</h3>
<ul>
<li><strong>Designating</strong> ( Group ): The process is not started yet.</li>
<li><strong>Designating</strong> ( Group ): The designation process.</li>
</ul>
<h3>2.2 DESIGNATE Events</h3>
@ -646,9 +675,17 @@ Once Targets have been detected, the DesignateObject will trigger the <strong>De
<li>**<a href="##(DESIGNATE).Status">DESIGNATE.Status</a>**: Report designation status.</li>
</ul>
<h2>3. Laser codes</h2>
<h2>3. Maximum Designations</h2>
<h3>3.1 Set possible laser codes</h3>
<p>In order to prevent an overflow of designations due to many Detected Targets, there is a
Maximum Designations scope that is set in the DesignationObject.</p>
<p>The method <a href="##(DESIGNATE).SetMaximumDesignations">DESIGNATE.SetMaximumDesignations</a>() will put a limit on the amount of designations put in scope of the DesignationObject.
Using the menu system, the player can "forget" a designation, so that gradually a new designation can be put in scope when detected.</p>
<h2>4. Laser codes</h2>
<h3>4.1 Set possible laser codes</h3>
<p>An array of laser codes can be provided, that will be used by the DESIGNATE when lasing.
The laser code is communicated by the Recce when it is lasing a larget.
@ -668,11 +705,11 @@ One laser code can be given or an sequence of laser codes through an table...</p
<p>The above sets a collection of possible laser codes that can be assigned. <strong>Note the { } notation!</strong></p>
<h3>3.2 Auto generate laser codes</h3>
<h3>4.2 Auto generate laser codes</h3>
<p>Use the method <a href="##(DESIGNATE).GenerateLaserCodes">DESIGNATE.GenerateLaserCodes</a>() to generate all possible laser codes. Logic implemented and advised by Ciribob!</p>
<h2>4. Autolase to automatically lase detected targets.</h2>
<h2>5. Autolase to automatically lase detected targets.</h2>
<p>DetectionItems can be auto lased once detected by Recces. As such, there is almost no action required from the Players using the Designate Menu.
The <strong>auto lase</strong> function can be activated through the Designation Menu.
@ -684,7 +721,7 @@ Note that autolase will automatically activate lasing for ALL DetectedItems. Ind
<p>Activate the auto lasing.</p>
<h2>5. Target prioritization on threat level</h2>
<h2>6. Target prioritization on threat level</h2>
<p>Targets can be detected of different types in one DetectionItem. Depending on the type of the Target, a different threat level applies in an Air to Ground combat context.
SAMs are of a higher threat than normal tanks. So, if the Target type was recognized, the Recces will select those targets that form the biggest threat first,
@ -729,24 +766,6 @@ Use the method <a href="##(DESIGNATE).SetMission">DESIGNATE.SetMission</a>() to
<dl class="function">
<dt>
<a id="#(DESIGNATE).ActivateAutoLase" >
<strong>DESIGNATE:ActivateAutoLase()</strong>
</a>
</dt>
<dd>
<p>Coordinates the Auto Lase.</p>
<h3>Return value</h3>
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DESIGNATE).AttackSet" >
<strong>DESIGNATE.AttackSet</strong>
@ -784,6 +803,24 @@ Use the method <a href="##(DESIGNATE).SetMission">DESIGNATE.SetMission</a>() to
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DESIGNATE).CoordinateLase" >
<strong>DESIGNATE:CoordinateLase()</strong>
</a>
</dt>
<dd>
<p>Coordinates the Auto Lase.</p>
<h3>Return value</h3>
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
</dd>
</dl>
<dl class="function">
@ -798,6 +835,24 @@ Use the method <a href="##(DESIGNATE).SetMission">DESIGNATE.SetMission</a>() to
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DESIGNATE).DesignationScope" >
<strong>DESIGNATE:DesignationScope()</strong>
</a>
</dt>
<dd>
<p>Adapt the designation scope according the detected items.</p>
<h3>Return value</h3>
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
</dd>
</dl>
<dl class="function">
@ -923,7 +978,6 @@ function below will use the range 1-7 just in case</p>
<dl class="function">
<dt>
<em></em>
<a id="#(DESIGNATE).LaserCodes" >
<strong>DESIGNATE.LaserCodes</strong>
</a>
@ -946,6 +1000,20 @@ function below will use the range 1-7 just in case</p>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DESIGNATE).MaximumDesignations" >
<strong>DESIGNATE.MaximumDesignations</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
@ -1011,6 +1079,27 @@ function below will use the range 1-7 just in case</p>
<dl class="function">
<dt>
<a id="#(DESIGNATE).MenuForget" >
<strong>DESIGNATE:MenuForget(Index)</strong>
</a>
</dt>
<dd>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> Index </em></code>: </p>
</li>
</ul>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DESIGNATE).MenuIlluminate" >
<strong>DESIGNATE:MenuIlluminate(Index)</strong>
</a>
@ -1767,6 +1856,32 @@ number> LaserCodes</p>
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DESIGNATE).SetMaximumDesignations" >
<strong>DESIGNATE:SetMaximumDesignations(MaximumDesignations)</strong>
</a>
</dt>
<dd>
<p>Set the maximum amount of designations.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#number MaximumDesignations </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(DESIGNATE)">#DESIGNATE</a>:</em></p>
</dd>
</dl>
<dl class="function">

View File

@ -262,6 +262,12 @@ DETECTION uses the in-built detection capabilities of DCS World, but adds new fu
<td class="name" nowrap="nowrap"><a href="##(DETECTION_AREAS).GetChangeText">DETECTION_AREAS:GetChangeText(DetectedItem)</a></td>
<td class="summary">
<p>Make text documenting the changes of the detected zone.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_AREAS).GetDetectedItemCoordinate">DETECTION_AREAS:GetDetectedItemCoordinate(Index)</a></td>
<td class="summary">
<p>Get the detected item coordinate.</p>
</td>
</tr>
<tr>
@ -570,7 +576,7 @@ The different values of Unit.Category can be:</p>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE).GetDetectedItemCoordinate">DETECTION_BASE:GetDetectedItemCoordinate(Index)</a></td>
<td class="summary">
<p>Get the COORDINATE of a detection item using a given numeric index.</p>
<p>Get the detected item coordinate.</p>
</td>
</tr>
<tr>
@ -637,6 +643,12 @@ The different values of Unit.Category can be:</p>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE).GetPlayersNearBy">DETECTION_BASE:GetPlayersNearBy(DetectedItem)</a></td>
<td class="summary">
<p>Returns friendly units nearby the FAC units ...</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_BASE).HasDetectedItemLOS">DETECTION_BASE:HasDetectedItemLOS(Index)</a></td>
<td class="summary">
<p>Has the detected item LOS (Line Of Sight) with one of the Recce?</p>
</td>
</tr>
<tr>
@ -1135,6 +1147,12 @@ The different values of Unit.Category can be:</p>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_TYPES).GetChangeText">DETECTION_TYPES:GetChangeText(DetectedItem)</a></td>
<td class="summary">
<p>Make text documenting the changes of the detected zone.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_TYPES).GetDetectedItemCoordinate">DETECTION_TYPES:GetDetectedItemCoordinate(DetectedTypeName)</a></td>
<td class="summary">
<p>Get the detected item coordinate.</p>
</td>
</tr>
<tr>
@ -1217,6 +1235,12 @@ The different values of Unit.Category can be:</p>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_UNITS).GetChangeText">DETECTION_UNITS:GetChangeText(DetectedItem)</a></td>
<td class="summary">
<p>Make text documenting the changes of the detected zone.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DETECTION_UNITS).GetDetectedItemCoordinate">DETECTION_UNITS:GetDetectedItemCoordinate(Index)</a></td>
<td class="summary">
<p>Get the detected item coordinate.</p>
</td>
</tr>
<tr>
@ -1547,6 +1571,8 @@ a DetectedItem. The default range is 6000 meters. For air detections, it is advi
</dl>
<h2><a id="#(Detection)" >Type <code>Detection</code></a></h2>
<h2><a id="#(Core.Point)" >Type <code>Core.Point</code></a></h2>
<h2><a id="#(DETECTION_AREAS)" >Type <code>DETECTION_AREAS</code></a></h2>
<p> # 4) DETECTION_AREAS class, extends <a href="Detection.html##(DETECTION_BASE)">Detection#DETECTION_BASE</a></p>
@ -1760,8 +1786,8 @@ The group to get the settings for.</p>
</ul>
<h3>Return value</h3>
<p><em>#string:</em></p>
<p><em><a href="Core.Report.html##(REPORT)">Core.Report#REPORT</a>:</em>
The report of the detection items.</p>
</dd>
</dl>
@ -1885,6 +1911,36 @@ The Changes text</p>
<dl class="function">
<dt>
<a id="#(DETECTION_AREAS).GetDetectedItemCoordinate" >
<strong>DETECTION_AREAS:GetDetectedItemCoordinate(Index)</strong>
</a>
</dt>
<dd>
<p>Get the detected item coordinate.</p>
<p>In this case, the coordinate is the center of the zone of the area, not the center unit!
So if units move, the retrieved coordinate can be different from the units positions.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> Index </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="Core.Point.html##(COORDINATE)">Core.Point#COORDINATE</a>:</em>
The coordinate.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DETECTION_AREAS).GetTreatLevelA2G" >
<strong>DETECTION_AREAS:GetTreatLevelA2G(DetectedItem)</strong>
</a>
@ -2551,7 +2607,7 @@ Message formatting settings to use.</p>
</ul>
<h3>Return value</h3>
<p><em>#string:</em></p>
<p><em><a href="Core.Report.html##(REPORT)">Core.Report#REPORT</a>:</em></p>
</dd>
@ -2881,13 +2937,13 @@ DetectedItemID</p>
</dt>
<dd>
<p>Get the COORDINATE of a detection item using a given numeric index.</p>
<p>Get the detected item coordinate.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#number Index </em></code>: </p>
<p><code><em> Index </em></code>: </p>
</li>
</ul>
@ -3163,6 +3219,32 @@ The distance. </p>
<dl class="function">
<dt>
<a id="#(DETECTION_BASE).HasDetectedItemLOS" >
<strong>DETECTION_BASE:HasDetectedItemLOS(Index)</strong>
</a>
</dt>
<dd>
<p>Has the detected item LOS (Line Of Sight) with one of the Recce?</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> Index </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em>#boolean:</em>
true is LOS, false if no LOS.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DETECTION_BASE).IdentifyDetectedObject" >
<strong>DETECTION_BASE:IdentifyDetectedObject(DetectedObject)</strong>
</a>
@ -5063,8 +5145,8 @@ Message formatting settings to use.</p>
</ul>
<h3>Return value</h3>
<p><em>#string:</em></p>
<p><em><a href="Core.Report.html##(REPORT)">Core.Report#REPORT</a>:</em>
The report of the detection items.</p>
</dd>
</dl>
@ -5137,6 +5219,32 @@ The Changes text</p>
<dl class="function">
<dt>
<a id="#(DETECTION_TYPES).GetDetectedItemCoordinate" >
<strong>DETECTION_TYPES:GetDetectedItemCoordinate(DetectedTypeName)</strong>
</a>
</dt>
<dd>
<p>Get the detected item coordinate.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> DetectedTypeName </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(Core.Point)">#Core.Point</a>:</em>
COORDINATE</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DETECTION_TYPES).New" >
<strong>DETECTION_TYPES:New(DetectionSetGroup)</strong>
</a>
@ -5345,8 +5453,8 @@ Message formatting settings to use.</p>
</ul>
<h3>Return value</h3>
<p><em>#string:</em></p>
<p><em><a href="Core.Report.html##(REPORT)">Core.Report#REPORT</a>:</em>
The report of the detection items.</p>
</dd>
</dl>
@ -5415,6 +5523,32 @@ The group to generate the report for.</p>
<p><em>#string:</em>
The Changes text</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DETECTION_UNITS).GetDetectedItemCoordinate" >
<strong>DETECTION_UNITS:GetDetectedItemCoordinate(Index)</strong>
</a>
</dt>
<dd>
<p>Get the detected item coordinate.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> Index </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="Core.Point.html##(COORDINATE)">Core.Point#COORDINATE</a>:</em></p>
</dd>
</dl>
<dl class="function">

View File

@ -1598,7 +1598,7 @@ A string defining the start state.</p>
<dl class="function">
<dt>
<em>#string</em>
<em></em>
<a id="#(FSM)._StartState" >
<strong>FSM._StartState</strong>
</a>
@ -1897,6 +1897,7 @@ A string defining the start state.</p>
<dl class="function">
<dt>
<em></em>
<a id="#(FSM).current" >
<strong>FSM.current</strong>
</a>

View File

@ -424,7 +424,7 @@ classes are derived from, in order to set commands.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(MENU_GROUP).RemoveSubMenus">MENU_GROUP:RemoveSubMenus(MenuTime, MenuTag, Menutag)</a></td>
<td class="name" nowrap="nowrap"><a href="##(MENU_GROUP).RemoveSubMenus">MENU_GROUP:RemoveSubMenus(MenuTime, MenuTag)</a></td>
<td class="summary">
<p>Removes the sub menus recursively of this MENU_GROUP.</p>
</td>
@ -1619,7 +1619,7 @@ A Tag or Key to filter the menus to be refreshed with the Tag set.</p>
<dt>
<a id="#(MENU_GROUP).RemoveSubMenus" >
<strong>MENU_GROUP:RemoveSubMenus(MenuTime, MenuTag, Menutag)</strong>
<strong>MENU_GROUP:RemoveSubMenus(MenuTime, MenuTag)</strong>
</a>
</dt>
<dd>
@ -1638,11 +1638,6 @@ A Tag or Key to filter the menus to be refreshed with the Tag set.</p>
<p><code><em> MenuTag </em></code>:
A Tag or Key to filter the menus to be refreshed with the Tag set.</p>
</li>
<li>
<p><code><em> Menutag </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
@ -1793,6 +1788,9 @@ An argument for the function.</p>
<p>self:E({Path=Path}) </p>
</dd>
</dl>
<dl class="function">

View File

@ -1828,7 +1828,6 @@ self</p>
<dl class="function">
<dt>
<em><a href="Core.Spot.html##(SPOT)">Core.Spot#SPOT</a></em>
<a id="#(POSITIONABLE).Spot" >
<strong>POSITIONABLE.Spot</strong>
</a>

View File

@ -1142,7 +1142,7 @@ true if metric.</p>
<dl class="function">
<dt>
<em></em>
<em>#boolean</em>
<a id="#(SETTINGS).Metric" >
<strong>SETTINGS.Metric</strong>
</a>

View File

@ -822,6 +822,12 @@ and any spaces before and after the resulting name are removed.</p>
<td class="name" nowrap="nowrap"><a href="##(SPAWN)._TranslateRotate">SPAWN:_TranslateRotate(SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle)</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SPAWN).uncontrolled">SPAWN.uncontrolled</a></td>
<td class="summary">
</td>
</tr>
</table>
@ -2735,9 +2741,6 @@ when nothing was spawned.</p>
<p> Overwrite unit names by default with group name.</p>
</dd>
</dl>
<dl class="function">
@ -3739,6 +3742,20 @@ True = Continue Scheduler</p>
</li>
</ul>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(SPAWN).uncontrolled" >
<strong>SPAWN.uncontrolled</strong>
</a>
</dt>
<dd>
</dd>
</dl>

View File

@ -436,7 +436,6 @@ ptional) The name of the new static.</p>
<dl class="function">
<dt>
<em>#number</em>
<a id="#(SPAWNSTATIC).SpawnIndex" >
<strong>SPAWNSTATIC.SpawnIndex</strong>
</a>

View File

@ -765,6 +765,7 @@ true if it is lasing</p>
<dl class="function">
<dt>
<em></em>
<a id="#(SPOT).ScheduleID" >
<strong>SPOT.ScheduleID</strong>
</a>
@ -778,6 +779,7 @@ true if it is lasing</p>
<dl class="function">
<dt>
<em></em>
<a id="#(SPOT).SpotIR" >
<strong>SPOT.SpotIR</strong>
</a>
@ -791,6 +793,7 @@ true if it is lasing</p>
<dl class="function">
<dt>
<em></em>
<a id="#(SPOT).SpotLaser" >
<strong>SPOT.SpotLaser</strong>
</a>
@ -804,6 +807,7 @@ true if it is lasing</p>
<dl class="function">
<dt>
<em></em>
<a id="#(SPOT).Target" >
<strong>SPOT.Target</strong>
</a>

View File

@ -552,7 +552,7 @@ based on the tasking capabilities defined in <a href="Task.html##(TASK)">Task#TA
<dl class="function">
<dt>
<em><a href="Core.Cargo.html##(CARGO_GROUP)">Core.Cargo#CARGO_GROUP</a></em>
<em><a href="Core.Cargo.html##(CARGO)">Core.Cargo#CARGO</a></em>
<a id="#(FSM_PROCESS).Cargo" >
<strong>FSM_PROCESS.Cargo</strong>
</a>
@ -631,7 +631,7 @@ based on the tasking capabilities defined in <a href="Task.html##(TASK)">Task#TA
<dl class="function">
<dt>
<em>#number</em>
<em></em>
<a id="#(TASK_CARGO).CargoLimit" >
<strong>TASK_CARGO.CargoLimit</strong>
</a>